Merge "Revert "Revert "AudioAttributes: do not use static getVolumeControlStream""" into oc-dev
diff --git a/api/25.3.0.ignore b/api/25.3.0.ignore
new file mode 100644
index 0000000..1ef5739
--- /dev/null
+++ b/api/25.3.0.ignore
@@ -0,0 +1 @@
+3e22d56
diff --git a/api/current.txt b/api/26.0.0-SNAPSHOT.txt
similarity index 96%
rename from api/current.txt
rename to api/26.0.0-SNAPSHOT.txt
index 732f300..04d4e19 100644
--- a/api/current.txt
+++ b/api/26.0.0-SNAPSHOT.txt
@@ -1157,27 +1157,25 @@
 package android.support.media.tv {
 
   public abstract class BasePreviewProgram extends android.support.media.tv.BaseProgram {
-    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
-    method public android.net.Uri getAppLinkIntentUri();
     method public java.lang.String getAuthor();
-    method public java.lang.String getAvailability();
+    method public int getAvailability();
     method public java.lang.String getContentId();
     method public int getDurationMillis();
+    method public android.content.Intent getIntent() throws java.net.URISyntaxException;
+    method public android.net.Uri getIntentUri();
     method public long getInteractionCount();
-    method public java.lang.String getInteractionType();
+    method public int getInteractionType();
     method public java.lang.String getInternalProviderId();
     method public int getItemCount();
     method public int getLastPlaybackPositionMillis();
     method public android.net.Uri getLogoUri();
     method public java.lang.String getOfferPrice();
-    method public java.lang.String getPosterArtAspectRatio();
+    method public int getPosterArtAspectRatio();
     method public android.net.Uri getPreviewVideoUri();
     method public java.lang.String getReleaseDate();
-    method public java.lang.String getReviewRating();
-    method public java.lang.String getReviewRatingStyle();
     method public java.lang.String getStartingPrice();
-    method public java.lang.String getThumbnailAspectRatio();
-    method public java.lang.String getType();
+    method public int getThumbnailAspectRatio();
+    method public int getType();
     method public boolean isBrowsable();
     method public boolean isLive();
     method public boolean isTransient();
@@ -1186,30 +1184,28 @@
   public static abstract class BasePreviewProgram.Builder<T extends android.support.media.tv.BasePreviewProgram.Builder> extends android.support.media.tv.BaseProgram.Builder {
     ctor public BasePreviewProgram.Builder();
     ctor public BasePreviewProgram.Builder(android.support.media.tv.BasePreviewProgram);
-    method public T setAppLinkIntent(android.content.Intent);
-    method public T setAppLinkIntentUri(android.net.Uri);
     method public T setAuthor(java.lang.String);
-    method public T setAvailability(java.lang.String);
+    method public T setAvailability(int);
     method public T setContentId(java.lang.String);
     method public T setDurationMillis(int);
+    method public T setIntent(android.content.Intent);
+    method public T setIntentUri(android.net.Uri);
     method public T setInteractionCount(long);
-    method public T setInteractionType(java.lang.String);
+    method public T setInteractionType(int);
     method public T setInternalProviderId(java.lang.String);
     method public T setItemCount(int);
     method public T setLastPlaybackPositionMillis(int);
     method public T setLive(boolean);
     method public T setLogoUri(android.net.Uri);
     method public T setOfferPrice(java.lang.String);
-    method public T setPosterArtAspectRatio(java.lang.String);
+    method public T setPosterArtAspectRatio(int);
     method public T setPreviewVideoUri(android.net.Uri);
     method public T setReleaseDate(java.lang.String);
     method public T setReleaseDate(java.util.Date);
-    method public T setReviewRating(java.lang.String);
-    method public T setReviewRatingStyle(java.lang.String);
     method public T setStartingPrice(java.lang.String);
-    method public T setThumbnailAspectRatio(java.lang.String);
+    method public T setThumbnailAspectRatio(int);
     method public T setTransient(boolean);
-    method public T setType(java.lang.String);
+    method public T setType(int);
   }
 
   public abstract class BaseProgram {
@@ -1227,6 +1223,8 @@
     method public java.lang.Long getInternalProviderFlag4();
     method public java.lang.String getLongDescription();
     method public android.net.Uri getPosterArtUri();
+    method public java.lang.String getReviewRating();
+    method public int getReviewRatingStyle();
     method public java.lang.String getSeasonNumber();
     method public java.lang.String getSeasonTitle();
     method public android.net.Uri getThumbnailUri();
@@ -1255,6 +1253,8 @@
     method public T setInternalProviderFlag4(long);
     method public T setLongDescription(java.lang.String);
     method public T setPosterArtUri(android.net.Uri);
+    method public T setReviewRating(java.lang.String);
+    method public T setReviewRatingStyle(int);
     method public T setSearchable(boolean);
     method public T setSeasonNumber(int);
     method public T setSeasonNumber(java.lang.String, int);
@@ -1283,6 +1283,7 @@
     method public java.lang.Long getInternalProviderFlag2();
     method public java.lang.Long getInternalProviderFlag3();
     method public java.lang.Long getInternalProviderFlag4();
+    method public java.lang.String getInternalProviderId();
     method public java.lang.String getNetworkAffiliation();
     method public int getOriginalNetworkId();
     method public java.lang.String getPackageName();
@@ -1318,6 +1319,7 @@
     method public android.support.media.tv.Channel.Builder setInternalProviderFlag2(long);
     method public android.support.media.tv.Channel.Builder setInternalProviderFlag3(long);
     method public android.support.media.tv.Channel.Builder setInternalProviderFlag4(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderId(java.lang.String);
     method public android.support.media.tv.Channel.Builder setNetworkAffiliation(java.lang.String);
     method public android.support.media.tv.Channel.Builder setOriginalNetworkId(int);
     method public android.support.media.tv.Channel.Builder setSearchable(boolean);
@@ -1392,96 +1394,18 @@
     method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
     method public static boolean isChannelUriForTunerInput(android.net.Uri);
     method public static boolean isProgramUri(android.net.Uri);
-    field public static final java.lang.String ACTION_MAKE_CHANNEL_BROWSABLE = "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
+    method public static void requestChannelBrowsable(android.content.Context, long);
+    field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
     field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
     field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
     field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
     field public static final java.lang.String AUTHORITY = "android.media.tv";
     field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
-    field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
     field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
     field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
   }
 
-  public static abstract interface TvContractCompat.BasePreviewProgramColumns implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
-    field public static final java.lang.String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
-    field public static final java.lang.String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
-    field public static final java.lang.String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
-    field public static final java.lang.String ASPECT_RATIO_3_2 = "ASPECT_RATIO_3_2";
-    field public static final java.lang.String AVAILABILITY_AVAILABLE = "AVAILABILITY_AVAILABLE";
-    field public static final java.lang.String AVAILABILITY_FREE_WITH_SUBSCRIPTION = "AVAILABILITY_FREE_WITH_SUBSCRIPTION";
-    field public static final java.lang.String AVAILABILITY_PAID_CONTENT = "AVAILABILITY_PAID_CONTENT";
-    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
-    field public static final java.lang.String COLUMN_AUTHOR = "author";
-    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
-    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
-    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
-    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
-    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
-    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
-    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
-    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
-    field public static final java.lang.String COLUMN_LIVE = "live";
-    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
-    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
-    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
-    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
-    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
-    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
-    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
-    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
-    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
-    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
-    field public static final java.lang.String COLUMN_TYPE = "type";
-    field public static final java.lang.String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
-    field public static final java.lang.String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
-    field public static final java.lang.String INTERACTION_TYPE_LIKES = "INTERACTION_TYPE_LIKES";
-    field public static final java.lang.String INTERACTION_TYPE_LISTENS = "INTERACTION_TYPE_LISTENS";
-    field public static final java.lang.String INTERACTION_TYPE_THUMBS = "INTERACTION_TYPE_THUMBS";
-    field public static final java.lang.String INTERACTION_TYPE_VIEWERS = "INTERACTION_TYPE_VIEWERS";
-    field public static final java.lang.String INTERACTION_TYPE_VIEWS = "INTERACTION_TYPE_VIEWS";
-    field public static final java.lang.String REVIEW_RATING_STYLE_PERCENTAGE = "REVIEW_RATING_STYLE_PERCENTAGE";
-    field public static final java.lang.String REVIEW_RATING_STYLE_STARS = "REVIEW_RATING_STYLE_STARS";
-    field public static final java.lang.String REVIEW_RATING_STYLE_THUMBS_UP_DOWN = "REVIEW_RATING_STYLE_THUMBS_UP_DOWN";
-    field public static final java.lang.String TYPE_ALBUM = "TYPE_ALBUM";
-    field public static final java.lang.String TYPE_ARTIST = "TYPE_ARTIST";
-    field public static final java.lang.String TYPE_CHANNEL = "TYPE_CHANNEL";
-    field public static final java.lang.String TYPE_CLIP = "TYPE_CLIP";
-    field public static final java.lang.String TYPE_EVENT = "TYPE_EVENT";
-    field public static final java.lang.String TYPE_MOVIE = "TYPE_MOVIE";
-    field public static final java.lang.String TYPE_PLAYLIST = "TYPE_PLAYLIST";
-    field public static final java.lang.String TYPE_STATION = "TYPE_STATION";
-    field public static final java.lang.String TYPE_TRACK = "TYPE_TRACK";
-    field public static final java.lang.String TYPE_TV_EPISODE = "TYPE_TV_EPISODE";
-    field public static final java.lang.String TYPE_TV_SEASON = "TYPE_TV_SEASON";
-    field public static final java.lang.String TYPE_TV_SERIES = "TYPE_TV_SERIES";
-  }
-
-  public static abstract interface TvContractCompat.BaseProgramColumns implements android.support.media.tv.TvContractCompat.BaseTvColumns {
-    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
-    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
-    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
-    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
-    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
-    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
-    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
-    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
-    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
-    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
-    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
-    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
-    field public static final java.lang.String COLUMN_TITLE = "title";
-    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
-    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
-    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
-  }
-
   public static abstract interface TvContractCompat.BaseTvColumns {
     field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
   }
@@ -1568,25 +1492,125 @@
     field public static final java.lang.String CONTENT_DIRECTORY = "logo";
   }
 
-  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BasePreviewProgramColumns {
+  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
     field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
     field public static final java.lang.String COLUMN_WEIGHT = "weight";
     field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
     field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
     field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
   }
 
-  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
+  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
     field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
     field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
     field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
     field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
     field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
     field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
     field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
     field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
     field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
     field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
   }
 
   public static final class TvContractCompat.Programs.Genres {
@@ -1612,38 +1636,138 @@
     field public static final java.lang.String TRAVEL = "TRAVEL";
   }
 
-  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
+  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
     field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
     field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
     field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
     field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
     field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
     field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
     field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
     field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
     field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
     field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
     field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
     field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
   }
 
-  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BasePreviewProgramColumns {
+  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
     ctor public TvContractCompat.WatchNextPrograms();
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
     field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
     field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
     field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
     field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
     field public static final android.net.Uri CONTENT_URI;
-    field public static final java.lang.String WATCH_NEXT_TYPE_CONTINUE = "WATCH_NEXT_TYPE_CONTINUE";
-    field public static final java.lang.String WATCH_NEXT_TYPE_NEW = "WATCH_NEXT_TYPE_NEW";
-    field public static final java.lang.String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
-    field public static final java.lang.String WATCH_NEXT_TYPE_WATCHLIST = "WATCH_NEXT_TYPE_WATCHLIST";
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_CONTINUE = 0; // 0x0
+    field public static final int WATCH_NEXT_TYPE_NEW = 2; // 0x2
+    field public static final int WATCH_NEXT_TYPE_NEXT = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_WATCHLIST = 3; // 0x3
   }
 
   public final class WatchNextProgram extends android.support.media.tv.BasePreviewProgram {
     method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
     method public long getLastEngagementTimeUtcMillis();
-    method public java.lang.String getWatchNextType();
+    method public int getWatchNextType();
   }
 
   public static final class WatchNextProgram.Builder extends android.support.media.tv.BasePreviewProgram.Builder {
@@ -1651,7 +1775,7 @@
     ctor public WatchNextProgram.Builder(android.support.media.tv.WatchNextProgram);
     method public android.support.media.tv.WatchNextProgram build();
     method public android.support.media.tv.WatchNextProgram.Builder setLastEngagementTimeUtcMillis(long);
-    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(java.lang.String);
+    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(int);
   }
 
 }
@@ -2888,12 +3012,16 @@
 
   public abstract class OnboardingFragment extends android.app.Fragment {
     ctor public OnboardingFragment();
+    method public final int getArrowBackgroundColor();
     method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
     method public final int getIconResourceId();
     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 public final int getTitleViewTextColor();
     method protected final boolean isLogoAnimationFinished();
     method protected void moveToNextPage();
     method protected void moveToPreviousPage();
@@ -2908,18 +3036,27 @@
     method protected void onLogoAnimationFinished();
     method protected void onPageChanged(int, int);
     method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
     method public final void setIconResouceId(int);
     method public final void setLogoResourceId(int);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
   }
 
   public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
     ctor public OnboardingSupportFragment();
+    method public final int getArrowBackgroundColor();
     method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
     method public final int getIconResourceId();
     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 public final int getTitleViewTextColor();
     method protected final boolean isLogoAnimationFinished();
     method protected void moveToNextPage();
     method protected void moveToPreviousPage();
@@ -2934,8 +3071,13 @@
     method protected void onLogoAnimationFinished();
     method protected void onPageChanged(int, int);
     method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
     method public final void setIconResouceId(int);
     method public final void setLogoResourceId(int);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
   }
 
   public abstract deprecated class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
@@ -5355,6 +5497,7 @@
     method public final android.support.v4.app.FragmentManager getFragmentManager();
     method public final java.lang.Object getHost();
     method public final int getId();
+    method public final android.view.LayoutInflater getLayoutInflater();
     method public android.support.v4.app.LoaderManager getLoaderManager();
     method public final android.support.v4.app.Fragment getParentFragment();
     method public java.lang.Object getReenterTransition();
@@ -5558,7 +5701,7 @@
     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 java.util.Collection<android.support.v4.app.Fragment> getFragments();
+    method public abstract java.util.List<android.support.v4.app.Fragment> getFragments();
     method public abstract android.support.v4.app.Fragment getPrimaryNavigationFragment();
     method public abstract boolean isDestroyed();
     method public abstract boolean isStateSaved();
@@ -5719,13 +5862,19 @@
     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 int getBadgeIconType(android.app.Notification);
     method public static java.lang.String getCategory(android.app.Notification);
     method public static java.lang.String getChannel(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 getShortcutId(android.app.Notification);
     method public static java.lang.String getSortKey(android.app.Notification);
+    method public static long getTimeout(android.app.Notification);
     method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
     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";
@@ -5872,6 +6021,7 @@
     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 setBadgeIconType(int);
     method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
     method public android.support.v4.app.NotificationCompat.Builder setChannel(java.lang.String);
     method public android.support.v4.app.NotificationCompat.Builder setColor(int);
@@ -5899,6 +6049,7 @@
     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 setShortcutId(java.lang.String);
     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);
@@ -5909,6 +6060,7 @@
     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 setTimeout(long);
     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);
@@ -6262,6 +6414,7 @@
     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);
     method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
   }
 
   public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
@@ -6393,7 +6546,7 @@
     method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
   }
 
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
+  public abstract deprecated 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);
@@ -6422,8 +6575,9 @@
     method public android.support.v4.content.pm.ShortcutInfoCompat build();
     method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
     method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(java.lang.CharSequence);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.graphics.Bitmap);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(int);
+    method public deprecated android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.graphics.Bitmap);
+    method public deprecated android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(int);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.support.v4.graphics.drawable.IconCompat);
     method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
     method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
     method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setLongLabel(java.lang.CharSequence);
@@ -6500,6 +6654,22 @@
     method public static boolean hasGlyph(android.graphics.Paint, java.lang.String);
   }
 
+  public class TypefaceCompat {
+    method public static void create(android.content.Context, android.support.v4.graphics.fonts.FontRequest, android.support.v4.graphics.TypefaceCompat.FontRequestCallback);
+  }
+
+  public static abstract class TypefaceCompat.FontRequestCallback {
+    ctor public TypefaceCompat.FontRequestCallback();
+    method public abstract void onTypefaceRequestFailed(int);
+    method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
 }
 
 package android.support.v4.graphics.drawable {
@@ -6525,6 +6695,15 @@
     method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
+  public class IconCompat {
+    method public static android.support.v4.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(java.lang.String);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithResource(android.content.Context, int);
+  }
+
   public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
     method public void draw(android.graphics.Canvas);
     method public final android.graphics.Bitmap getBitmap();
@@ -6555,6 +6734,21 @@
 
 }
 
+package android.support.v4.graphics.fonts {
+
+  public final class FontRequest implements android.os.Parcelable {
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+    method public int describeContents();
+    method public java.util.List<java.util.List<byte[]>> getCertificates();
+    method public java.lang.String getProviderAuthority();
+    method public java.lang.String getProviderPackage();
+    method public java.lang.String getQuery();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.graphics.fonts.FontRequest> CREATOR;
+  }
+
+}
+
 package android.support.v4.hardware.display {
 
   public abstract class DisplayManagerCompat {
@@ -6666,6 +6860,7 @@
     method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
     method public boolean isConnected();
     method public void search(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SearchCallback);
+    method public void sendCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.CustomActionCallback);
     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);
@@ -6681,6 +6876,13 @@
     method public void onConnectionSuspended();
   }
 
+  public static abstract class MediaBrowserCompat.CustomActionCallback {
+    ctor public MediaBrowserCompat.CustomActionCallback();
+    method public void onError(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onProgressUpdate(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onResult(java.lang.String, android.os.Bundle, android.os.Bundle);
+  }
+
   public static abstract class MediaBrowserCompat.ItemCallback {
     ctor public MediaBrowserCompat.ItemCallback();
     method public void onError(java.lang.String);
@@ -6725,6 +6927,7 @@
     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 void onCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<android.os.Bundle>);
     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);
@@ -6746,6 +6949,8 @@
 
   public static class MediaBrowserServiceCompat.Result<T> {
     method public void detach();
+    method public void sendError(android.os.Bundle);
+    method public void sendProgressUpdate(android.os.Bundle);
     method public void sendResult(T);
   }
 
@@ -6899,7 +7104,7 @@
     ctor public MediaButtonReceiver();
     method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, long);
     method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, android.content.ComponentName, long);
-    method public static deprecated android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
+    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);
   }
 
@@ -7231,9 +7436,11 @@
   }
 
   public class BuildCompat {
-    method public static boolean isAtLeastN();
-    method public static boolean isAtLeastNMR1();
+    method public static deprecated boolean isAtLeastN();
+    method public static deprecated boolean isAtLeastNMR1();
     method public static boolean isAtLeastO();
+    method public static boolean isAtLeastOMR1();
+    method public static boolean isAtLeastP();
   }
 
   public final class CancellationSignal {
@@ -7335,6 +7542,22 @@
     method public abstract boolean renameTo(java.lang.String);
   }
 
+  public class FontsContract {
+  }
+
+  public static final class FontsContract.Columns {
+    ctor public FontsContract.Columns();
+    field public static final java.lang.String ITALIC = "font_italic";
+    field public static final java.lang.String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final java.lang.String TTC_INDEX = "font_ttc_index";
+    field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final java.lang.String WEIGHT = "font_weight";
+  }
+
 }
 
 package android.support.v4.text {
@@ -7752,9 +7975,11 @@
     method public static deprecated boolean expandActionView(android.view.MenuItem);
     method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
     method public static deprecated android.view.View getActionView(android.view.MenuItem);
-    method public int getAlphabeticModifiers(android.view.MenuItem);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
     method public static java.lang.CharSequence getContentDescription(android.view.MenuItem);
-    method public int getNumericModifiers(android.view.MenuItem);
+    method public static android.content.res.ColorStateList getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
     method public static java.lang.CharSequence getTooltipText(android.view.MenuItem);
     method public static deprecated boolean isActionViewExpanded(android.view.MenuItem);
     method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
@@ -7762,6 +7987,8 @@
     method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, int);
     method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
     method public static void setContentDescription(android.view.MenuItem, java.lang.CharSequence);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode);
     method public static void setNumericShortcut(android.view.MenuItem, char, int);
     method public static deprecated android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
     method public static void setShortcut(android.view.MenuItem, char, char, int, int);
@@ -7975,8 +8202,10 @@
   }
 
   public final class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
+    method public static deprecated boolean isQuickScaleEnabled(java.lang.Object);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method public static deprecated void setQuickScaleEnabled(java.lang.Object, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
   }
 
   public abstract interface ScrollingView {
@@ -8002,6 +8231,7 @@
 
   public class ViewCompat {
     ctor protected ViewCompat();
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View>, int);
     method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
     method public static deprecated boolean canScrollHorizontally(android.view.View, int);
     method public static deprecated boolean canScrollVertically(android.view.View, int);
@@ -8033,6 +8263,7 @@
     method public static deprecated 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 getNextClusterForwardId(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);
@@ -8059,14 +8290,17 @@
     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 isFocusedByDefault(android.view.View);
     method public static boolean isImportantForAccessibility(android.view.View);
     method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(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 deprecated void jumpDrawablesToCurrentState(android.view.View);
+    method public static android.view.View keyboardNavigationClusterSearch(android.view.View, android.view.View, int);
     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);
@@ -8080,6 +8314,7 @@
     method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
     method public static void requestApplyInsets(android.view.View);
     method public static deprecated int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
     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 deprecated void setActivated(android.view.View, boolean);
@@ -8091,13 +8326,16 @@
     method public static void setClipBounds(android.view.View, android.graphics.Rect);
     method public static void setElevation(android.view.View, float);
     method public static deprecated void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setFocusedByDefault(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 setKeyboardNavigationCluster(android.view.View, boolean);
     method public static void setLabelFor(android.view.View, int);
     method public static void setLayerPaint(android.view.View, android.graphics.Paint);
     method public static deprecated 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 setNextClusterForwardId(android.view.View, int);
     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);
@@ -8384,17 +8622,17 @@
   }
 
   public final class AccessibilityManagerCompat {
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static deprecated boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
     method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
-    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.AccessibilityStateChangeListener);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
     method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
   }
 
-  public static abstract interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
-    method public abstract void onAccessibilityStateChanged(boolean);
+  public static abstract deprecated interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method public abstract deprecated void onAccessibilityStateChanged(boolean);
   }
 
   public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
@@ -8954,7 +9192,8 @@
   }
 
   public final class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+    method public static deprecated android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+    method public static android.view.View.OnTouchListener createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
   }
 
   public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
@@ -9531,10 +9770,11 @@
   public abstract class AppCompatDelegate {
     method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
     method public abstract boolean applyDayNight();
+    method public abstract boolean checkActionBarFocusKey(android.view.KeyEvent);
     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 abstract <T extends android.view.View> T findViewById(int);
     method public static int getDefaultNightMode();
     method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
     method public abstract android.view.MenuInflater getMenuInflater();
@@ -10356,8 +10596,10 @@
     method public final int getWidgetLayoutResource();
     method public boolean hasKey();
     method public boolean isEnabled();
+    method public boolean isIconSpaceReserved();
     method public boolean isPersistent();
     method public boolean isSelectable();
+    method public boolean isSingleLineTitle();
     method public final boolean isVisible();
     method protected void notifyChanged();
     method public void notifyDependencyChange(boolean);
@@ -10389,6 +10631,7 @@
     method public void setFragment(java.lang.String);
     method public void setIcon(android.graphics.drawable.Drawable);
     method public void setIcon(int);
+    method public void setIconSpaceReserved(boolean);
     method public void setIntent(android.content.Intent);
     method public void setKey(java.lang.String);
     method public void setLayoutResource(int);
@@ -10399,6 +10642,7 @@
     method public void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
     method public void setSelectable(boolean);
     method public void setShouldDisableView(boolean);
+    method public void setSingleLineTitle(boolean);
     method public void setSummary(java.lang.CharSequence);
     method public void setSummary(int);
     method public void setTitle(java.lang.CharSequence);
@@ -11097,7 +11341,6 @@
     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 deprecated int getInitialItemPrefetchCount();
     method public int getInitialPrefetchItemCount();
     method public int getOrientation();
     method public boolean getRecycleChildrenOnDetach();
@@ -12161,7 +12404,7 @@
 
 }
 
-package android.support.wearable.view {
+package android.support.wearable.widget {
 
   public class BoxInsetLayout extends android.view.ViewGroup {
     ctor public BoxInsetLayout(android.content.Context);
@@ -12178,7 +12421,7 @@
     ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
     ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
     ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public BoxInsetLayout.LayoutParams(android.support.wearable.view.BoxInsetLayout.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.support.wearable.widget.BoxInsetLayout.LayoutParams);
     field public static final int BOX_ALL = 15; // 0xf
     field public static final int BOX_BOTTOM = 8; // 0x8
     field public static final int BOX_LEFT = 1; // 0x1
@@ -12188,10 +12431,10 @@
     field public int boxedEdges;
   }
 
-  public class CurvedOffsettingLayoutManager extends android.support.wearable.view.WearableRecyclerView.OffsettingLayoutManager {
-    ctor public CurvedOffsettingLayoutManager(android.content.Context);
+  public class CurvingLayoutCallback extends android.support.wearable.widget.WearableLinearLayoutManager.LayoutCallback {
+    ctor public CurvingLayoutCallback(android.content.Context);
     method public void adjustAnchorOffsetXY(android.view.View, float[]);
-    method public void updateChild(android.view.View, android.support.wearable.view.WearableRecyclerView);
+    method public void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
   }
 
   public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
@@ -12199,16 +12442,27 @@
     ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet);
     ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int);
     ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int, int);
-    method public void addCallback(android.support.wearable.view.SwipeDismissFrameLayout.Callback);
-    method public void removeCallback(android.support.wearable.view.SwipeDismissFrameLayout.Callback);
-    method public void reset();
+    method public void addCallback(android.support.wearable.widget.SwipeDismissFrameLayout.Callback);
+    method public void removeCallback(android.support.wearable.widget.SwipeDismissFrameLayout.Callback);
   }
 
   public static abstract class SwipeDismissFrameLayout.Callback {
     ctor public SwipeDismissFrameLayout.Callback();
-    method public void onDismissed(android.support.wearable.view.SwipeDismissFrameLayout);
-    method public void onSwipeCancelled();
-    method public void onSwipeStarted();
+    method public void onDismissed(android.support.wearable.widget.SwipeDismissFrameLayout);
+    method public void onSwipeCanceled(android.support.wearable.widget.SwipeDismissFrameLayout);
+    method public void onSwipeStarted(android.support.wearable.widget.SwipeDismissFrameLayout);
+  }
+
+  public class WearableLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public WearableLinearLayoutManager(android.content.Context, android.support.wearable.widget.WearableLinearLayoutManager.LayoutCallback);
+    ctor public WearableLinearLayoutManager(android.content.Context);
+    method public android.support.wearable.widget.WearableLinearLayoutManager.LayoutCallback getLayoutCallback();
+    method public void setLayoutCallback(android.support.wearable.widget.WearableLinearLayoutManager.LayoutCallback);
+  }
+
+  public static abstract class WearableLinearLayoutManager.LayoutCallback {
+    ctor public WearableLinearLayoutManager.LayoutCallback();
+    method public abstract void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
   }
 
   public class WearableRecyclerView extends android.support.v7.widget.RecyclerView {
@@ -12216,20 +12470,15 @@
     ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet);
     ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int);
     ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int, int);
-    method public float getBezelWidthFraction();
-    method public boolean getEdgeItemsCenteringEnabled();
+    method public float getBezelFraction();
     method public float getScrollDegreesPerScreen();
     method public boolean isCircularScrollingGestureEnabled();
-    method public void setBezelWidthFraction(float);
+    method public boolean isEdgeItemsCenteringEnabled();
+    method public void setBezelFraction(float);
     method public void setCircularScrollingGestureEnabled(boolean);
     method public void setEdgeItemsCenteringEnabled(boolean);
     method public void setScrollDegreesPerScreen(float);
   }
 
-  public static abstract class WearableRecyclerView.OffsettingLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public WearableRecyclerView.OffsettingLayoutManager(android.content.Context);
-    method public abstract void updateChild(android.view.View, android.support.wearable.view.WearableRecyclerView);
-  }
-
 }
 
diff --git a/api/26.0.0.txt b/api/26.0.0.txt
deleted file mode 100644
index 8808f3b..0000000
--- a/api/26.0.0.txt
+++ /dev/null
@@ -1,12156 +0,0 @@
-package android.support.animation {
-
-  public abstract class DynamicAnimation<T extends android.support.animation.DynamicAnimation<T>> {
-    method public T addEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
-    method public T addUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
-    method public void cancel();
-    method public boolean isRunning();
-    method public void removeEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
-    method public void removeUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
-    method public T setMaxValue(float);
-    method public T setMinValue(float);
-    method public T setStartValue(float);
-    method public T setStartVelocity(float);
-    method public void start();
-    field public static final android.support.animation.DynamicAnimation.ViewProperty ALPHA;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_X;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_Y;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_X;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_Y;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_X;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_Y;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_X;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Y;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Z;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty X;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty Y;
-    field public static final android.support.animation.DynamicAnimation.ViewProperty Z;
-  }
-
-  public static abstract interface DynamicAnimation.OnAnimationEndListener {
-    method public abstract void onAnimationEnd(android.support.animation.DynamicAnimation, boolean, float, float);
-  }
-
-  public static abstract interface DynamicAnimation.OnAnimationUpdateListener {
-    method public abstract void onAnimationUpdate(android.support.animation.DynamicAnimation, float, float);
-  }
-
-  public static abstract class DynamicAnimation.ViewProperty {
-  }
-
-  public final class SpringAnimation extends android.support.animation.DynamicAnimation {
-    ctor public SpringAnimation(android.view.View, android.support.animation.DynamicAnimation.ViewProperty);
-    ctor public SpringAnimation(android.view.View, android.support.animation.DynamicAnimation.ViewProperty, float);
-    method public void animateToFinalPosition(float);
-    method public boolean canSkipToEnd();
-    method public android.support.animation.SpringForce getSpring();
-    method public android.support.animation.SpringAnimation setSpring(android.support.animation.SpringForce);
-    method public void skipToEnd();
-  }
-
-  public final class SpringForce {
-    ctor public SpringForce();
-    ctor public SpringForce(float);
-    method public float getDampingRatio();
-    method public float getFinalPosition();
-    method public float getStiffness();
-    method public android.support.animation.SpringForce setDampingRatio(float);
-    method public android.support.animation.SpringForce setFinalPosition(float);
-    method public android.support.animation.SpringForce setStiffness(float);
-    field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
-    field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
-    field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
-    field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
-    field public static final float STIFFNESS_HIGH = 10000.0f;
-    field public static final float STIFFNESS_LOW = 200.0f;
-    field public static final float STIFFNESS_MEDIUM = 1500.0f;
-    field public static final float STIFFNESS_VERY_LOW = 50.0f;
-  }
-
-}
-
-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 onMessageChannelReady(android.os.Bundle);
-    method public void onNavigationEvent(int, android.os.Bundle);
-    method public void onPostMessage(java.lang.String, 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.content.Context, android.net.Uri);
-    method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent);
-    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
-    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_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
-    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 setInstantAppsEnabled(boolean);
-    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 int postMessage(android.support.customtabs.CustomTabsSessionToken, java.lang.String, android.os.Bundle);
-    method protected abstract boolean requestPostMessageChannel(android.support.customtabs.CustomTabsSessionToken, android.net.Uri);
-    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";
-    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
-    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
-    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-  public static abstract class CustomTabsService.Result implements java.lang.annotation.Annotation {
-  }
-
-  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 int postMessage(java.lang.String, android.os.Bundle);
-    method public boolean requestPostMessageChannel(android.net.Uri);
-    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);
-    method public boolean isAssociatedWith(android.support.customtabs.CustomTabsSession);
-  }
-
-  public class PostMessageService extends android.app.Service {
-    ctor public PostMessageService();
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
-    ctor public PostMessageServiceConnection(android.support.customtabs.CustomTabsSessionToken);
-    method public boolean bindSessionToPostMessageService(android.content.Context, java.lang.String);
-    method public final boolean notifyMessageChannelReady(android.os.Bundle);
-    method public void onPostMessageServiceConnected();
-    method public void onPostMessageServiceDisconnected();
-    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
-    method public final void onServiceDisconnected(android.content.ComponentName);
-    method public final boolean postMessage(java.lang.String, android.os.Bundle);
-    method public void unbindFromContext(android.content.Context);
-  }
-
-}
-
-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);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
-  }
-
-  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
-    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
-    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public void dismiss();
-    method public android.content.Context getContext();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public B setDuration(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 BaseTransientBottomBar.BaseCallback<B> {
-    ctor public BaseTransientBottomBar.BaseCallback();
-    method public void onDismissed(B, int);
-    method public void onShown(B);
-    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 static abstract interface BaseTransientBottomBar.ContentViewCallback {
-    method public abstract void animateContentIn(int, int);
-    method public abstract void animateContentOut(int, int);
-  }
-
-  public class BottomNavigationView extends android.widget.FrameLayout {
-    ctor public BottomNavigationView(android.content.Context);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public int getItemBackgroundResource();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public int getMaxItemCount();
-    method public android.view.Menu getMenu();
-    method public int getSelectedItemId();
-    method public void inflateMenu(int);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
-    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
-    method public void setSelectedItemId(int);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
-    method public abstract void onNavigationItemReselected(android.view.MenuItem);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public BottomSheetBehavior();
-    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
-    method public static <V extends android.view.View> 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 PEEK_HEIGHT_AUTO = -1; // 0xffffffff
-    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 setCollapsedTitleTextColor(android.content.res.ColorStateList);
-    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 setExpandedTitleTextColor(android.content.res.ColorStateList);
-    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 java.util.List<android.view.View> getDependents(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<V extends android.view.View> {
-    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 boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
-    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 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 void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    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 void onDetachedFromLayoutParams();
-    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 boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
-    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 dodgeInsetEdges;
-    field public int gravity;
-    field public int insetEdge;
-    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 getRippleColor();
-    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 getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
-    method public boolean isAutoHideEnabled();
-    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);
-    method public void setAutoHideEnabled(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<V extends android.view.View> 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 extends android.support.design.widget.BaseTransientBottomBar {
-    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 deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    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 class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
-    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<V extends android.view.View> 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 void clearOnTabSelectedListeners();
-    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 java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
-    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isCounterEnabled();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public boolean isHintEnabled();
-    method public boolean isPasswordVisibilityToggleEnabled();
-    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 setErrorTextAppearance(int);
-    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 setPasswordVisibilityToggleContentDescription(int);
-    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
-    method public void setPasswordVisibilityToggleDrawable(int);
-    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
-    method public void setPasswordVisibilityToggleEnabled(boolean);
-    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
-    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior<V extends android.view.View> 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 abstract interface Animatable2Compat {
-    method public abstract void clearAnimationCallbacks();
-    method public abstract void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-    method public abstract boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-  }
-
-  public static abstract class Animatable2Compat.AnimationCallback {
-    ctor public Animatable2Compat.AnimationCallback();
-    method public void onAnimationEnd(android.graphics.drawable.Drawable);
-    method public void onAnimationStart(android.graphics.drawable.Drawable);
-  }
-
-  public class AnimatedVectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon implements android.support.graphics.drawable.Animatable2Compat {
-    method public void clearAnimationCallbacks();
-    method public static void clearAnimationCallbacks(android.graphics.drawable.Drawable);
-    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 registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-    method public static void registerAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-    method public void setAlpha(int);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void start();
-    method public void stop();
-    method public boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-    method public static boolean unregisterAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
-  }
-
-   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.media {
-
-  public class ExifInterface {
-    ctor public ExifInterface(java.lang.String) throws java.io.IOException;
-    ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
-    method public double getAltitude(double);
-    method public java.lang.String getAttribute(java.lang.String);
-    method public double getAttributeDouble(java.lang.String, double);
-    method public int getAttributeInt(java.lang.String, int);
-    method public deprecated boolean getLatLong(float[]);
-    method public double[] getLatLong();
-    method public byte[] getThumbnail();
-    method public android.graphics.Bitmap getThumbnailBitmap();
-    method public byte[] getThumbnailBytes();
-    method public long[] getThumbnailRange();
-    method public boolean hasThumbnail();
-    method public boolean isThumbnailCompressed();
-    method public void saveAttributes() throws java.io.IOException;
-    method public void setAttribute(java.lang.String, java.lang.String);
-    method public void setLatLong(double, double);
-    field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
-    field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
-    field public static final int ORIENTATION_NORMAL = 1; // 0x1
-    field public static final int ORIENTATION_ROTATE_180 = 3; // 0x3
-    field public static final int ORIENTATION_ROTATE_270 = 8; // 0x8
-    field public static final int ORIENTATION_ROTATE_90 = 6; // 0x6
-    field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
-    field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
-    field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
-    field public static final java.lang.String TAG_APERTURE_VALUE = "ApertureValue";
-    field public static final java.lang.String TAG_ARTIST = "Artist";
-    field public static final java.lang.String TAG_BITS_PER_SAMPLE = "BitsPerSample";
-    field public static final java.lang.String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
-    field public static final java.lang.String TAG_CFA_PATTERN = "CFAPattern";
-    field public static final java.lang.String TAG_COLOR_SPACE = "ColorSpace";
-    field public static final java.lang.String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
-    field public static final java.lang.String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
-    field public static final java.lang.String TAG_COMPRESSION = "Compression";
-    field public static final java.lang.String TAG_CONTRAST = "Contrast";
-    field public static final java.lang.String TAG_COPYRIGHT = "Copyright";
-    field public static final java.lang.String TAG_CUSTOM_RENDERED = "CustomRendered";
-    field public static final java.lang.String TAG_DATETIME = "DateTime";
-    field public static final java.lang.String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
-    field public static final java.lang.String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
-    field public static final java.lang.String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
-    field public static final java.lang.String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
-    field public static final java.lang.String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
-    field public static final java.lang.String TAG_DNG_VERSION = "DNGVersion";
-    field public static final java.lang.String TAG_EXIF_VERSION = "ExifVersion";
-    field public static final java.lang.String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
-    field public static final java.lang.String TAG_EXPOSURE_INDEX = "ExposureIndex";
-    field public static final java.lang.String TAG_EXPOSURE_MODE = "ExposureMode";
-    field public static final java.lang.String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
-    field public static final java.lang.String TAG_EXPOSURE_TIME = "ExposureTime";
-    field public static final java.lang.String TAG_FILE_SOURCE = "FileSource";
-    field public static final java.lang.String TAG_FLASH = "Flash";
-    field public static final java.lang.String TAG_FLASHPIX_VERSION = "FlashpixVersion";
-    field public static final java.lang.String TAG_FLASH_ENERGY = "FlashEnergy";
-    field public static final java.lang.String TAG_FOCAL_LENGTH = "FocalLength";
-    field public static final java.lang.String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
-    field public static final java.lang.String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
-    field public static final java.lang.String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
-    field public static final java.lang.String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
-    field public static final java.lang.String TAG_F_NUMBER = "FNumber";
-    field public static final java.lang.String TAG_GAIN_CONTROL = "GainControl";
-    field public static final java.lang.String TAG_GPS_ALTITUDE = "GPSAltitude";
-    field public static final java.lang.String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
-    field public static final java.lang.String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
-    field public static final java.lang.String TAG_GPS_DATESTAMP = "GPSDateStamp";
-    field public static final java.lang.String TAG_GPS_DEST_BEARING = "GPSDestBearing";
-    field public static final java.lang.String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
-    field public static final java.lang.String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
-    field public static final java.lang.String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
-    field public static final java.lang.String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
-    field public static final java.lang.String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
-    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
-    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
-    field public static final java.lang.String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
-    field public static final java.lang.String TAG_GPS_DOP = "GPSDOP";
-    field public static final java.lang.String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
-    field public static final java.lang.String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
-    field public static final java.lang.String TAG_GPS_LATITUDE = "GPSLatitude";
-    field public static final java.lang.String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
-    field public static final java.lang.String TAG_GPS_LONGITUDE = "GPSLongitude";
-    field public static final java.lang.String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
-    field public static final java.lang.String TAG_GPS_MAP_DATUM = "GPSMapDatum";
-    field public static final java.lang.String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
-    field public static final java.lang.String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
-    field public static final java.lang.String TAG_GPS_SATELLITES = "GPSSatellites";
-    field public static final java.lang.String TAG_GPS_SPEED = "GPSSpeed";
-    field public static final java.lang.String TAG_GPS_SPEED_REF = "GPSSpeedRef";
-    field public static final java.lang.String TAG_GPS_STATUS = "GPSStatus";
-    field public static final java.lang.String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
-    field public static final java.lang.String TAG_GPS_TRACK = "GPSTrack";
-    field public static final java.lang.String TAG_GPS_TRACK_REF = "GPSTrackRef";
-    field public static final java.lang.String TAG_GPS_VERSION_ID = "GPSVersionID";
-    field public static final java.lang.String TAG_IMAGE_DESCRIPTION = "ImageDescription";
-    field public static final java.lang.String TAG_IMAGE_LENGTH = "ImageLength";
-    field public static final java.lang.String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
-    field public static final java.lang.String TAG_IMAGE_WIDTH = "ImageWidth";
-    field public static final java.lang.String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
-    field public static final java.lang.String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
-    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
-    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
-    field public static final java.lang.String TAG_LIGHT_SOURCE = "LightSource";
-    field public static final java.lang.String TAG_MAKE = "Make";
-    field public static final java.lang.String TAG_MAKER_NOTE = "MakerNote";
-    field public static final java.lang.String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
-    field public static final java.lang.String TAG_METERING_MODE = "MeteringMode";
-    field public static final java.lang.String TAG_MODEL = "Model";
-    field public static final java.lang.String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
-    field public static final java.lang.String TAG_OECF = "OECF";
-    field public static final java.lang.String TAG_ORF_ASPECT_FRAME = "AspectFrame";
-    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
-    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
-    field public static final java.lang.String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
-    field public static final java.lang.String TAG_ORIENTATION = "Orientation";
-    field public static final java.lang.String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
-    field public static final java.lang.String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
-    field public static final java.lang.String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
-    field public static final java.lang.String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
-    field public static final java.lang.String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
-    field public static final java.lang.String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
-    field public static final java.lang.String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
-    field public static final java.lang.String TAG_RESOLUTION_UNIT = "ResolutionUnit";
-    field public static final java.lang.String TAG_ROWS_PER_STRIP = "RowsPerStrip";
-    field public static final java.lang.String TAG_RW2_ISO = "ISO";
-    field public static final java.lang.String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
-    field public static final java.lang.String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
-    field public static final java.lang.String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
-    field public static final java.lang.String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
-    field public static final java.lang.String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
-    field public static final java.lang.String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
-    field public static final java.lang.String TAG_SATURATION = "Saturation";
-    field public static final java.lang.String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
-    field public static final java.lang.String TAG_SCENE_TYPE = "SceneType";
-    field public static final java.lang.String TAG_SENSING_METHOD = "SensingMethod";
-    field public static final java.lang.String TAG_SHARPNESS = "Sharpness";
-    field public static final java.lang.String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
-    field public static final java.lang.String TAG_SOFTWARE = "Software";
-    field public static final java.lang.String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
-    field public static final java.lang.String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
-    field public static final java.lang.String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
-    field public static final java.lang.String TAG_STRIP_OFFSETS = "StripOffsets";
-    field public static final java.lang.String TAG_SUBFILE_TYPE = "SubfileType";
-    field public static final java.lang.String TAG_SUBJECT_AREA = "SubjectArea";
-    field public static final java.lang.String TAG_SUBJECT_DISTANCE = "SubjectDistance";
-    field public static final java.lang.String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
-    field public static final java.lang.String TAG_SUBJECT_LOCATION = "SubjectLocation";
-    field public static final java.lang.String TAG_SUBSEC_TIME = "SubSecTime";
-    field public static final java.lang.String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
-    field public static final java.lang.String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
-    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
-    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
-    field public static final java.lang.String TAG_TRANSFER_FUNCTION = "TransferFunction";
-    field public static final java.lang.String TAG_USER_COMMENT = "UserComment";
-    field public static final java.lang.String TAG_WHITE_BALANCE = "WhiteBalance";
-    field public static final java.lang.String TAG_WHITE_POINT = "WhitePoint";
-    field public static final java.lang.String TAG_X_RESOLUTION = "XResolution";
-    field public static final java.lang.String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
-    field public static final java.lang.String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
-    field public static final java.lang.String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
-    field public static final java.lang.String TAG_Y_RESOLUTION = "YResolution";
-    field public static final int WHITEBALANCE_AUTO = 0; // 0x0
-    field public static final int WHITEBALANCE_MANUAL = 1; // 0x1
-  }
-
-}
-
-package android.support.media.tv {
-
-  public abstract class BasePreviewProgram extends android.support.media.tv.BaseProgram {
-    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
-    method public android.net.Uri getAppLinkIntentUri();
-    method public java.lang.String getAuthor();
-    method public java.lang.String getAvailability();
-    method public java.lang.String getContentId();
-    method public int getDurationMillis();
-    method public long getInteractionCount();
-    method public java.lang.String getInteractionType();
-    method public java.lang.String getInternalProviderId();
-    method public int getItemCount();
-    method public int getLastPlaybackPositionMillis();
-    method public android.net.Uri getLogoUri();
-    method public java.lang.String getOfferPrice();
-    method public java.lang.String getPosterArtAspectRatio();
-    method public android.net.Uri getPreviewVideoUri();
-    method public java.lang.String getReleaseDate();
-    method public java.lang.String getReviewRating();
-    method public java.lang.String getReviewRatingStyle();
-    method public java.lang.String getStartingPrice();
-    method public java.lang.String getThumbnailAspectRatio();
-    method public java.lang.String getType();
-    method public boolean isBrowsable();
-    method public boolean isLive();
-  }
-
-  public static abstract class BasePreviewProgram.Builder<T extends android.support.media.tv.BasePreviewProgram.Builder> extends android.support.media.tv.BaseProgram.Builder {
-    ctor public BasePreviewProgram.Builder();
-    ctor public BasePreviewProgram.Builder(android.support.media.tv.BasePreviewProgram);
-    method public T setAppLinkIntent(android.content.Intent);
-    method public T setAppLinkIntentUri(android.net.Uri);
-    method public T setAuthor(java.lang.String);
-    method public T setAvailability(java.lang.String);
-    method public T setContentId(java.lang.String);
-    method public T setDurationMillis(int);
-    method public T setInteractionCount(long);
-    method public T setInteractionType(java.lang.String);
-    method public T setInternalProviderId(java.lang.String);
-    method public T setItemCount(int);
-    method public T setLastPlaybackPositionMillis(int);
-    method public T setLive(boolean);
-    method public T setLogoUri(android.net.Uri);
-    method public T setOfferPrice(java.lang.String);
-    method public T setPosterArtAspectRatio(java.lang.String);
-    method public T setPreviewVideoUri(android.net.Uri);
-    method public T setReleaseDate(java.lang.String);
-    method public T setReleaseDate(java.util.Date);
-    method public T setReviewRating(java.lang.String);
-    method public T setReviewRatingStyle(java.lang.String);
-    method public T setStartingPrice(java.lang.String);
-    method public T setThumbnailAspectRatio(java.lang.String);
-    method public T setType(java.lang.String);
-  }
-
-  public abstract class BaseProgram {
-    method public java.lang.String[] getAudioLanguages();
-    method public java.lang.String[] getCanonicalGenres();
-    method public android.media.tv.TvContentRating[] getContentRatings();
-    method public java.lang.String getDescription();
-    method public java.lang.String getEpisodeNumber();
-    method public java.lang.String getEpisodeTitle();
-    method public long getId();
-    method public byte[] getInternalProviderDataByteArray();
-    method public java.lang.Long getInternalProviderFlag1();
-    method public java.lang.Long getInternalProviderFlag2();
-    method public java.lang.Long getInternalProviderFlag3();
-    method public java.lang.Long getInternalProviderFlag4();
-    method public java.lang.String getLongDescription();
-    method public android.net.Uri getPosterArtUri();
-    method public java.lang.String getSeasonNumber();
-    method public java.lang.String getSeasonTitle();
-    method public android.net.Uri getThumbnailUri();
-    method public java.lang.String getTitle();
-    method public int getVideoHeight();
-    method public int getVideoWidth();
-    method public boolean isSearchable();
-    method public android.content.ContentValues toContentValues();
-  }
-
-  public static abstract class BaseProgram.Builder<T extends android.support.media.tv.BaseProgram.Builder> {
-    ctor public BaseProgram.Builder();
-    ctor public BaseProgram.Builder(android.support.media.tv.BaseProgram);
-    method public T setAudioLanguages(java.lang.String[]);
-    method public T setCanonicalGenres(java.lang.String[]);
-    method public T setContentRatings(android.media.tv.TvContentRating[]);
-    method public T setDescription(java.lang.String);
-    method public T setEpisodeNumber(int);
-    method public T setEpisodeNumber(java.lang.String, int);
-    method public T setEpisodeTitle(java.lang.String);
-    method public T setId(long);
-    method public T setInternalProviderData(byte[]);
-    method public T setInternalProviderFlag1(long);
-    method public T setInternalProviderFlag2(long);
-    method public T setInternalProviderFlag3(long);
-    method public T setInternalProviderFlag4(long);
-    method public T setLongDescription(java.lang.String);
-    method public T setPosterArtUri(android.net.Uri);
-    method public T setSearchable(boolean);
-    method public T setSeasonNumber(int);
-    method public T setSeasonNumber(java.lang.String, int);
-    method public T setSeasonTitle(java.lang.String);
-    method public T setThumbnailUri(android.net.Uri);
-    method public T setTitle(java.lang.String);
-    method public T setVideoHeight(int);
-    method public T setVideoWidth(int);
-  }
-
-  public final class Channel {
-    method public static android.support.media.tv.Channel fromCursor(android.database.Cursor);
-    method public int getAppLinkColor();
-    method public android.net.Uri getAppLinkIconUri();
-    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
-    method public android.net.Uri getAppLinkIntentUri();
-    method public android.net.Uri getAppLinkPosterArtUri();
-    method public java.lang.String getAppLinkText();
-    method public java.lang.String getDescription();
-    method public java.lang.String getDisplayName();
-    method public java.lang.String getDisplayNumber();
-    method public long getId();
-    method public java.lang.String getInputId();
-    method public byte[] getInternalProviderDataByteArray();
-    method public java.lang.Long getInternalProviderFlag1();
-    method public java.lang.Long getInternalProviderFlag2();
-    method public java.lang.Long getInternalProviderFlag3();
-    method public java.lang.Long getInternalProviderFlag4();
-    method public java.lang.String getNetworkAffiliation();
-    method public int getOriginalNetworkId();
-    method public java.lang.String getPackageName();
-    method public int getServiceId();
-    method public java.lang.String getServiceType();
-    method public int getTransportStreamId();
-    method public java.lang.String getType();
-    method public java.lang.String getVideoFormat();
-    method public boolean isBrowsable();
-    method public boolean isSearchable();
-    method public android.content.ContentValues toContentValues();
-  }
-
-  public static final class Channel.Builder {
-    ctor public Channel.Builder();
-    ctor public Channel.Builder(android.support.media.tv.Channel);
-    method public android.support.media.tv.Channel build();
-    method public android.support.media.tv.Channel.Builder setAppLinkColor(int);
-    method public android.support.media.tv.Channel.Builder setAppLinkIconUri(android.net.Uri);
-    method public android.support.media.tv.Channel.Builder setAppLinkIntent(android.content.Intent);
-    method public android.support.media.tv.Channel.Builder setAppLinkIntentUri(android.net.Uri);
-    method public android.support.media.tv.Channel.Builder setAppLinkPosterArtUri(android.net.Uri);
-    method public android.support.media.tv.Channel.Builder setAppLinkText(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setDescription(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setDisplayName(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setDisplayNumber(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setInputId(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setInternalProviderData(byte[]);
-    method public android.support.media.tv.Channel.Builder setInternalProviderData(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setInternalProviderFlag1(long);
-    method public android.support.media.tv.Channel.Builder setInternalProviderFlag2(long);
-    method public android.support.media.tv.Channel.Builder setInternalProviderFlag3(long);
-    method public android.support.media.tv.Channel.Builder setInternalProviderFlag4(long);
-    method public android.support.media.tv.Channel.Builder setNetworkAffiliation(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setOriginalNetworkId(int);
-    method public android.support.media.tv.Channel.Builder setSearchable(boolean);
-    method public android.support.media.tv.Channel.Builder setServiceId(int);
-    method public android.support.media.tv.Channel.Builder setServiceType(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setTransportStreamId(int);
-    method public android.support.media.tv.Channel.Builder setType(java.lang.String);
-    method public android.support.media.tv.Channel.Builder setVideoFormat(java.lang.String);
-  }
-
-  public class ChannelLogoUtils {
-    ctor public ChannelLogoUtils();
-    method public static android.graphics.Bitmap loadChannelLogo(android.content.Context, long);
-    method public static boolean storeChannelLogo(android.content.Context, long, android.net.Uri);
-    method public static boolean storeChannelLogo(android.content.Context, long, android.graphics.Bitmap);
-  }
-
-  public final class PreviewProgram extends android.support.media.tv.BasePreviewProgram {
-    method public static android.support.media.tv.PreviewProgram fromCursor(android.database.Cursor);
-    method public long getChannelId();
-    method public int getWeight();
-  }
-
-  public static final class PreviewProgram.Builder extends android.support.media.tv.BasePreviewProgram.Builder {
-    ctor public PreviewProgram.Builder();
-    ctor public PreviewProgram.Builder(android.support.media.tv.PreviewProgram);
-    method public android.support.media.tv.PreviewProgram build();
-    method public android.support.media.tv.PreviewProgram.Builder setChannelId(long);
-    method public android.support.media.tv.PreviewProgram.Builder setWeight(int);
-  }
-
-  public final class Program extends android.support.media.tv.BaseProgram implements java.lang.Comparable {
-    method public int compareTo(android.support.media.tv.Program);
-    method public static android.support.media.tv.Program fromCursor(android.database.Cursor);
-    method public java.lang.String[] getBroadcastGenres();
-    method public long getChannelId();
-    method public long getEndTimeUtcMillis();
-    method public long getStartTimeUtcMillis();
-    method public boolean isRecordingProhibited();
-  }
-
-  public static class Program.Builder extends android.support.media.tv.BaseProgram.Builder {
-    ctor public Program.Builder();
-    ctor public Program.Builder(android.support.media.tv.Program);
-    method public android.support.media.tv.Program build();
-    method public android.support.media.tv.Program.Builder setBroadcastGenres(java.lang.String[]);
-    method public android.support.media.tv.Program.Builder setChannelId(long);
-    method public android.support.media.tv.Program.Builder setEndTimeUtcMillis(long);
-    method public android.support.media.tv.Program.Builder setRecordingProhibited(boolean);
-    method public android.support.media.tv.Program.Builder setStartTimeUtcMillis(long);
-  }
-
-  public final class TvContractCompat {
-    method public static android.net.Uri buildChannelLogoUri(long);
-    method public static android.net.Uri buildChannelLogoUri(android.net.Uri);
-    method public static android.net.Uri buildChannelUri(long);
-    method public static android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
-    method public static android.net.Uri buildChannelsUriForInput(java.lang.String);
-    method public static java.lang.String buildInputId(android.content.ComponentName);
-    method public static android.net.Uri buildPreviewProgramUri(long);
-    method public static android.net.Uri buildPreviewProgramsUriForChannel(long);
-    method public static android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
-    method public static android.net.Uri buildProgramUri(long);
-    method public static android.net.Uri buildProgramsUriForChannel(long);
-    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri);
-    method public static android.net.Uri buildProgramsUriForChannel(long, long, long);
-    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
-    method public static android.net.Uri buildRecordedProgramUri(long);
-    method public static android.net.Uri buildWatchNextProgramUri(long);
-    method public static boolean isChannelUri(android.net.Uri);
-    method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
-    method public static boolean isChannelUriForTunerInput(android.net.Uri);
-    method public static boolean isProgramUri(android.net.Uri);
-    field public static final java.lang.String ACTION_MAKE_CHANNEL_BROWSABLE = "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
-    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
-    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
-    field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
-    field public static final java.lang.String AUTHORITY = "android.media.tv";
-    field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
-    field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
-    field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
-    field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
-  }
-
-  public static abstract interface TvContractCompat.BasePreviewProgramColumns implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
-    field public static final java.lang.String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
-    field public static final java.lang.String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
-    field public static final java.lang.String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
-    field public static final java.lang.String ASPECT_RATIO_3_2 = "ASPECT_RATIO_3_2";
-    field public static final java.lang.String AVAILABILITY_AVAILABLE = "AVAILABILITY_AVAILABLE";
-    field public static final java.lang.String AVAILABILITY_FREE_WITH_SUBSCRIPTION = "AVAILABILITY_FREE_WITH_SUBSCRIPTION";
-    field public static final java.lang.String AVAILABILITY_PAID_CONTENT = "AVAILABILITY_PAID_CONTENT";
-    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
-    field public static final java.lang.String COLUMN_AUTHOR = "author";
-    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
-    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
-    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
-    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
-    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
-    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
-    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
-    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
-    field public static final java.lang.String COLUMN_LIVE = "live";
-    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
-    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
-    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
-    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
-    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
-    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
-    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
-    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
-    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
-    field public static final java.lang.String COLUMN_TYPE = "type";
-    field public static final java.lang.String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
-    field public static final java.lang.String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
-    field public static final java.lang.String INTERACTION_TYPE_LIKES = "INTERACTION_TYPE_LIKES";
-    field public static final java.lang.String INTERACTION_TYPE_LISTENS = "INTERACTION_TYPE_LISTENS";
-    field public static final java.lang.String INTERACTION_TYPE_THUMBS = "INTERACTION_TYPE_THUMBS";
-    field public static final java.lang.String INTERACTION_TYPE_VIEWERS = "INTERACTION_TYPE_VIEWERS";
-    field public static final java.lang.String INTERACTION_TYPE_VIEWS = "INTERACTION_TYPE_VIEWS";
-    field public static final java.lang.String REVIEW_RATING_STYLE_PERCENTAGE = "REVIEW_RATING_STYLE_PERCENTAGE";
-    field public static final java.lang.String REVIEW_RATING_STYLE_STARS = "REVIEW_RATING_STYLE_STARS";
-    field public static final java.lang.String REVIEW_RATING_STYLE_THUMBS_UP_DOWN = "REVIEW_RATING_STYLE_THUMBS_UP_DOWN";
-    field public static final java.lang.String TYPE_ALBUM = "TYPE_ALBUM";
-    field public static final java.lang.String TYPE_ARTIST = "TYPE_ARTIST";
-    field public static final java.lang.String TYPE_CHANNEL = "TYPE_CHANNEL";
-    field public static final java.lang.String TYPE_CLIP = "TYPE_CLIP";
-    field public static final java.lang.String TYPE_EVENT = "TYPE_EVENT";
-    field public static final java.lang.String TYPE_MOVIE = "TYPE_MOVIE";
-    field public static final java.lang.String TYPE_PLAYLIST = "TYPE_PLAYLIST";
-    field public static final java.lang.String TYPE_STATION = "TYPE_STATION";
-    field public static final java.lang.String TYPE_TRACK = "TYPE_TRACK";
-    field public static final java.lang.String TYPE_TV_EPISODE = "TYPE_TV_EPISODE";
-    field public static final java.lang.String TYPE_TV_SEASON = "TYPE_TV_SEASON";
-    field public static final java.lang.String TYPE_TV_SERIES = "TYPE_TV_SERIES";
-  }
-
-  public static abstract interface TvContractCompat.BaseProgramColumns implements android.support.media.tv.TvContractCompat.BaseTvColumns {
-    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
-    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
-    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
-    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
-    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
-    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
-    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
-    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
-    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
-    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
-    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
-    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
-    field public static final java.lang.String COLUMN_TITLE = "title";
-    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
-    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
-    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
-  }
-
-  public static abstract interface TvContractCompat.BaseTvColumns {
-    field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
-  }
-
-  public static final class TvContractCompat.Channels implements android.support.media.tv.TvContractCompat.BaseTvColumns {
-    method public static java.lang.String getVideoResolution(java.lang.String);
-    field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color";
-    field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
-    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
-    field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
-    field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text";
-    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
-    field public static final java.lang.String COLUMN_DESCRIPTION = "description";
-    field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name";
-    field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number";
-    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
-    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
-    field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
-    field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
-    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
-    field public static final java.lang.String COLUMN_SERVICE_ID = "service_id";
-    field public static final java.lang.String COLUMN_SERVICE_TYPE = "service_type";
-    field public static final java.lang.String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
-    field public static final java.lang.String COLUMN_TYPE = "type";
-    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
-    field public static final java.lang.String COLUMN_VIDEO_FORMAT = "video_format";
-    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
-    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
-    field public static final android.net.Uri CONTENT_URI;
-    field public static final java.lang.String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
-    field public static final java.lang.String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
-    field public static final java.lang.String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
-    field public static final java.lang.String TYPE_1SEG = "TYPE_1SEG";
-    field public static final java.lang.String TYPE_ATSC_C = "TYPE_ATSC_C";
-    field public static final java.lang.String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
-    field public static final java.lang.String TYPE_ATSC_T = "TYPE_ATSC_T";
-    field public static final java.lang.String TYPE_CMMB = "TYPE_CMMB";
-    field public static final java.lang.String TYPE_DTMB = "TYPE_DTMB";
-    field public static final java.lang.String TYPE_DVB_C = "TYPE_DVB_C";
-    field public static final java.lang.String TYPE_DVB_C2 = "TYPE_DVB_C2";
-    field public static final java.lang.String TYPE_DVB_H = "TYPE_DVB_H";
-    field public static final java.lang.String TYPE_DVB_S = "TYPE_DVB_S";
-    field public static final java.lang.String TYPE_DVB_S2 = "TYPE_DVB_S2";
-    field public static final java.lang.String TYPE_DVB_SH = "TYPE_DVB_SH";
-    field public static final java.lang.String TYPE_DVB_T = "TYPE_DVB_T";
-    field public static final java.lang.String TYPE_DVB_T2 = "TYPE_DVB_T2";
-    field public static final java.lang.String TYPE_ISDB_C = "TYPE_ISDB_C";
-    field public static final java.lang.String TYPE_ISDB_S = "TYPE_ISDB_S";
-    field public static final java.lang.String TYPE_ISDB_T = "TYPE_ISDB_T";
-    field public static final java.lang.String TYPE_ISDB_TB = "TYPE_ISDB_TB";
-    field public static final java.lang.String TYPE_NTSC = "TYPE_NTSC";
-    field public static final java.lang.String TYPE_OTHER = "TYPE_OTHER";
-    field public static final java.lang.String TYPE_PAL = "TYPE_PAL";
-    field public static final java.lang.String TYPE_PREVIEW = "TYPE_PREVIEW";
-    field public static final java.lang.String TYPE_SECAM = "TYPE_SECAM";
-    field public static final java.lang.String TYPE_S_DMB = "TYPE_S_DMB";
-    field public static final java.lang.String TYPE_T_DMB = "TYPE_T_DMB";
-    field public static final java.lang.String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
-    field public static final java.lang.String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
-    field public static final java.lang.String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
-    field public static final java.lang.String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
-    field public static final java.lang.String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
-    field public static final java.lang.String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
-    field public static final java.lang.String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
-    field public static final java.lang.String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
-    field public static final java.lang.String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
-    field public static final java.lang.String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
-    field public static final java.lang.String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
-    field public static final java.lang.String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
-    field public static final java.lang.String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
-    field public static final java.lang.String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
-    field public static final java.lang.String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
-    field public static final java.lang.String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
-  }
-
-  public static final class TvContractCompat.Channels.Logo {
-    field public static final java.lang.String CONTENT_DIRECTORY = "logo";
-  }
-
-  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BasePreviewProgramColumns {
-    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
-    field public static final java.lang.String COLUMN_WEIGHT = "weight";
-    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
-    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
-    field public static final android.net.Uri CONTENT_URI;
-  }
-
-  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
-    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
-    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
-    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
-    field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
-    field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
-    field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
-    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
-    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
-    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
-    field public static final android.net.Uri CONTENT_URI;
-  }
-
-  public static final class TvContractCompat.Programs.Genres {
-    method public static java.lang.String[] decode(java.lang.String);
-    method public static java.lang.String encode(java.lang.String...);
-    method public static boolean isCanonical(java.lang.String);
-    field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
-    field public static final java.lang.String ARTS = "ARTS";
-    field public static final java.lang.String COMEDY = "COMEDY";
-    field public static final java.lang.String DRAMA = "DRAMA";
-    field public static final java.lang.String EDUCATION = "EDUCATION";
-    field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
-    field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
-    field public static final java.lang.String GAMING = "GAMING";
-    field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
-    field public static final java.lang.String MOVIES = "MOVIES";
-    field public static final java.lang.String MUSIC = "MUSIC";
-    field public static final java.lang.String NEWS = "NEWS";
-    field public static final java.lang.String PREMIER = "PREMIER";
-    field public static final java.lang.String SHOPPING = "SHOPPING";
-    field public static final java.lang.String SPORTS = "SPORTS";
-    field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
-    field public static final java.lang.String TRAVEL = "TRAVEL";
-  }
-
-  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseProgramColumns {
-    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
-    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
-    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
-    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
-    field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
-    field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
-    field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
-    field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
-    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
-    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
-    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
-    field public static final android.net.Uri CONTENT_URI;
-  }
-
-  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BasePreviewProgramColumns {
-    ctor public TvContractCompat.WatchNextPrograms();
-    field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
-    field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
-    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
-    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
-    field public static final android.net.Uri CONTENT_URI;
-    field public static final java.lang.String WATCH_NEXT_TYPE_CONTINUE = "WATCH_NEXT_TYPE_CONTINUE";
-    field public static final java.lang.String WATCH_NEXT_TYPE_NEW = "WATCH_NEXT_TYPE_NEW";
-    field public static final java.lang.String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
-    field public static final java.lang.String WATCH_NEXT_TYPE_WATCHLIST = "WATCH_NEXT_TYPE_WATCHLIST";
-  }
-
-  public final class WatchNextProgram extends android.support.media.tv.BasePreviewProgram {
-    method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
-    method public long getLastEngagementTimeUtcMillis();
-    method public java.lang.String getWatchNextType();
-  }
-
-  public static final class WatchNextProgram.Builder extends android.support.media.tv.BasePreviewProgram.Builder {
-    ctor public WatchNextProgram.Builder();
-    ctor public WatchNextProgram.Builder(android.support.media.tv.WatchNextProgram);
-    method public android.support.media.tv.WatchNextProgram build();
-    method public android.support.media.tv.WatchNextProgram.Builder setLastEngagementTimeUtcMillis(long);
-    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(java.lang.String);
-  }
-
-}
-
-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.text.emoji {
-
-  public class EmojiCompat {
-    method public static android.support.text.emoji.EmojiCompat get();
-    method public int getLoadState();
-    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, int, int, boolean);
-    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
-    method public boolean hasEmojiGlyph(java.lang.CharSequence);
-    method public boolean hasEmojiGlyph(java.lang.CharSequence, int);
-    method public static android.support.text.emoji.EmojiCompat init(android.support.text.emoji.EmojiCompat.Config);
-    method public java.lang.CharSequence process(java.lang.CharSequence);
-    method public java.lang.CharSequence process(java.lang.CharSequence, int, int);
-    method public void registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
-    method public void unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
-    field public static final java.lang.String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
-    field public static final java.lang.String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
-    field public static final int LOAD_STATE_FAILURE = 2; // 0x2
-    field public static final int LOAD_STATE_LOADING = 0; // 0x0
-    field public static final int LOAD_STATE_SUCCESS = 1; // 0x1
-  }
-
-  public static abstract class EmojiCompat.Config {
-    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataLoader);
-    method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
-    method public android.support.text.emoji.EmojiCompat.Config setMaxEmojiPerText(int);
-    method public android.support.text.emoji.EmojiCompat.Config setReplaceAll(boolean);
-    method public android.support.text.emoji.EmojiCompat.Config unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
-  }
-
-  public static abstract class EmojiCompat.InitCallback {
-    ctor public EmojiCompat.InitCallback();
-    method public void onFailed(java.lang.Throwable);
-    method public void onInitialized();
-  }
-
-  public static abstract class EmojiCompat.LoaderCallback {
-    ctor public EmojiCompat.LoaderCallback();
-    method public abstract void onFailed(java.lang.Throwable);
-    method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
-  }
-
-  public static abstract interface EmojiCompat.MetadataLoader {
-    method public abstract void load(android.support.text.emoji.EmojiCompat.LoaderCallback);
-  }
-
-  public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
-    method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
-  }
-
-  public final class MetadataRepo {
-    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
-    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
-    method public static android.support.text.emoji.MetadataRepo create(android.content.res.AssetManager, java.lang.String) throws java.io.IOException;
-  }
-
-}
-
-package android.support.text.emoji.bundled {
-
-  public class BundledEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
-    ctor public BundledEmojiCompatConfig(android.content.Context);
-  }
-
-}
-
-package android.support.text.emoji.widget {
-
-  public class EmojiAppCompatButton extends android.support.v7.widget.AppCompatButton {
-    ctor public EmojiAppCompatButton(android.content.Context);
-    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class EmojiAppCompatEditText extends android.support.v7.widget.AppCompatEditText {
-    ctor public EmojiAppCompatEditText(android.content.Context);
-    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class EmojiAppCompatTextView extends android.support.v7.widget.AppCompatTextView {
-    ctor public EmojiAppCompatTextView(android.content.Context);
-    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class EmojiButton extends android.widget.Button {
-    ctor public EmojiButton(android.content.Context);
-    ctor public EmojiButton(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int);
-    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int, int);
-  }
-
-  public class EmojiEditText extends android.widget.EditText {
-    ctor public EmojiEditText(android.content.Context);
-    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int);
-    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int, int);
-  }
-
-  public final class EmojiEditTextHelper {
-    ctor public EmojiEditTextHelper(android.widget.EditText);
-    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
-    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
-  }
-
-  public class EmojiTextView extends android.widget.TextView {
-    ctor public EmojiTextView(android.content.Context);
-    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet);
-    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int);
-    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int, int);
-  }
-
-  public final class EmojiTextViewHelper {
-    ctor public EmojiTextViewHelper(android.widget.TextView);
-    method public android.text.InputFilter[] getFilters(android.text.InputFilter[]);
-    method public void setAllCaps(boolean);
-    method public void updateTransformationMethod();
-    method public android.text.method.TransformationMethod wrapTransformationMethod(android.text.method.TransformationMethod);
-  }
-
-}
-
-package android.support.transition {
-
-  public class ArcMotion extends android.support.transition.PathMotion {
-    ctor public ArcMotion();
-    method public float getMaximumAngle();
-    method public float getMinimumHorizontalAngle();
-    method public float getMinimumVerticalAngle();
-    method public android.graphics.Path getPath(float, float, float, float);
-    method public void setMaximumAngle(float);
-    method public void setMinimumHorizontalAngle(float);
-    method public void setMinimumVerticalAngle(float);
-  }
-
-  public class AutoTransition extends android.support.transition.TransitionSet {
-    ctor public AutoTransition();
-    ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class ChangeBounds extends android.support.transition.Transition {
-    ctor public ChangeBounds();
-    ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
-    method public void captureEndValues(android.support.transition.TransitionValues);
-    method public void captureStartValues(android.support.transition.TransitionValues);
-    method public void setResizeClip(boolean);
-  }
-
-  public class ChangeClipBounds extends android.support.transition.Transition {
-    ctor public ChangeClipBounds();
-    ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
-    method public void captureEndValues(android.support.transition.TransitionValues);
-    method public void captureStartValues(android.support.transition.TransitionValues);
-  }
-
-  public class CircularPropagation extends android.support.transition.VisibilityPropagation {
-    ctor public CircularPropagation();
-    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
-    method public void setPropagationSpeed(float);
-  }
-
-  public class Explode extends android.support.transition.Visibility {
-    ctor public Explode();
-    ctor public Explode(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class Fade extends android.support.transition.Visibility {
-    ctor public Fade(int);
-    ctor public Fade();
-    ctor public Fade(android.content.Context, android.util.AttributeSet);
-    field public static final int IN = 1; // 0x1
-    field public static final int OUT = 2; // 0x2
-  }
-
-  public abstract class PathMotion {
-    ctor public PathMotion();
-    method public abstract android.graphics.Path getPath(float, float, float, float);
-  }
-
-  public class PatternPathMotion extends android.support.transition.PathMotion {
-    ctor public PatternPathMotion();
-    ctor public PatternPathMotion(android.graphics.Path);
-    method public android.graphics.Path getPath(float, float, float, float);
-    method public android.graphics.Path getPatternPath();
-    method public void setPatternPath(android.graphics.Path);
-  }
-
-  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 public Transition(android.content.Context, android.util.AttributeSet);
-    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 android.support.transition.Transition addTarget(java.lang.String);
-    method public android.support.transition.Transition addTarget(java.lang.Class);
-    method public abstract void captureEndValues(android.support.transition.TransitionValues);
-    method public abstract void captureStartValues(android.support.transition.TransitionValues);
-    method public android.support.transition.Transition clone();
-    method public 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.String, boolean);
-    method public android.support.transition.Transition excludeTarget(java.lang.Class, boolean);
-    method public long getDuration();
-    method public android.graphics.Rect getEpicenter();
-    method public android.support.transition.Transition.EpicenterCallback getEpicenterCallback();
-    method public android.animation.TimeInterpolator getInterpolator();
-    method public java.lang.String getName();
-    method public android.support.transition.PathMotion getPathMotion();
-    method public android.support.transition.TransitionPropagation getPropagation();
-    method public long getStartDelay();
-    method public java.util.List<java.lang.Integer> getTargetIds();
-    method public java.util.List<java.lang.String> getTargetNames();
-    method public java.util.List<java.lang.Class> getTargetTypes();
-    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 removeTarget(java.lang.String);
-    method public android.support.transition.Transition removeTarget(java.lang.Class);
-    method public android.support.transition.Transition setDuration(long);
-    method public void setEpicenterCallback(android.support.transition.Transition.EpicenterCallback);
-    method public android.support.transition.Transition setInterpolator(android.animation.TimeInterpolator);
-    method public void setMatchOrder(int...);
-    method public void setPathMotion(android.support.transition.PathMotion);
-    method public void setPropagation(android.support.transition.TransitionPropagation);
-    method public android.support.transition.Transition setStartDelay(long);
-    field public static final int MATCH_ID = 3; // 0x3
-    field public static final int MATCH_INSTANCE = 1; // 0x1
-    field public static final int MATCH_ITEM_ID = 4; // 0x4
-    field public static final int MATCH_NAME = 2; // 0x2
-  }
-
-  public static abstract class Transition.EpicenterCallback {
-    ctor public Transition.EpicenterCallback();
-    method public abstract android.graphics.Rect onGetEpicenter(android.support.transition.Transition);
-  }
-
-  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 TransitionInflater {
-    method public static android.support.transition.TransitionInflater from(android.content.Context);
-    method public android.support.transition.Transition inflateTransition(int);
-    method public android.support.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup);
-  }
-
-  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 abstract class TransitionPropagation {
-    ctor public TransitionPropagation();
-    method public abstract void captureValues(android.support.transition.TransitionValues);
-    method public abstract java.lang.String[] getPropagationProperties();
-    method public abstract long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
-  }
-
-  public class TransitionSet extends android.support.transition.Transition {
-    ctor public TransitionSet();
-    ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
-    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 int getOrdering();
-    method public android.support.transition.Transition getTransitionAt(int);
-    method public int getTransitionCount();
-    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;
-  }
-
-  public abstract class Visibility extends android.support.transition.Transition {
-    ctor public Visibility();
-    ctor public Visibility(android.content.Context, android.util.AttributeSet);
-    method public void captureEndValues(android.support.transition.TransitionValues);
-    method public void captureStartValues(android.support.transition.TransitionValues);
-    method public int getMode();
-    method public boolean isVisible(android.support.transition.TransitionValues);
-    method public android.animation.Animator onAppear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
-    method public android.animation.Animator onAppear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
-    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
-    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
-    method public void setMode(int);
-    field public static final int MODE_IN = 1; // 0x1
-    field public static final int MODE_OUT = 2; // 0x2
-  }
-
-  public abstract class VisibilityPropagation extends android.support.transition.TransitionPropagation {
-    ctor public VisibilityPropagation();
-    method public void captureValues(android.support.transition.TransitionValues);
-    method public java.lang.String[] getPropagationProperties();
-    method public int getViewVisibility(android.support.transition.TransitionValues);
-    method public int getViewX(android.support.transition.TransitionValues);
-    method public int getViewY(android.support.transition.TransitionValues);
-  }
-
-}
-
-package android.support.v13.app {
-
-  public class ActivityCompat extends android.support.v4.app.ActivityCompat {
-    ctor protected 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 deprecated 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 deprecated class ViewCompat extends android.support.v4.view.ViewCompat {
-  }
-
-}
-
-package android.support.v13.view.inputmethod {
-
-  public final class EditorInfoCompat {
-    ctor public EditorInfoCompat();
-    method public static java.lang.String[] getContentMimeTypes(android.view.inputmethod.EditorInfo);
-    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, java.lang.String[]);
-    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
-    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
-  }
-
-  public final class InputConnectionCompat {
-    ctor public InputConnectionCompat();
-    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
-    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
-    field public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
-  }
-
-  public static abstract interface InputConnectionCompat.OnCommitContentListener {
-    method public abstract boolean onCommitContent(android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
-  }
-
-  public final class InputContentInfoCompat {
-    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri);
-    method public android.net.Uri getContentUri();
-    method public android.content.ClipDescription getDescription();
-    method public android.net.Uri getLinkUri();
-    method public void releasePermission();
-    method public void requestPermission();
-    method public java.lang.Object unwrap();
-    method public static android.support.v13.view.inputmethod.InputContentInfoCompat wrap(java.lang.Object);
-  }
-
-}
-
-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 void attachToView(android.view.View);
-    method public void clearDrawable();
-    method public final int getColor();
-    method public deprecated android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public deprecated 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 boolean isAutoReleaseOnStop();
-    method public void release();
-    method public void setAutoReleaseOnStop(boolean);
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public deprecated 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 final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
-    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 final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
-    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 android.app.Fragment getMainFragment();
-    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 android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public android.support.v17.leanback.app.HeadersFragment onCreateHeadersFragment();
-    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<T extends android.app.Fragment> {
-    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<T extends android.app.Fragment> {
-    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<T extends android.app.Fragment> {
-    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
-    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
-    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 android.support.v4.app.Fragment getMainFragment();
-    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 android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public android.support.v17.leanback.app.HeadersSupportFragment onCreateHeadersSupportFragment();
-    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<T extends android.support.v4.app.Fragment> {
-    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<T extends android.support.v4.app.Fragment> {
-    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<T extends android.support.v4.app.Fragment> {
-    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
-    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
-    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.widget.DetailsParallax getParallax();
-    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 DetailsFragmentBackgroundController {
-    ctor public DetailsFragmentBackgroundController(android.support.v17.leanback.app.DetailsFragment);
-    method public void enableParallax();
-    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
-    method public final android.app.Fragment findOrCreateVideoFragment();
-    method public final android.graphics.drawable.Drawable getBottomDrawable();
-    method public final android.graphics.Bitmap getCoverBitmap();
-    method public final android.graphics.drawable.Drawable getCoverDrawable();
-    method public final int getParallaxDrawableMaxOffset();
-    method public final int getSolidColor();
-    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
-    method public android.app.Fragment onCreateVideoFragment();
-    method public final void setCoverBitmap(android.graphics.Bitmap);
-    method public final void setParallaxDrawableMaxOffset(int);
-    method public final void setSolidColor(int);
-    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
-  }
-
-  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.widget.DetailsParallax getParallax();
-    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 DetailsSupportFragmentBackgroundController {
-    ctor public DetailsSupportFragmentBackgroundController(android.support.v17.leanback.app.DetailsSupportFragment);
-    method public void enableParallax();
-    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
-    method public final android.support.v4.app.Fragment findOrCreateVideoSupportFragment();
-    method public final android.graphics.drawable.Drawable getBottomDrawable();
-    method public final android.graphics.Bitmap getCoverBitmap();
-    method public final android.graphics.drawable.Drawable getCoverDrawable();
-    method public final int getParallaxDrawableMaxOffset();
-    method public final int getSolidColor();
-    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
-    method public android.support.v4.app.Fragment onCreateVideoSupportFragment();
-    method public final void setCoverBitmap(android.graphics.Bitmap);
-    method public final void setParallaxDrawableMaxOffset(int);
-    method public final void setSolidColor(int);
-    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
-  }
-
-  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 collapseAction(boolean);
-    method public void collapseSubActions();
-    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
-    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 isExpanded();
-    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 collapseAction(boolean);
-    method public void collapseSubActions();
-    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
-    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 isExpanded();
-    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 deprecated 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();
-  }
-
-  public abstract class OnboardingFragment extends android.app.Fragment {
-    ctor public OnboardingFragment();
-    method protected final int getCurrentPageIndex();
-    method public final int getIconResourceId();
-    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 onCreateDescriptionAnimator();
-    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 android.animation.Animator onCreateTitleAnimator();
-    method protected void onFinishFragment();
-    method protected void onPageChanged(int, int);
-    method public int onProvideTheme();
-    method public final void setIconResouceId(int);
-    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 getIconResourceId();
-    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 onCreateDescriptionAnimator();
-    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 android.animation.Animator onCreateTitleAnimator();
-    method protected void onFinishFragment();
-    method protected void onPageChanged(int, int);
-    method public int onProvideTheme();
-    method public final void setIconResouceId(int);
-    method public final void setLogoResourceId(int);
-  }
-
-  public abstract deprecated class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
-    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 android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public deprecated android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final void next();
-    method protected void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public final void pause();
-    method protected deprecated void pausePlayback();
-    method public final void play(int);
-    method public final void previous();
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected deprecated void skipToNext();
-    method protected deprecated void skipToPrevious();
-    method protected deprecated void startPlayback(int);
-  }
-
-  public static abstract deprecated interface PlaybackControlGlue.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public abstract deprecated class PlaybackControlSupportGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    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[]);
-    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 PlaybackFragment extends android.app.Fragment {
-    ctor public PlaybackFragment();
-    method public void fadeOut();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBackgroundType();
-    method public boolean isFadingEnabled();
-    method public void notifyPlaybackRowChanged();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBackgroundType(int);
-    method public void setFadingEnabled(boolean);
-    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
-    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
-    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    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 class PlaybackFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost {
-    ctor public PlaybackFragmentGlueHost(android.support.v17.leanback.app.PlaybackFragment);
-  }
-
-  public deprecated class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public void fadeOut();
-    method public int getBackgroundType();
-    method public final android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler getEventHandler();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final deprecated android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public final void setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final deprecated 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 deprecated interface PlaybackOverlayFragment.InputEventHandler implements android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler {
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public deprecated class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public void fadeOut();
-    method public int getBackgroundType();
-    method public final android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler getEventHandler();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final deprecated android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public final void setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final deprecated 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 deprecated interface PlaybackOverlaySupportFragment.InputEventHandler implements android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler {
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackSupportFragment extends android.support.v4.app.Fragment {
-    ctor public PlaybackSupportFragment();
-    method public void fadeOut();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBackgroundType();
-    method public boolean isFadingEnabled();
-    method public void notifyPlaybackRowChanged();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBackgroundType(int);
-    method public void setFadingEnabled(boolean);
-    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
-    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
-    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    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 class PlaybackSupportFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost {
-    ctor public PlaybackSupportFragmentGlueHost(android.support.v17.leanback.app.PlaybackSupportFragment);
-  }
-
-  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.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
-    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.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
-    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 android.support.v17.leanback.app.RowsFragment getRowsFragment();
-    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    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 android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
-    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    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);
-  }
-
-  public class VideoFragment extends android.support.v17.leanback.app.PlaybackFragment {
-    ctor public VideoFragment();
-    method public android.view.SurfaceView getSurfaceView();
-    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
-  }
-
-  public class VideoFragmentGlueHost extends android.support.v17.leanback.app.PlaybackFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
-    ctor public VideoFragmentGlueHost(android.support.v17.leanback.app.VideoFragment);
-    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
-  }
-
-  public class VideoSupportFragment extends android.support.v17.leanback.app.PlaybackSupportFragment {
-    ctor public VideoSupportFragment();
-    method public android.view.SurfaceView getSurfaceView();
-    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
-  }
-
-  public class VideoSupportFragmentGlueHost extends android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
-    ctor public VideoSupportFragmentGlueHost(android.support.v17.leanback.app.VideoSupportFragment);
-    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
-  }
-
-}
-
-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 class BoundsRule {
-    ctor public BoundsRule();
-    ctor public BoundsRule(android.support.v17.leanback.graphics.BoundsRule);
-    method public void calculateBounds(android.graphics.Rect, android.graphics.Rect);
-    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule bottom;
-    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule left;
-    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule right;
-    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule top;
-  }
-
-  public static final class BoundsRule.ValueRule {
-    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule absoluteValue(int);
-    method public int getAbsoluteValue();
-    method public float getFraction();
-    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParent(float);
-    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParentWithOffset(float, int);
-    method public void setAbsoluteValue(int);
-    method public void setFraction(float);
-  }
-
-  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);
-  }
-
-  public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
-    ctor public CompositeDrawable();
-    method public void addChildDrawable(android.graphics.drawable.Drawable);
-    method public void draw(android.graphics.Canvas);
-    method public android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable getChildAt(int);
-    method public int getChildCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getOpacity();
-    method public void invalidateDrawable(android.graphics.drawable.Drawable);
-    method public void removeChild(int);
-    method public void removeDrawable(android.graphics.drawable.Drawable);
-    method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
-    method public void setAlpha(int);
-    method public void setChildDrawableAt(int, android.graphics.drawable.Drawable);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
-  }
-
-  public static final class CompositeDrawable.ChildDrawable {
-    ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable, android.support.v17.leanback.graphics.CompositeDrawable);
-    method public android.support.v17.leanback.graphics.BoundsRule getBoundsRule();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public void recomputeBounds();
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> BOTTOM_ABSOLUTE;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> BOTTOM_FRACTION;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> LEFT_ABSOLUTE;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> LEFT_FRACTION;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> RIGHT_ABSOLUTE;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> RIGHT_FRACTION;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> TOP_ABSOLUTE;
-    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> TOP_FRACTION;
-  }
-
-  public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
-    ctor public FitWidthBitmapDrawable();
-    method public void draw(android.graphics.Canvas);
-    method public android.graphics.Bitmap getBitmap();
-    method public int getOpacity();
-    method public android.graphics.Rect getSource();
-    method public int getVerticalOffset();
-    method public void setAlpha(int);
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setSource(android.graphics.Rect);
-    method public void setVerticalOffset(int);
-    field public static final android.util.Property<android.support.v17.leanback.graphics.FitWidthBitmapDrawable, java.lang.Integer> PROPERTY_VERTICAL_OFFSET;
-  }
-
-}
-
-package android.support.v17.leanback.media {
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, 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();
-  }
-
-  public abstract class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackGlue 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[]);
-    method public void enableProgressUpdating(boolean);
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter getControlsRowPresenter();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    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 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 protected void onCreateControlsRowAndPresenter();
-    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.SparseArrayObjectAdapter);
-    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected void onStateChanged();
-    method public void play(int);
-    method public final void play();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setControlsRowPresenter(android.support.v17.leanback.widget.PlaybackControlsRowPresenter);
-    method public void setFadingEnabled(boolean);
-    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 PlaybackGlue {
-    ctor public PlaybackGlue(android.content.Context);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.media.PlaybackGlueHost getHost();
-    method public boolean isReadyForPlayback();
-    method public void next();
-    method protected void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
-    method protected void onDetachedFromHost();
-    method protected void onHostPause();
-    method protected void onHostResume();
-    method protected void onHostStart();
-    method protected void onHostStop();
-    method public void pause();
-    method public void play();
-    method public void previous();
-    method public final void setHost(android.support.v17.leanback.media.PlaybackGlueHost);
-    method public void setPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
-  }
-
-  public static abstract class PlaybackGlue.PlayerCallback {
-    ctor public PlaybackGlue.PlayerCallback();
-    method public abstract void onReadyForPlayback();
-  }
-
-  public abstract class PlaybackGlueHost {
-    ctor public PlaybackGlueHost();
-    method public void fadeOut();
-    method public void notifyPlaybackRowChanged();
-    method public void setFadingEnabled(boolean);
-    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setOnKeyInterceptListener(android.view.View.OnKeyListener);
-    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
-    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
-  }
-
-  public static abstract class PlaybackGlueHost.HostCallback {
-    ctor public PlaybackGlueHost.HostCallback();
-    method public void onHostDestroy();
-    method public void onHostPause();
-    method public void onHostResume();
-    method public void onHostStart();
-    method public void onHostStop();
-  }
-
-  public abstract interface SurfaceHolderGlueHost {
-    method public abstract void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
-  }
-
-}
-
-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 protected int getMediaPlayState(java.lang.Object);
-    method public int getThemeId();
-    method public boolean hasMediaRowSeparator();
-    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
-    method public void onBindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
-    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 onUnbindMediaPlayState(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);
-    field public static final int PLAY_STATE_INITIAL = 0; // 0x0
-    field public static final int PLAY_STATE_PAUSED = 1; // 0x1
-    field public static final int PLAY_STATE_PLAYING = 2; // 0x2
-  }
-
-  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.widget.ViewFlipper getMediaItemNumberViewFlipper();
-    method public android.view.View getMediaItemPausedView();
-    method public android.view.View getMediaItemPlayingView();
-    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 notifyPlayStateChanged();
-    method public void onBindRowActions();
-    method public void setSelectedMediaItemNumberView(int);
-  }
-
-  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 <E> 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 deprecated int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public deprecated 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<T> {
-    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<T> {
-    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 setOnDispatchKeyListener(android.view.View.OnKeyListener);
-    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 DetailsParallax extends android.support.v17.leanback.widget.RecyclerViewParallax {
-    ctor public DetailsParallax();
-    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowBottom();
-    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowTop();
-  }
-
-  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);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView, boolean);
-  }
-
-  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<B extends android.support.v17.leanback.widget.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 void collapseAction(boolean);
-    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
-    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 final boolean isBackKeyToCollapseActivatorView();
-    method public final boolean isBackKeyToCollapseSubActions();
-    method public boolean isButtonActions();
-    method public boolean isExpandTransitionSupported();
-    method public boolean isExpanded();
-    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 deprecated void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
-    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean, 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 final void setBackKeyToCollapseActivatorView(boolean);
-    method public final void setBackKeyToCollapseSubActions(boolean);
-    method public deprecated void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
-    method public deprecated 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 deprecated 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<B extends android.support.v17.leanback.widget.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 java.lang.CharSequence getDescription();
-    method public final long getId();
-    method public final java.lang.String getName();
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setDescription(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 setPresenter(android.support.v17.leanback.widget.PresenterSelector);
-    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 public boolean isImmediateNotifySupported();
-    method protected final void notifyChanged();
-    method public 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);
-    method public void onChildViewHolderSelectedAndPositioned(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 abstract class Parallax<PropertyT extends android.util.Property> {
-    ctor public Parallax();
-    method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
-    method public final PropertyT addProperty(java.lang.String);
-    method public abstract PropertyT createProperty(java.lang.String, int);
-    method public java.util.List<android.support.v17.leanback.widget.ParallaxEffect> getEffects();
-    method public abstract float getMaxValue();
-    method public final java.util.List<PropertyT> getProperties();
-    method public void removeAllEffects();
-    method public void removeEffect(android.support.v17.leanback.widget.ParallaxEffect);
-    method public void updateValues();
-  }
-
-  public static class Parallax.FloatProperty extends android.util.Property {
-    ctor public Parallax.FloatProperty(java.lang.String, int);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(float, float);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(float);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
-    method public final java.lang.Float get(android.support.v17.leanback.widget.Parallax);
-    method public final int getIndex();
-    method public final float getValue(android.support.v17.leanback.widget.Parallax);
-    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Float);
-    method public final void setValue(android.support.v17.leanback.widget.Parallax, float);
-    field public static final float UNKNOWN_AFTER = 3.4028235E38f;
-    field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
-  }
-
-  public static class Parallax.IntProperty extends android.util.Property {
-    ctor public Parallax.IntProperty(java.lang.String, int);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(int, float);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(int);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
-    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
-    method public final java.lang.Integer get(android.support.v17.leanback.widget.Parallax);
-    method public final int getIndex();
-    method public final int getValue(android.support.v17.leanback.widget.Parallax);
-    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Integer);
-    method public final void setValue(android.support.v17.leanback.widget.Parallax, int);
-    field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
-    field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
-  }
-
-  public static class Parallax.PropertyMarkerValue<PropertyT> {
-    ctor public Parallax.PropertyMarkerValue(PropertyT);
-    method public PropertyT getProperty();
-  }
-
-  public abstract class ParallaxEffect {
-    method public final void addTarget(android.support.v17.leanback.widget.ParallaxTarget);
-    method public final java.util.List<android.support.v17.leanback.widget.Parallax.PropertyMarkerValue> getPropertyRanges();
-    method public final java.util.List<android.support.v17.leanback.widget.ParallaxTarget> getTargets();
-    method public final void performMapping(android.support.v17.leanback.widget.Parallax);
-    method public final void removeTarget(android.support.v17.leanback.widget.ParallaxTarget);
-    method public final void setPropertyRanges(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
-    method public final android.support.v17.leanback.widget.ParallaxEffect target(android.support.v17.leanback.widget.ParallaxTarget);
-    method public final android.support.v17.leanback.widget.ParallaxEffect target(java.lang.Object, android.animation.PropertyValuesHolder);
-    method public final <T, V extends java.lang.Number> android.support.v17.leanback.widget.ParallaxEffect target(T, android.util.Property<T, V>);
-  }
-
-  public abstract class ParallaxTarget {
-    ctor public ParallaxTarget();
-    method public void directUpdate(java.lang.Number);
-    method public boolean isDirectMapping();
-    method public void update(float);
-  }
-
-  public static final class ParallaxTarget.DirectPropertyTarget<T, V extends java.lang.Number> extends android.support.v17.leanback.widget.ParallaxTarget {
-    ctor public ParallaxTarget.DirectPropertyTarget(java.lang.Object, android.util.Property<T, V>);
-  }
-
-  public static final class ParallaxTarget.PropertyValuesHolderTarget extends android.support.v17.leanback.widget.ParallaxTarget {
-    ctor public ParallaxTarget.PropertyValuesHolderTarget(java.lang.Object, android.animation.PropertyValuesHolder);
-  }
-
-  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 long getBufferedProgressLong();
-    method public int getCurrentTime();
-    method public long getCurrentTimeLong();
-    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 long getTotalTimeLong();
-    method public void setBufferedProgress(int);
-    method public void setBufferedProgressLong(long);
-    method public void setCurrentTime(int);
-    method public void setCurrentTimeLong(long);
-    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);
-    method public void setTotalTimeLong(long);
-  }
-
-  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.PlaybackRowPresenter {
-    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.PlaybackRowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class PlaybackRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackRowPresenter();
-    method public void onReappear(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-  }
-
-  public static class PlaybackRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public PlaybackRowPresenter.ViewHolder(android.view.View);
-  }
-
-  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 RecyclerViewParallax extends android.support.v17.leanback.widget.Parallax {
-    ctor public RecyclerViewParallax();
-    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty createProperty(java.lang.String, int);
-    method public float getMaxValue();
-    method public android.support.v7.widget.RecyclerView getRecyclerView();
-    method public void setRecyclerView(android.support.v7.widget.RecyclerView);
-  }
-
-  public static final class RecyclerViewParallax.ChildPositionProperty extends android.support.v17.leanback.widget.Parallax.IntProperty {
-    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty adapterPosition(int);
-    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty fraction(float);
-    method public int getAdapterPosition();
-    method public float getFraction();
-    method public int getOffset();
-    method public int getViewId();
-    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty offset(int);
-    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty viewId(int);
-  }
-
-  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 java.lang.Object getSelectedItem();
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder getSelectedItemViewHolder();
-    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    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 setListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setNotListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    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[]);
-  }
-
-  public class TimePicker extends android.support.v17.leanback.widget.picker.Picker {
-    ctor public TimePicker(android.content.Context, android.util.AttributeSet);
-    ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
-    method public int getHour();
-    method public int getMinute();
-    method public boolean is24Hour();
-    method public boolean isPm();
-    method public void setHour(int);
-    method public void setIs24Hour(boolean);
-    method public void setMinute(int);
-  }
-
-}
-
-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();
-    method public void setTitle(java.lang.CharSequence);
-  }
-
-  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 deprecated boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static deprecated java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static deprecated java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static deprecated android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static deprecated java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
-    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 deprecated 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 protected ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public static 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 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 final class AlarmManagerCompat {
-    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
-    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
-    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
-    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
-  }
-
-  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 isStateSaved();
-    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 postponeEnterTransition();
-    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 startPostponedEnterTransition();
-    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 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 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 deprecated 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 android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    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 android.support.v4.app.Fragment findFragmentByWho(java.lang.String);
-    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<E> 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 android.support.v4.app.Fragment getPrimaryNavigationFragment();
-    method public abstract boolean isDestroyed();
-    method public abstract boolean isStateSaved();
-    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 registerFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
-    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);
-    method public abstract void unregisterFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks);
-    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 class FragmentManager.FragmentLifecycleCallbacks {
-    ctor public FragmentManager.FragmentLifecycleCallbacks();
-    method public void onFragmentActivityCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
-    method public void onFragmentAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
-    method public void onFragmentCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
-    method public void onFragmentDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentDetached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentPaused(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentPreAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
-    method public void onFragmentResumed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentSaveInstanceState(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
-    method public void onFragmentStarted(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentStopped(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-    method public void onFragmentViewCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.view.View, android.os.Bundle);
-    method public void onFragmentViewDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
-  }
-
-  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 postOnCommit(java.lang.Runnable);
-    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 setAllowOptimization(boolean);
-    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 setPrimaryNavigationFragment(android.support.v4.app.Fragment);
-    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 <D> android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract <D> android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks<D> {
-    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 java.lang.String getChannel(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_AUDIO_CONTENTS_URI = "android.audioContents";
-    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.support.v4.app.RemoteInput[] getDataOnlyRemoteInputs();
-    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 getHintDisplayActionInline();
-    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 setHintDisplayActionInline(boolean);
-    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 setChannel(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 java.lang.String getBridgeTag();
-    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 setBridgeTag(java.lang.String);
-    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 addDataResultToIntent(android.support.v4.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.util.Set<java.lang.String> getAllowedDataTypes();
-    method public java.lang.CharSequence[] getChoices();
-    method public static java.util.Map<java.lang.String, android.net.Uri> getDataResultsFromIntent(android.content.Intent, java.lang.String);
-    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);
-    method public boolean isDataOnly();
-    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 setAllowDataType(java.lang.String, boolean);
-    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);
-  }
-
-   deprecated class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.util.Set<java.lang.String> getAllowedDataTypes();
-    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 {
-    method public static void stopForeground(android.app.Service, int);
-    field public static final int START_STICKY = 1; // 0x1
-    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
-    field public static final int STOP_FOREGROUND_REMOVE = 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>);
-    method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.support.v4.app.SharedElementCallback.OnSharedElementsReadyListener);
-  }
-
-  public static abstract interface SharedElementCallback.OnSharedElementsReadyListener {
-    method public abstract void onSharedElementsReady();
-  }
-
-  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<D> 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 protected 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);
-    method public static void startActivity(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 deprecated android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static deprecated android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final deprecated java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final deprecated 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 deprecated java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final deprecated 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 deprecated int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final deprecated int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader<D> {
-    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<D> {
-    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener<D> {
-    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 MimeTypeFilter {
-    method public static boolean matches(java.lang.String, java.lang.String);
-    method public static java.lang.String matches(java.lang.String, java.lang.String[]);
-    method public static java.lang.String matches(java.lang.String[], java.lang.String);
-    method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
-  }
-
-  public final deprecated class ParallelExecutorCompat {
-    method public static deprecated 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
-  }
-
-  public class ShortcutInfoCompat {
-    method public android.content.ComponentName getActivity();
-    method public java.lang.CharSequence getDisabledMessage();
-    method public java.lang.String getId();
-    method public android.content.Intent getIntent();
-    method public android.content.Intent[] getIntents();
-    method public java.lang.CharSequence getLongLabel();
-    method public java.lang.CharSequence getShortLabel();
-  }
-
-  public static class ShortcutInfoCompat.Builder {
-    ctor public ShortcutInfoCompat.Builder(android.content.Context, java.lang.String);
-    method public android.support.v4.content.pm.ShortcutInfoCompat build();
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(java.lang.CharSequence);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.graphics.Bitmap);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(int);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setLongLabel(java.lang.CharSequence);
-    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setShortLabel(java.lang.CharSequence);
-  }
-
-  public class ShortcutManagerCompat {
-    method public static android.content.Intent createShortcutResultIntent(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat);
-    method public static boolean isRequestPinShortcutSupported(android.content.Context);
-    method public static boolean requestPinShortcut(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat, android.content.IntentSender);
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public final class ConfigurationHelper {
-    method public static int getDensityDpi(android.content.res.Resources);
-    method public static deprecated int getScreenHeightDp(android.content.res.Resources);
-    method public static deprecated int getScreenWidthDp(android.content.res.Resources);
-    method public static deprecated 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);
-  }
-
-  public final class PaintCompat {
-    method public static boolean hasGlyph(android.graphics.Paint, java.lang.String);
-  }
-
-}
-
-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 extends android.graphics.drawable.Drawable> 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.math {
-
-  public class MathUtils {
-    method public static float clamp(float, float, float);
-    method public static double clamp(double, double, double);
-    method public static int clamp(int, int, int);
-  }
-
-}
-
-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 search(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SearchCallback);
-    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 static android.support.v4.media.MediaBrowserCompat.MediaItem fromMediaItem(java.lang.Object);
-    method public static java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem> fromMediaItemList(java.util.List<?>);
-    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.SearchCallback {
-    ctor public MediaBrowserCompat.SearchCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
-  }
-
-  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 onSearch(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<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";
-    field public static final deprecated java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
-  }
-
-  public static class MediaBrowserServiceCompat.Result<T> {
-    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 long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
-    field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
-    field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
-    field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
-    field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
-    field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
-    field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-    field public static final java.lang.String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
-  }
-
-  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_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
-    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_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
-    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_MEDIA_URI = "android.media.metadata.MEDIA_URI";
-    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 deprecated class TransportController {
-    ctor public deprecated TransportController();
-    method public abstract deprecated int getBufferPercentage();
-    method public abstract deprecated long getCurrentPosition();
-    method public abstract deprecated long getDuration();
-    method public abstract deprecated int getTransportControlFlags();
-    method public abstract deprecated boolean isPlaying();
-    method public abstract deprecated void pausePlaying();
-    method public abstract deprecated void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract deprecated void seekTo(long);
-    method public abstract deprecated void startPlaying();
-    method public abstract deprecated void stopPlaying();
-    method public abstract deprecated void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public deprecated class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public deprecated TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public deprecated TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public deprecated void destroy();
-    method public deprecated boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public deprecated int getBufferPercentage();
-    method public deprecated long getCurrentPosition();
-    method public deprecated long getDuration();
-    method public deprecated java.lang.Object getRemoteControlClient();
-    method public deprecated int getTransportControlFlags();
-    method public deprecated boolean isPlaying();
-    method public deprecated void pausePlaying();
-    method public deprecated void refreshState();
-    method public deprecated void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public deprecated void seekTo(long);
-    method public deprecated void startPlaying();
-    method public deprecated void stopPlaying();
-    method public deprecated void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final deprecated int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final deprecated int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final deprecated int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final deprecated int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final deprecated int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final deprecated int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final deprecated int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final deprecated int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final deprecated int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final deprecated int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final deprecated int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract deprecated class TransportPerformer {
-    ctor public deprecated TransportPerformer();
-    method public deprecated void onAudioFocusChange(int);
-    method public deprecated int onGetBufferPercentage();
-    method public abstract deprecated long onGetCurrentPosition();
-    method public abstract deprecated long onGetDuration();
-    method public deprecated int onGetTransportControlFlags();
-    method public abstract deprecated boolean onIsPlaying();
-    method public deprecated boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public deprecated boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract deprecated void onPause();
-    method public abstract deprecated void onSeekTo(long);
-    method public abstract deprecated void onStart();
-    method public abstract deprecated void onStop();
-  }
-
-  public deprecated class TransportStateListener {
-    ctor public deprecated TransportStateListener();
-    method public deprecated void onPlayingChanged(android.support.v4.media.TransportController);
-    method public deprecated 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.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, long);
-    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, android.content.ComponentName, long);
-    method public static deprecated 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 addQueueItem(android.support.v4.media.MediaDescriptionCompat);
-    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
-    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 static android.support.v4.media.session.MediaControllerCompat getMediaController(android.app.Activity);
-    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 int getRepeatMode();
-    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 boolean isCaptioningEnabled();
-    method public boolean isShuffleModeEnabled();
-    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 removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
-    method public void removeQueueItemAt(int);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat);
-    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 onCaptioningEnabledChanged(boolean);
-    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 onRepeatModeChanged(int);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-    method public void onShuffleModeChanged(boolean);
-  }
-
-  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 setCaptioningEnabled(boolean);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void setRepeatMode(int);
-    method public abstract void setShuffleModeEnabled(boolean);
-    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 static android.support.v4.media.session.MediaSessionCompat fromMediaSession(android.content.Context, java.lang.Object);
-    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 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 setCaptioningEnabled(boolean);
-    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 setRepeatMode(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    method public void setShuffleModeEnabled(boolean);
-    field public static final java.lang.String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
-    field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat);
-    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
-    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 onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat);
-    method public void onRemoveQueueItemAt(int);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetCaptioningEnabled(boolean);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSetRepeatMode(int);
-    method public void onSetShuffleModeEnabled(boolean);
-    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 static android.support.v4.media.session.MediaSessionCompat.QueueItem fromQueueItem(java.lang.Object);
-    method public static java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> fromQueueItemList(java.util.List<?>);
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    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 int getErrorCode();
-    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 static int toKeyCode(long);
-    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_CAPTIONING_ENABLED = 1048576L; // 0x100000L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SET_REPEAT_MODE = 262144L; // 0x40000L
-    field public static final long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288L; // 0x80000L
-    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 int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
-    field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
-    field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
-    field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
-    field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
-    field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
-    field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
-    field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
-    field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
-    field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
-    field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
-    field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int REPEAT_MODE_ALL = 2; // 0x2
-    field public static final int REPEAT_MODE_NONE = 0; // 0x0
-    field public static final int REPEAT_MODE_ONE = 1; // 0x1
-    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 deprecated android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(int, 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 int getRestrictBackgroundStatus(android.net.ConnectivityManager);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
-    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
-    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
-  }
-
-  public final class TrafficStatsCompat {
-    method public static deprecated void clearThreadStatsTag();
-    method public static deprecated int getThreadStatsTag();
-    method public static deprecated void incrementOperationCount(int);
-    method public static deprecated void incrementOperationCount(int, int);
-    method public static deprecated void setThreadStatsTag(int);
-    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
-    method public static deprecated void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
-    method public static deprecated void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public final deprecated class AsyncTaskCompat {
-    method public static deprecated <Params, Progress, Result> android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class BuildCompat {
-    method public static boolean isAtLeastN();
-    method public static boolean isAtLeastNMR1();
-    method public static boolean isAtLeastO();
-  }
-
-  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 deprecated class ParcelableCompat {
-    method public static deprecated <T> android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract deprecated interface ParcelableCompatCreatorCallbacks<T> {
-    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 boolean isVirtual();
-    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 isRtl(java.lang.CharSequence);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence);
-  }
-
-  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<K, V> 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 final class ArraySet<E> implements java.util.Collection java.util.Set {
-    ctor public ArraySet();
-    ctor public ArraySet(int);
-    ctor public ArraySet(android.support.v4.util.ArraySet<E>);
-    method public boolean add(E);
-    method public void addAll(android.support.v4.util.ArraySet<? extends E>);
-    method public boolean addAll(java.util.Collection<? extends E>);
-    method public void clear();
-    method public boolean contains(java.lang.Object);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public void ensureCapacity(int);
-    method public int indexOf(java.lang.Object);
-    method public boolean isEmpty();
-    method public java.util.Iterator<E> iterator();
-    method public boolean remove(java.lang.Object);
-    method public boolean removeAll(android.support.v4.util.ArraySet<? extends E>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public E removeAt(int);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public int size();
-    method public java.lang.Object[] toArray();
-    method public <T> T[] toArray(T[]);
-    method public E valueAt(int);
-  }
-
-  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<E> {
-    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<E> {
-    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<K, V> {
-    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<F, S> {
-    ctor public Pair(F, S);
-    method public static <A, B> 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<T> {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool<T> 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<T> extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap<K, V> {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap<K, V>);
-    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<E> {
-    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 deprecated 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 deprecated boolean hasModifiers(android.view.KeyEvent, int);
-    method public static deprecated boolean hasNoModifiers(android.view.KeyEvent);
-    method public static deprecated boolean isCtrlPressed(android.view.KeyEvent);
-    method public static deprecated boolean isTracking(android.view.KeyEvent);
-    method public static deprecated boolean metaStateHasModifiers(int, int);
-    method public static deprecated boolean metaStateHasNoModifiers(int);
-    method public static deprecated int normalizeMetaState(int);
-    method public static deprecated void startTracking(android.view.KeyEvent);
-  }
-
-  public final class LayoutInflaterCompat {
-    method public static deprecated android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
-    method public static deprecated void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
-  }
-
-  public abstract deprecated 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 deprecated boolean collapseActionView(android.view.MenuItem);
-    method public static deprecated boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static deprecated android.view.View getActionView(android.view.MenuItem);
-    method public int getAlphabeticModifiers(android.view.MenuItem);
-    method public static java.lang.CharSequence getContentDescription(android.view.MenuItem);
-    method public int getNumericModifiers(android.view.MenuItem);
-    method public static java.lang.CharSequence getTooltipText(android.view.MenuItem);
-    method public static deprecated boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
-    method public static void setContentDescription(android.view.MenuItem, java.lang.CharSequence);
-    method public static void setNumericShortcut(android.view.MenuItem, char, int);
-    method public static deprecated android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-    method public static void setTooltipText(android.view.MenuItem, java.lang.CharSequence);
-    field public static final deprecated int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final deprecated int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final deprecated int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final deprecated int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final deprecated int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract deprecated 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 deprecated int getActionIndex(android.view.MotionEvent);
-    method public static deprecated int getActionMasked(android.view.MotionEvent);
-    method public static deprecated float getAxisValue(android.view.MotionEvent, int);
-    method public static deprecated float getAxisValue(android.view.MotionEvent, int, int);
-    method public static deprecated 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 deprecated int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final deprecated int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final deprecated int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final deprecated int ACTION_MASK = 255; // 0xff
-    field public static final deprecated int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final deprecated int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final deprecated int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final deprecated int ACTION_POINTER_UP = 6; // 0x6
-    field public static final deprecated int ACTION_SCROLL = 8; // 0x8
-    field public static final deprecated int AXIS_BRAKE = 23; // 0x17
-    field public static final deprecated int AXIS_DISTANCE = 24; // 0x18
-    field public static final deprecated int AXIS_GAS = 22; // 0x16
-    field public static final deprecated int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final deprecated int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final deprecated int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final deprecated int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final deprecated int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final deprecated int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final deprecated int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final deprecated int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final deprecated int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final deprecated int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final deprecated int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final deprecated int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final deprecated int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final deprecated int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final deprecated int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final deprecated int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final deprecated int AXIS_HAT_X = 15; // 0xf
-    field public static final deprecated int AXIS_HAT_Y = 16; // 0x10
-    field public static final deprecated int AXIS_HSCROLL = 10; // 0xa
-    field public static final deprecated int AXIS_LTRIGGER = 17; // 0x11
-    field public static final deprecated int AXIS_ORIENTATION = 8; // 0x8
-    field public static final deprecated 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 deprecated int AXIS_RTRIGGER = 18; // 0x12
-    field public static final deprecated int AXIS_RUDDER = 20; // 0x14
-    field public static final deprecated int AXIS_RX = 12; // 0xc
-    field public static final deprecated int AXIS_RY = 13; // 0xd
-    field public static final deprecated int AXIS_RZ = 14; // 0xe
-    field public static final deprecated int AXIS_SIZE = 3; // 0x3
-    field public static final deprecated int AXIS_THROTTLE = 19; // 0x13
-    field public static final deprecated int AXIS_TILT = 25; // 0x19
-    field public static final deprecated int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final deprecated int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final deprecated int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final deprecated int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final deprecated int AXIS_VSCROLL = 9; // 0x9
-    field public static final deprecated int AXIS_WHEEL = 21; // 0x15
-    field public static final deprecated int AXIS_X = 0; // 0x0
-    field public static final deprecated int AXIS_Y = 1; // 0x1
-    field public static final deprecated int AXIS_Z = 11; // 0xb
-    field public static final deprecated 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 deprecated class VelocityTrackerCompat {
-    method public static deprecated float getXVelocity(android.view.VelocityTracker, int);
-    method public static deprecated 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 deprecated boolean canScrollHorizontally(android.view.View, int);
-    method public static deprecated boolean canScrollVertically(android.view.View, int);
-    method public static void cancelDragAndDrop(android.view.View);
-    method public static deprecated 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 deprecated 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 android.view.Display getDisplay(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 deprecated int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static deprecated android.graphics.Matrix getMatrix(android.view.View);
-    method public static deprecated int getMeasuredHeightAndState(android.view.View);
-    method public static deprecated int getMeasuredState(android.view.View);
-    method public static deprecated 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 deprecated float getPivotX(android.view.View);
-    method public static deprecated float getPivotY(android.view.View);
-    method public static deprecated float getRotation(android.view.View);
-    method public static deprecated float getRotationX(android.view.View);
-    method public static deprecated float getRotationY(android.view.View);
-    method public static deprecated float getScaleX(android.view.View);
-    method public static deprecated 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 deprecated float getTranslationX(android.view.View);
-    method public static deprecated float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static deprecated float getX(android.view.View);
-    method public static deprecated 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 isImportantForAccessibility(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 deprecated 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 deprecated 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 deprecated 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 deprecated 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 deprecated void setActivated(android.view.View, boolean);
-    method public static deprecated void setAlpha(android.view.View, float);
-    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable);
-    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 deprecated 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 deprecated 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 deprecated void setPivotX(android.view.View, float);
-    method public static deprecated void setPivotY(android.view.View, float);
-    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
-    method public static deprecated void setRotation(android.view.View, float);
-    method public static deprecated void setRotationX(android.view.View, float);
-    method public static deprecated void setRotationY(android.view.View, float);
-    method public static deprecated void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static deprecated void setScaleX(android.view.View, float);
-    method public static deprecated 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 setTooltipText(android.view.View, java.lang.CharSequence);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static deprecated void setTranslationX(android.view.View, float);
-    method public static deprecated void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static deprecated void setX(android.view.View, float);
-    method public static deprecated void setY(android.view.View, float);
-    method public static void setZ(android.view.View, float);
-    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
-    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 deprecated int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final deprecated int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final deprecated 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 deprecated int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final deprecated int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final deprecated int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final deprecated int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final deprecated int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final deprecated int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final deprecated 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 deprecated class ViewConfigurationCompat {
-    method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static deprecated 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 deprecated boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static deprecated 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);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
-    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 deprecated 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 deprecated void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public int getAction(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
-    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static deprecated int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public void setAction(android.view.accessibility.AccessibilityEvent, int);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    method public void setMovementGranularity(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_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
-    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 deprecated int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final deprecated 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_CONTEXT_CLICKED = 8388608; // 0x800000
-    field public static final deprecated int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final deprecated int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final deprecated int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final deprecated 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_WINDOWS_CHANGED = 4194304; // 0x400000
-    field public static final deprecated 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.AccessibilityStateChangeListener);
-    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
-    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.AccessibilityStateChangeListener);
-    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
-  }
-
-  public static abstract interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-  }
-
-  public static abstract interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
-    method public abstract void onTouchExplorationStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public deprecated 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 deprecated 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);
-    method public android.view.accessibility.AccessibilityNodeInfo unwrap();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat wrap(android.view.accessibility.AccessibilityNodeInfo);
-    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 deprecated int getAddedCount();
-    method public deprecated java.lang.CharSequence getBeforeText();
-    method public deprecated java.lang.CharSequence getClassName();
-    method public deprecated java.lang.CharSequence getContentDescription();
-    method public deprecated int getCurrentItemIndex();
-    method public deprecated int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public deprecated int getItemCount();
-    method public deprecated int getMaxScrollX();
-    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
-    method public deprecated int getMaxScrollY();
-    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
-    method public deprecated android.os.Parcelable getParcelableData();
-    method public deprecated int getRemovedCount();
-    method public deprecated int getScrollX();
-    method public deprecated int getScrollY();
-    method public deprecated android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public deprecated java.util.List<java.lang.CharSequence> getText();
-    method public deprecated int getToIndex();
-    method public deprecated int getWindowId();
-    method public deprecated boolean isChecked();
-    method public deprecated boolean isEnabled();
-    method public deprecated boolean isFullScreen();
-    method public deprecated boolean isPassword();
-    method public deprecated boolean isScrollable();
-    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public deprecated void recycle();
-    method public deprecated void setAddedCount(int);
-    method public deprecated void setBeforeText(java.lang.CharSequence);
-    method public deprecated void setChecked(boolean);
-    method public deprecated void setClassName(java.lang.CharSequence);
-    method public deprecated void setContentDescription(java.lang.CharSequence);
-    method public deprecated void setCurrentItemIndex(int);
-    method public deprecated void setEnabled(boolean);
-    method public deprecated void setFromIndex(int);
-    method public deprecated void setFullScreen(boolean);
-    method public deprecated void setItemCount(int);
-    method public deprecated void setMaxScrollX(int);
-    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
-    method public deprecated void setMaxScrollY(int);
-    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
-    method public deprecated void setParcelableData(android.os.Parcelable);
-    method public deprecated void setPassword(boolean);
-    method public deprecated void setRemovedCount(int);
-    method public deprecated void setScrollX(int);
-    method public deprecated void setScrollY(int);
-    method public deprecated void setScrollable(boolean);
-    method public deprecated void setSource(android.view.View);
-    method public deprecated void setSource(android.view.View, int);
-    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View, int);
-    method public deprecated 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 deprecated EdgeEffectCompat(android.content.Context);
-    method public deprecated boolean draw(android.graphics.Canvas);
-    method public deprecated void finish();
-    method public deprecated boolean isFinished();
-    method public deprecated boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public deprecated boolean onPull(float, float);
-    method public static void onPull(android.widget.EdgeEffect, float, float);
-    method public deprecated boolean onRelease();
-    method public deprecated 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 deprecated class ScrollerCompat {
-    method public deprecated void abortAnimation();
-    method public deprecated boolean computeScrollOffset();
-    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public deprecated void fling(int, int, int, int, int, int, int, int);
-    method public deprecated void fling(int, int, int, int, int, int, int, int, int, int);
-    method public deprecated float getCurrVelocity();
-    method public deprecated int getCurrX();
-    method public deprecated int getCurrY();
-    method public deprecated int getFinalX();
-    method public deprecated int getFinalY();
-    method public deprecated boolean isFinished();
-    method public deprecated boolean isOverScrolled();
-    method public deprecated void notifyHorizontalEdgeReached(int, int, int);
-    method public deprecated void notifyVerticalEdgeReached(int, int, int);
-    method public deprecated boolean springBack(int, int, int, int, int, int);
-    method public deprecated void startScroll(int, int, int, int);
-    method public deprecated void startScroll(int, int, int, int, int);
-  }
-
-  public final deprecated class SearchViewCompat {
-    method public static deprecated java.lang.CharSequence getQuery(android.view.View);
-    method public static deprecated boolean isIconified(android.view.View);
-    method public static deprecated boolean isQueryRefinementEnabled(android.view.View);
-    method public static deprecated boolean isSubmitButtonEnabled(android.view.View);
-    method public static deprecated android.view.View newSearchView(android.content.Context);
-    method public static deprecated void setIconified(android.view.View, boolean);
-    method public static deprecated void setImeOptions(android.view.View, int);
-    method public static deprecated void setInputType(android.view.View, int);
-    method public static deprecated void setMaxWidth(android.view.View, int);
-    method public static deprecated void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListener);
-    method public static deprecated void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListener);
-    method public static deprecated void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static deprecated void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static deprecated void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static deprecated void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static deprecated void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract deprecated interface SearchViewCompat.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract deprecated class SearchViewCompat.OnCloseListenerCompat implements android.support.v4.widget.SearchViewCompat.OnCloseListener {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract deprecated interface SearchViewCompat.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract deprecated class SearchViewCompat.OnQueryTextListenerCompat implements android.support.v4.widget.SearchViewCompat.OnQueryTextListener {
-    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 int getProgressViewEndOffset();
-    method public int getProgressViewStartOffset();
-    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 android.graphics.drawable.Drawable[] getCompoundDrawablesRelative(android.widget.TextView);
-    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.support.v7.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public boolean isDrawerSlideAnimationEnabled();
-    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 setDrawerArrowDrawable(android.support.v7.graphics.drawable.DrawerArrowDrawable);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setDrawerSlideAnimationEnabled(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 onStart();
-    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.support.v7.app.AppCompatDialog {
-    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();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.DecoratedCustomViewStyle();
-  }
-
-  public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v7.app.NotificationCompat.MediaStyle {
-    ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
-  }
-
-  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);
-    method public static android.graphics.drawable.Drawable getDrawable(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 getDominantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDominantSwatch();
-    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 getBluetoothRoute();
-    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 isBluetooth();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isDeviceSpeaker();
-    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 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 MultiSelectListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public MultiSelectListPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat 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 public android.support.v7.preference.PreferenceGroup getParent();
-    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.PreferenceManager.PreferenceComparisonCallback getPreferenceComparisonCallback();
-    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 void setPreferenceComparisonCallback(android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback);
-    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 static abstract class PreferenceManager.PreferenceComparisonCallback {
-    ctor public PreferenceManager.PreferenceComparisonCallback();
-    method public abstract boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
-    method public abstract boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
-  }
-
-  public static class PreferenceManager.SimplePreferenceComparisonCallback extends android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback {
-    ctor public PreferenceManager.SimplePreferenceComparisonCallback();
-    method public boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
-    method public boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, 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 SeekBarPreference extends android.support.v7.preference.Preference {
-    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet);
-    ctor public SeekBarPreference(android.content.Context);
-    method public int getMax();
-    method public int getMin();
-    method public final int getSeekBarIncrement();
-    method public int getValue();
-    method public boolean isAdjustable();
-    method public void setAdjustable(boolean);
-    method public final void setMax(int);
-    method public void setMin(int);
-    method public final void setSeekBarIncrement(int);
-    method public void setValue(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;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class AsyncListUtil<T> {
-    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<T> {
-    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 BatchingListUpdateCallback implements android.support.v7.util.ListUpdateCallback {
-    ctor public BatchingListUpdateCallback(android.support.v7.util.ListUpdateCallback);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int, java.lang.Object);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public class DiffUtil {
-    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback);
-    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback, boolean);
-  }
-
-  public static abstract class DiffUtil.Callback {
-    ctor public DiffUtil.Callback();
-    method public abstract boolean areContentsTheSame(int, int);
-    method public abstract boolean areItemsTheSame(int, int);
-    method public java.lang.Object getChangePayload(int, int);
-    method public abstract int getNewListSize();
-    method public abstract int getOldListSize();
-  }
-
-  public static class DiffUtil.DiffResult {
-    method public void dispatchUpdatesTo(android.support.v7.widget.RecyclerView.Adapter);
-    method public void dispatchUpdatesTo(android.support.v7.util.ListUpdateCallback);
-  }
-
-  public abstract interface ListUpdateCallback {
-    method public abstract void onChanged(int, int, java.lang.Object);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-  public class SortedList<T> {
-    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<T2> 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<T2> implements java.util.Comparator android.support.v7.util.ListUpdateCallback {
-    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 void onChanged(int, int, java.lang.Object);
-  }
-
-}
-
-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 DividerItemDecoration extends android.support.v7.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setOrientation(int);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  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 getGravity();
-    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 android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
-    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 deprecated int getInitialItemPrefetchCount();
-    method public int getInitialPrefetchItemCount();
-    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 setInitialPrefetchItemCount(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 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 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 LinearSnapHelper extends android.support.v7.widget.SnapHelper {
-    ctor public LinearSnapHelper();
-    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
-  }
-
-  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 PagerSnapHelper extends android.support.v7.widget.SnapHelper {
-    ctor public PagerSnapHelper();
-    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
-  }
-
-  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 void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.OnFlingListener getOnFlingListener();
-    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 void setOnFlingListener(android.support.v7.widget.RecyclerView.OnFlingListener);
-    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 smoothScrollBy(int, int, android.view.animation.Interpolator);
-    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<VH extends android.support.v7.widget.RecyclerView.ViewHolder> {
-    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 void collectAdjacentPrefetchPositions(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    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 final boolean isItemPrefetchEnabled();
-    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 boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
-    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 boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, 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 final void setItemPrefetchEnabled(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 abstract interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
-    method public abstract void addPosition(int, int);
-  }
-
-  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 class RecyclerView.OnFlingListener {
-    ctor public RecyclerView.OnFlingListener();
-    method public abstract boolean onFling(int, int);
-  }
-
-  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 int getRecycledViewCount(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 abstract interface RecyclerView.SmoothScroller.ScrollVectorProvider {
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public <T> 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 static class RecyclerViewAccessibilityDelegate.ItemDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-  }
-
-  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 abstract class SnapHelper extends android.support.v7.widget.RecyclerView.OnFlingListener {
-    ctor public SnapHelper();
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView) throws java.lang.IllegalStateException;
-    method public abstract int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
-    method protected android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
-    method public boolean onFling(int, int);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(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 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;
-  }
-
-  public class TooltipCompat {
-    method public static void setTooltipText(android.view.View, java.lang.CharSequence);
-  }
-
-}
-
-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<T2> 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);
-  }
-
-}
-
-package android.support.wearable.view {
-
-  public class BoxInsetLayout extends android.view.ViewGroup {
-    ctor public BoxInsetLayout(android.content.Context);
-    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected void onLayout(boolean, int, int, int, int);
-  }
-
-  public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BoxInsetLayout.LayoutParams(int, int);
-    ctor public BoxInsetLayout.LayoutParams(int, int, int);
-    ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
-    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public BoxInsetLayout.LayoutParams(android.support.wearable.view.BoxInsetLayout.LayoutParams);
-    field public static final int BOX_ALL = 15; // 0xf
-    field public static final int BOX_BOTTOM = 8; // 0x8
-    field public static final int BOX_LEFT = 1; // 0x1
-    field public static final int BOX_NONE = 0; // 0x0
-    field public static final int BOX_RIGHT = 4; // 0x4
-    field public static final int BOX_TOP = 2; // 0x2
-    field public int boxedEdges;
-  }
-
-  public class CurvedOffsettingLayoutManager extends android.support.wearable.view.WearableRecyclerView.OffsettingLayoutManager {
-    ctor public CurvedOffsettingLayoutManager(android.content.Context);
-    method public void adjustAnchorOffsetXY(android.view.View, float[]);
-    method public void updateChild(android.view.View, android.support.wearable.view.WearableRecyclerView);
-  }
-
-  public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
-    ctor public SwipeDismissFrameLayout(android.content.Context);
-    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int, int);
-    method public void addCallback(android.support.wearable.view.SwipeDismissFrameLayout.Callback);
-    method public void removeCallback(android.support.wearable.view.SwipeDismissFrameLayout.Callback);
-    method public void reset();
-  }
-
-  public static abstract class SwipeDismissFrameLayout.Callback {
-    ctor public SwipeDismissFrameLayout.Callback();
-    method public void onDismissed(android.support.wearable.view.SwipeDismissFrameLayout);
-    method public void onSwipeCancelled();
-    method public void onSwipeStarted();
-  }
-
-  public class WearableRecyclerView extends android.support.v7.widget.RecyclerView {
-    ctor public WearableRecyclerView(android.content.Context);
-    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int);
-    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int, int);
-    method public float getBezelWidthFraction();
-    method public boolean getEdgeItemsCenteringEnabled();
-    method public float getScrollDegreesPerScreen();
-    method public boolean isCircularScrollingGestureEnabled();
-    method public void setBezelWidthFraction(float);
-    method public void setCircularScrollingGestureEnabled(boolean);
-    method public void setEdgeItemsCenteringEnabled(boolean);
-    method public void setScrollDegreesPerScreen(float);
-  }
-
-  public static abstract class WearableRecyclerView.OffsettingLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public WearableRecyclerView.OffsettingLayoutManager(android.content.Context);
-    method public abstract void updateChild(android.view.View, android.support.wearable.view.WearableRecyclerView);
-  }
-
-}
-
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index aa7f93e..3e524fa 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -26,12 +26,12 @@
 libs.espresso_contrib = 'com.android.support.test.espresso:espresso-contrib:2.3-alpha'
 
 // Keep gradle plugin version in sync with ub_supportlib-master manifest.
-libs.gradle = 'com.android.tools.build:gradle:2.3.0'
+libs.gradle = 'com.android.tools.build:gradle:2.4.0-alpha6'
 
 // Other dependencies
 libs.xml_parser_apis = 'xerces:xmlParserAPIs:2.6.2'
 libs.xerces_impl = 'xerces:xercesImpl:2.6.2'
-libs.error_prone = 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.9'
+libs.error_prone = 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.10'
 
 // jarjar plugin
 libs.jarjar_gradle = 'org.anarres.jarjar:jarjar-gradle:1.0.0'
diff --git a/buildSrc/diff_and_docs.gradle b/buildSrc/diff_and_docs.gradle
index 4e54632..603b54d 100644
--- a/buildSrc/diff_and_docs.gradle
+++ b/buildSrc/diff_and_docs.gradle
@@ -25,6 +25,9 @@
 
 import groovy.io.FileType
 
+import java.util.regex.Matcher
+import java.util.regex.Pattern
+
 // Set up platform API files for federation.
 if (project.androidApiTxt != null) {
     task generateSdkApi(type: Copy) {
@@ -69,7 +72,8 @@
 task generateDocs(type: DoclavaTask, dependsOn: [configurations.doclava, generateSdkApi]) {
     def offlineDocs = project.buildOfflineDocs
     group = JavaBasePlugin.DOCUMENTATION_GROUP
-    description = 'Generates d.android.com-style documentation.'
+    description = 'Generates d.android.com-style documentation. To generate offline docs use ' +
+            '\'-PofflineDocs=true\' parameter.'
 
     docletpath = configurations.doclava.resolve()
     destinationDir = new File(project.docsDir, offlineDocs ? "offline" : "online")
@@ -100,7 +104,7 @@
 
     // Default hidden errors + hidden superclass (111) and
     // deprecation mismatch (113) to match framework docs.
-    final def hidden = [105, 107, 111, 112, 113, 115, 116, 121]
+    final def hidden = [105, 106, 107, 111, 112, 113, 115, 116, 121]
 
     doclavaErrors = (101..122) - hidden
     doclavaWarnings = []
@@ -142,6 +146,74 @@
     }
 }
 
+def MSG_HIDE_API =
+        "If you are adding APIs that should be excluded from the public API surface,\n" +
+        "consider using package or private visibility. If the API must have public\n" +
+        "visibility, you may exclude it from public API by using the @hide javadoc\n" +
+        "annotation paired with the @RestrictTo(LIBRARY_GROUP) code annotation."
+
+// Check that the API we're building hasn't broken compatibility with the
+// previously released version. These types of changes are forbidden.
+def CHECK_API_CONFIG_RELEASE = [
+    onFailMessage:
+            "Compatibility with previously released public APIs has been broken. Please\n" +
+            "verify your change with Support API Council and provide error output,\n" +
+            "including the error messages and associated SHAs.\n" +
+            "\n" +
+            "If you are removing APIs, they must be deprecated first before being removed\n" +
+            "in a subsequent release.\n" +
+            "\n" + MSG_HIDE_API,
+    errors: (7..18),
+    warnings: [],
+    hidden: (2..6) + (19..30)
+]
+
+// Check that the API we're building hasn't changed from the development
+// version. These types of changes require an explicit API file update.
+def CHECK_API_CONFIG_DEVELOP = [
+    onFailMessage:
+            "Public API definition has changed. Please run ./gradlew updateApi to confirm\n" +
+            "these changes are intentional by updating the public API definition.\n" +
+            "\n" + MSG_HIDE_API,
+    errors: (2..30)-[22],
+    warnings: [],
+    hidden: [22]
+]
+
+// This is a patch or finalized release. Check that the API we're building
+// hasn't changed from the current.
+def CHECK_API_CONFIG_PATCH = [
+    onFailMessage:
+            "Public API definition may not change in finalized or patch releases.\n" +
+            "\n" + MSG_HIDE_API,
+    errors: (2..30)-[22],
+    warnings: [],
+    hidden: [22]
+]
+
+CheckApiTask createCheckApiTask(String taskName, def checkApiConfig, File oldApi, File newApi,
+                                File whitelist = null) {
+    return tasks.create(name: taskName, type: CheckApiTask.class) {
+        doclavaClasspath = generateApi.docletpath
+
+        onFailMessage = checkApiConfig.onFailMessage
+        checkApiErrors = checkApiConfig.errors
+        checkApiWarnings = checkApiConfig.warnings
+        checkApiHidden = checkApiConfig.hidden
+
+        newApiFile = newApi
+        oldApiFile = oldApi
+        newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
+        oldRemovedApiFile = new File(supportRootFolder, 'api/removed.txt')
+
+        whitelistErrorsFile = whitelist
+
+        doLast {
+            logger.lifecycle "Verified ${newApi.name} against ${oldApi.name}..."
+        }
+    }
+}
+
 // Generates API files.
 task generateApi(type: DoclavaTask, dependsOn: configurations.doclava) {
     docletpath = configurations.doclava.resolve()
@@ -163,96 +235,103 @@
     exclude '**/R.java'
 }
 
-// Copies generated API files to current version.
-task updateApi(type: UpdateApiTask, dependsOn: generateApi) {
-    group JavaBasePlugin.VERIFICATION_GROUP
-    description 'Invoke Doclava\'s ApiCheck tool to update current.txt based on current changes.'
-    newApiFile = new File(project.docsDir, 'release/current.txt')
-    oldApiFile = new File(supportRootFolder, 'api/current.txt')
-    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
-    oldRemovedApiFile = new File(supportRootFolder, 'api/removed.txt')
-}
+/**
+ * Returns the most recent API, optionally restricting to APIs before
+ * <code>beforeApi</code>.
+ *
+ * @param refApi the reference API version, ex. 25.0.0-SNAPSHOT
+ * @return the most recently released API file
+ */
+File getApiFile(String refApi = supportVersion, boolean previous = false, boolean release = false) {
+    def refMatcher = refApi =~ /^(\d+)\.(\d+)\.(\d+)(-.+)?$/
+    def refMajor = refMatcher[0][1] as int
+    def refMinor = refMatcher[0][2] as int
+    def refPatch = refMatcher[0][3] as int
+    def refExtra = refMatcher[0][4]
 
-// Finalizes the API file for a release version.
-task finalizeApi(type: Copy, dependsOn: updateApi) {
-    group JavaBasePlugin.VERIFICATION_GROUP
-    description 'Finalize the API definition for the current release.'
+    File apiDir = new File(ext.supportRootFolder, 'api')
 
-    def apiVersion = project.supportVersion;
-    if (project.hasProperty("revision")) {
-        apiVersion = revision;
+    if (!previous) {
+        // If this is a patch or release version, ignore the extra.
+        return new File(apiDir, "$refMajor.$refMinor.0" +
+                (refPatch || release ? "" : refExtra) + ".txt")
     }
 
-    File currentApiFile = new File(project.rootDir, 'api/current.txt')
-    File finalizedApiFile = new File(currentApiFile.parentFile, "${apiVersion}.txt")
+    File lastFile = null
+    def lastMajor
+    def lastMinor
 
-    from currentApiFile.absolutePath
-    into finalizedApiFile.parent
-    rename { finalizedApiFile.name }
+    // Only look at released versions, e.g. X.Y.0.txt.
+    apiDir.eachFileMatch FileType.FILES, ~/(\d+)\.(\d+)\.0\.txt/, { File file ->
+        def matcher = file.name =~ /(\d+)\.(\d+)\.0\.txt/
+        def major = matcher[0][1] as int
+        def minor = matcher[0][2] as int
 
-    doFirst {
-        // Verify this is a proper release version.
-        if (!(apiVersion ==~ /^\d+\.\d+\.\d+$/)) {
-            throw new InvalidUserDataException("${apiVersion} is not valid release version format. "
-                    + "Use -Prevision=X.Y.Z to specify an explicit version.")
-        }
-
-        // Verify that we're not accidentally overwriting an existing API file.
-        if (finalizedApiFile.exists() && !(project.hasProperty("overwrite") && overwrite)) {
-            throw new InvalidUserDataException("Version ${apiVersion} has already been "
-                    + "finalized. Use -Poverwrite=true to overwrite.")
+        if (lastFile == null || major > lastMajor || (major == lastMajor && minor > lastMinor)) {
+            if (refMajor > major || (refMajor == major && refMinor > minor)) {
+                lastFile = file
+                lastMajor = major;
+                lastMinor = minor;
+            }
         }
     }
 
-    doLast {
-        project.logger.warn("Wrote ${finalizedApiFile.getParentFile().name}/"
-                + "${finalizedApiFile.name} API file.")
-    }
+    return lastFile
 }
 
-// Checks generated API files against current version.
-task checkApi(type: CheckApiTask, dependsOn: generateApi) {
-    doclavaClasspath = generateApi.docletpath
-
-    checkApiTaskPath = name
-    updateApiTaskPath = updateApi.name
-
-    // Check that the API we're building hasn't changed from the development
-    // version. These typed of changes require an explicit API file update.
-    checkApiErrors = (2..30)-[22]
-    checkApiWarnings = []
-    checkApiHidden = [22]
-
-    newApiFile = new File(project.docsDir, 'release/current.txt')
-    oldApiFile = new File(supportRootFolder, 'api/current.txt')
-    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
-    oldRemovedApiFile = new File(supportRootFolder, 'api/removed.txt')
+String stripExtension(String fileName) {
+    return fileName[0..fileName.lastIndexOf('.')-1]
 }
 
+// Make sure the API surface has not broken since the last release.
+def isPatchVersion = supportVersion ==~ /\d+\.\d+.[1-9]\d*(-.+)?/
+def isSnapshotVersion = supportVersion ==~ /\d+\.\d+.\d+-SNAPSHOT/
+def previousApiFile = getApiFile(project.supportVersion, !isPatchVersion)
+def whitelistFile = new File(
+        previousApiFile.parentFile, stripExtension(previousApiFile.name) + ".ignore")
+def checkApiRelease = createCheckApiTask("checkApiRelease", CHECK_API_CONFIG_RELEASE,
+        previousApiFile, generateApi.apiFile, whitelistFile).dependsOn(generateApi)
+
+// Allow a comma-delimited list of whitelisted errors.
+if (project.hasProperty("ignore")) {
+    checkApiRelease.whitelistErrors = ignore.split(',')
+}
+
+// Check whether the development API surface has changed.
+def verifyConfig = isPatchVersion != 0 ? CHECK_API_CONFIG_DEVELOP : CHECK_API_CONFIG_PATCH;
+def checkApi = createCheckApiTask("checkApi", verifyConfig, getApiFile(), generateApi.apiFile)
+        .dependsOn(generateApi, checkApiRelease)
+
+checkApi.group JavaBasePlugin.VERIFICATION_GROUP
+checkApi.description 'Verify the API surface.'
+
 rootProject.createArchive.dependsOn checkApi
 
-
-// Checks generated API files against current version.
-task checkApiStable(type: CheckApiTask, dependsOn: generateApi) {
-    doclavaClasspath = generateApi.docletpath
-
-    checkApiTaskPath = name
-    updateApiTaskPath = updateApi.name
-
-    // Check that the API we're building hasn't broken the last-released
-    // library version. These types of changes are forbidden.
-    checkApiErrors = (7..18)
-    checkApiWarnings = [23, 24]
-    checkApiHidden = (2..6) + (19..22) + (25..30)
-
-    newApiFile = new File(project.docsDir, 'release/current.txt')
-    oldApiFile = getReleasedApiFile()
-    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
-    oldRemovedApiFile = new File(supportRootFolder, 'api/removed.txt')
+task verifyUpdateApiAllowed() {
+    // This could be moved to doFirst inside updateApi, but using it as a
+    // dependency with no inputs forces it to run even when updateApi is a
+    // no-op.
+    doLast {
+        if (isPatchVersion) {
+            throw new GradleException("Public APIs may not be modified in patch releases.")
+        } else if (isSnapshotVersion && getApiFile(supportVersion, false, true).exists()) {
+            throw new GradleException("Inconsistent version. Public API file already exists.")
+        } else if (!isSnapshotVersion && getApiFile().exists() && !project.hasProperty("force")) {
+            throw new GradleException("Public APIs may not be modified in finalized releases.")
+        }
+    }
 }
 
-checkApi.dependsOn checkApiStable
-
+task updateApi(type: UpdateApiTask, dependsOn: [checkApiRelease, verifyUpdateApiAllowed]) {
+    group JavaBasePlugin.VERIFICATION_GROUP
+    description 'Updates the candidate API file to incorporate valid changes.'
+    newApiFile = checkApiRelease.newApiFile
+    oldApiFile = getApiFile()
+    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
+    oldRemovedApiFile = new File(supportRootFolder, 'api/removed.txt')
+    whitelistErrors = checkApiRelease.whitelistErrors
+    whitelistErrorsFile = checkApiRelease.whitelistErrorsFile
+}
 
 /**
  * Converts the <code>toApi</code>.txt file (or current.txt if not explicitly
@@ -289,10 +368,10 @@
     } else if (project.hasProperty("toApi") && toApi.matches(~/(\d+\.){2}\d+/)) {
         // If toApi matches released API (X.Y.Z) format, use the most recently
         // released API file prior to toApi.
-        inputApiFile = getReleasedApiFile(toApi)
+        inputApiFile = getApiFile(toApi, true)
     } else {
         // Use the most recently released API file.
-        inputApiFile = getReleasedApiFile();
+        inputApiFile = getApiFile();
     }
 
     int lastDot = inputApiFile.name.lastIndexOf('.')
@@ -351,31 +430,6 @@
     exclude '**/R.java'
 }
 
-/**
- * Returns the most recently released API, optionally restricting to APIs
- * before <code>beforeApi</code>.
- *
- * @param beforeApi the API to find an API file before, ex. 25.0.0
- * @return the most recently released API file
- */
-File getReleasedApiFile(String beforeApi = null) {
-    String beforeApiFileName = beforeApi != null ? beforeApi + ".txt" : null
-    File lastReleasedApiFile = null
-    File apiDir = new File(ext.supportRootFolder, 'api')
-
-    apiDir.eachFileMatch FileType.FILES, ~/(\d+\.){3}txt/, { File apiFile ->
-        // Is the current API file newer than the last one we saw?
-        if (lastReleasedApiFile == null || apiFile.name > lastReleasedApiFile.name) {
-            // Is the current API file older than the "before" API?
-            if (beforeApiFileName == null || apiFile.name < beforeApiFileName) {
-                lastReleasedApiFile = apiFile
-            }
-        }
-    }
-
-    return lastReleasedApiFile
-}
-
 // configuration file for setting up api diffs and api docs
 void registerForDocsTask(Task task, Project subProject, releaseVariant) {
     task.dependsOn releaseVariant.javaCompile
@@ -385,7 +439,7 @@
                 fileTree(releaseVariant.aidlCompile.sourceOutputDir) +
                 fileTree(releaseVariant.outputs[0].processResources.sourceOutputDir)
     }
-    task.classpath += files(releaseVariant.javaCompile.classpath) +
+    task.classpath += files{releaseVariant.javaCompile.classpath.files} +
             files(releaseVariant.javaCompile.destinationDir)
 }
 
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index 673f6f8..116ca21 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -284,14 +284,6 @@
                             Charsets.UTF_8)
                 })
 
-                task createSeparateZip(type: Zip, dependsOn: generateSourceProps) {
-                    into archivesBaseName
-                    destinationDir rootProject.ext.distDir
-                    baseName = project.group
-                    version = rootProject.ext.buildNumber
-                }
-                rootProject.createArchive.dependsOn createSeparateZip
-
                 // Before the upload, make sure the repo is ready.
                 release.dependsOn rootProject.tasks.prepareRepo
 
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
index 4320258..ed61667 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
@@ -59,6 +59,12 @@
             testInstrumentationRunner INSTRUMENTATION_RUNNER
         }
 
+        // A workaround for b.android.com/293641 where Android Gradle Plugin delays Jacoco
+        // dependency resolution if it is not set explicitly.
+        project.dependencies {
+            androidJacocoAnt "org.jacoco:org.jacoco.ant:0.7.5.201505241946"
+        }
+
         library.signingConfigs {
             debug {
                 // Use a local debug keystore to avoid build server issues.
diff --git a/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy b/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
index c10bc9c..15b4594 100644
--- a/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
+++ b/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
@@ -29,130 +29,64 @@
 import org.gradle.api.tasks.OutputFile
 import org.gradle.process.ExecResult
 
+import java.security.MessageDigest
+
 /**
- * A task to invoke Doclava's ApiCheck tool.
+ * Task used to verify changes between two API files.
  * <p>
- * By default, any API changes will be flagged as errors (strict mode). This
- * can be loosened to merely backwards compatibility checks using
- * {@link #configureAsBackwardsCompatCheck()}.
+ * This task may be configured to ignore, warn, or fail with a message for a specific set of
+ * Doclava-defined error codes. See {@link com.google.doclava.Errors} for a complete list of
+ * supported error codes.
+ * <p>
+ * Specific failures may be ignored by specifying a list of SHAs in {@link #whitelistErrors}. Each
+ * SHA is unique to a specific API change and is logged to the error output on failure.
  */
 @ParallelizableTask
 public class CheckApiTask extends DefaultTask {
+    /** Character that resets console output color. */
+    private static final String ANSI_RESET = "\u001B[0m";
 
-    // see external/doclava/src/com/google/doclava/Errors.java for error code meanings.
+    /** Character that sets console output color to red. */
+    private static final String ANSI_RED = "\u001B[31m";
 
-    // 2-6 are all the error represented added APIs.
-    private static final def API_ADDITIONS = (2..6)
+    /** Character that sets console output color to yellow. */
+    private static final String ANSI_YELLOW = "\u001B[33m";
 
-    // Everything past the addition errors except for:
-    // 15: CHANGED_VOLATILE
-    // 17: CHANGED_VALUE
-    // 22: CHANGED_NATIVE
-    // 27: REMOVED_FINAL
-    private static final def API_CHANGES_AND_REMOVALS = (7..27) - [15, 17, 22, 27]
-
-    // ApiCheck error types which will cause the build to fail
-    // Basically, error on everything but
-    // 15: CHANGED_VOLATILE
-    // 17: CHANGED_VALUE
-    // 22: CHANGED_NATIVE
-    // 27: REMOVED_FINAL
-    // But include the "catch all"
-    // 1: PARSE_ERROR
-    public static final def DEFAULT_CHECK_API_ERRORS = Collections.unmodifiableSet(
-            ([1] + API_ADDITIONS + API_CHANGES_AND_REMOVALS) as Set
-    )
-
-    // Ones we want to emit warnings for.
-    // 15: CHANGED_VOLATILE
-    // 17: CHANGED_VALUE
-    // 27: REMOVED_FINAL
-    public static final def DEFAULT_CHECK_API_WARNINGS = Collections.unmodifiableSet(
-            [15, 17, 27] as Set
-    )
-
-    // Ones to just to just ignore as they usually aren't useful.
-    // 22: CHANGED_NATIVE
-    public static final def DEFAULT_CHECK_API_HIDDEN = Collections.singleton(22)
-
-    // ApiCheck error types for backwards compatiblity API checks which will cause the build to fail.
-    // Allow additions, but not removals or changes, except for deprecation changes.
-    // 24: CHANGED_DEPRECATED
-    // But include the "catch all"
-    // 1: PARSE_ERROR
-    public static final def DEFAULT_CHECK_API_BACKWARDS_COMPAT_ERRORS = Collections.unmodifiableSet(
-            ([1] + API_CHANGES_AND_REMOVALS - [24]) as Set
-    )
-
-    // Same as the normal warnings, but with deprecation added as a warning type.
-    public static final def DEFAULT_CHECK_API_BACKWARDS_COMPAT_WARNINGS = Collections.unmodifiableSet(
-            (DEFAULT_CHECK_API_WARNINGS + [24]) as Set
-    )
-
-    // Same as the normal hidden ones + all API addition errors.
-    public static final def DEFAULT_CHECK_API_BACKWARDS_COMPAT_HIDDEN = Collections.unmodifiableSet(
-            (DEFAULT_CHECK_API_HIDDEN + API_ADDITIONS) as Set
-    )
-
-
-    // Error messages shamelessly ripped from AOSP's check-api error message.
-    // For these templates, the parameters are:
-    // See #getOnFailMessage()
-    // 1: oldApiFile.name
-    // 2: oldRemovedApiFile.name
-    // 3: updateApiTaskPath
-    // 4: checkApiTaskPath
-    private static final String DEFAULT_ERROR_MESSAGE_WITH_UPDATE_TASK =
-            '''******************************
-You have tried to change the 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 %1$s and %2$s
-      by executing the following command:
-          ./gradlew %3$s
-
-      To submit the revised %1$s and %2$s
-      to the main repository, you will need approval.
-
-   You can re-run just the API checks using the command:
-       ./gradlew %4$s
-******************************'''
-
-    private static final String DEFAULT_ERROR_MESSAGE_WITHOUT_UPDATE_TASK =
-            '''******************************
-    You have tried to change the API from what has been previously approved.
-
-    To make these errors go away you can add "@hide" javadoc comments to the methods, etc. listed
-    in the errors above.
-
-    You can re-run just the API checks using the command:
-        ./gradlew %4$s
-******************************'''
-
-    private static final String DEFAULT_ERROR_MESSAGE_FOR_BACKWARDS_COMPAT =
-            '''******************************
-    You have tried to change the API from what has been previously released in
-    an SDK.  Please fix the errors listed above.
-
-    You can re-run just the API checks using the command:
-        ./gradlew %4$s
-******************************'''
-
+    /** API file that represents the existing API surface. */
     @InputFile
     File oldApiFile
+
+    /** API file that represents the existing API surface's removals. */
     @InputFile
     File oldRemovedApiFile
 
+    /** API file that represents the candidate API surface. */
     @InputFile
     File newApiFile
+
+    /** API file that represents the candidate API surface's removals. */
     @InputFile
     File newRemovedApiFile
 
+    /** Optional file containing a newline-delimited list of error SHAs to ignore. */
+    @Nullable
+    File whitelistErrorsFile
+
+    @Optional
+    @Nullable
+    @InputFile
+    File getWhiteListErrorsFileInput() {
+        // Gradle requires non-null InputFiles to exist -- even with Optional -- so work around that
+        // by returning null for this field if the file doesn't exist.
+        if (whitelistErrorsFile && whitelistErrorsFile.exists()) {
+            return whitelistErrorsFile;
+        }
+        return null;
+    }
+
     /**
-     * If non-null, the list of packages to ignore any API checks on.<br>
+     * Optional list of packages to ignore.
+     * <p>
      * Packages names will be matched exactly; sub-packages are not automatically recognized.
      */
     @Optional
@@ -161,8 +95,9 @@
     Collection ignoredPackages = null
 
     /**
-     * If non-null, the list of classes to ignore any API checks on.<br>
-     * Class names will be matched exactly by their full qualified names; inner classes are not
+     * Optional list of classes to ignore.
+     * <p>
+     * Class names will be matched exactly by their fully-qualified names; inner classes are not
      * automatically recognized.
      */
     @Optional
@@ -170,6 +105,15 @@
     @Input
     Collection ignoredClasses = null
 
+    /**
+     * Optional set of error SHAs to ignore.
+     * <p>
+     * Each error SHA is unique to a specific API change.
+     */
+    @Optional
+    @Input
+    Set whitelistErrors = []
+
     @InputFiles
     Collection<File> doclavaClasspath
 
@@ -189,28 +133,33 @@
         mOutputFile = outputFile
     }
 
+    /**
+     * List of Doclava error codes to treat as errors.
+     * <p>
+     * See {@link com.google.doclava.Errors} for a complete list of error codes.
+     */
     @Input
-    Collection checkApiErrors = DEFAULT_CHECK_API_ERRORS
+    Collection checkApiErrors
 
+    /**
+     * List of Doclava error codes to treat as warnings.
+     * <p>
+     * See {@link com.google.doclava.Errors} for a complete list of error codes.
+     */
     @Input
-    Collection checkApiWarnings = DEFAULT_CHECK_API_WARNINGS
+    Collection checkApiWarnings
 
+    /**
+     * List of Doclava error codes to ignore.
+     * <p>
+     * See {@link com.google.doclava.Errors} for a complete list of error codes.
+     */
     @Input
-    Collection checkApiHidden = DEFAULT_CHECK_API_HIDDEN
+    Collection checkApiHidden
 
-    // The following are optional. They are only used for constructing the failure message.
-    @Nullable
-    @Optional
-    String checkApiTaskPath;
-    @Nullable
-    @Optional
-    String updateApiTaskPath;
-
-    private String checkApiTaskPathToPrint() {
-        return getCheckApiTaskPath() ?: this.path
-    }
-
-    private def mOnFailMessage
+    /** Message to display on API check failure. */
+    @Input
+    String onFailMessage
 
     public CheckApiTask() {
         group = 'Verification'
@@ -218,7 +167,8 @@
     }
 
     private Set<File> collectAndVerifyInputs() {
-        Set<File> apiFiles = [getOldApiFile(), getNewApiFile(), getOldRemovedApiFile(), getNewRemovedApiFile()] as Set
+        Set<File> apiFiles = [getOldApiFile(), getNewApiFile(), getOldRemovedApiFile(),
+                              getNewRemovedApiFile()] as Set
         if (apiFiles.size() != 4) {
             throw new InvalidUserDataException("""Conflicting input files:
     oldApiFile: ${getOldApiFile()}
@@ -230,70 +180,6 @@
         return apiFiles;
     }
 
-    /**
-     * Returns the preprocessed failure message.<br>
-     * This string will be passed to {@link String#format(String, Object[])} as the format
-     * string with the given parameters to get the failure message.<br>
-     * The arguments used are:<br>
-     * 1 (String): oldApiFile.name<br>
-     * 2 (String): oldRemovedApiFile.name<br>
-     * 3 (String): updateApiTaskPath<br>
-     * 4 (String): checkApiTaskPath<br>
-     * The format string need not use all, or even any, of these arguments.
-     */
-    public String getOnFailMessage() {
-        return (mOnFailMessage == null ?
-                (getUpdateApiTaskPath() == null ?
-                        DEFAULT_ERROR_MESSAGE_WITHOUT_UPDATE_TASK :
-                        DEFAULT_ERROR_MESSAGE_WITH_UPDATE_TASK
-                ) : mOnFailMessage.toString())
-    }
-
-    /**
-     * Returns the failure error message after all the arguments have been processed through
-     * {@link String#format(String, Object[])}. This String is what will be used as the
-     * error mesage upon failure.<br>
-     * See {@link #getOnFailMessage()} for how the arguments are evaluated.
-     */
-    public String getOnFailMessageFormatted() {
-        return String.format(getOnFailMessage(),
-                getOldApiFile().name,
-                getOldRemovedApiFile().name,
-                getUpdateApiTaskPath(),
-                getCheckApiTaskPath())
-    }
-
-    /**
-     * Sets the preprocessed failure message.<br>
-     * The given string will be passed to {@link String#format(String, Object[])} as the format
-     * string with the given parameters to get the final failure message.<br>
-     * The arguments used are:<br>
-     * 1 (String): oldApiFileName<br>
-     * 2 (String): oldRemovedApiFileName<br>
-     * 3 (String): updateApiTaskPath<br>
-     * 4 (String): checkApiTaskPath<br>
-     * The format string need not use all, or even any, of these arguments.
-     */
-    public void setOnFailMessage(Object onFailMessage) {
-        mOnFailMessage = onFailMessage
-    }
-
-    /**
-     * Configures this CheckApiTask with reasonable defaults for backwards compatibility checks,
-     * which are a bit looser than the normal defaults of erroring on any changes.<br>
-     * In particular, this will cause the api check to allow additions of new APIs, though removals
-     * and changes of existing APIs will still be marked as errors.<p>
-     *
-     * Please note that this will set several properties of this task, overwriting any values they
-     * may already be set to. This method is meant to be called first thing when configuring this CheckApiTask.
-     */
-    public void configureAsBackwardsCompatCheck() {
-        checkApiErrors = DEFAULT_CHECK_API_BACKWARDS_COMPAT_ERRORS
-        checkApiWarnings = DEFAULT_CHECK_API_BACKWARDS_COMPAT_WARNINGS
-        checkApiHidden = DEFAULT_CHECK_API_BACKWARDS_COMPAT_HIDDEN
-        mOnFailMessage = DEFAULT_ERROR_MESSAGE_FOR_BACKWARDS_COMPAT
-    }
-
     public void setCheckApiErrors(Collection errors) {
         // Make it serializable.
         checkApiErrors = errors as int[]
@@ -311,13 +197,12 @@
 
     @TaskAction
     public void exec() {
-        // TODO(csyoung) Option to run this within the build JVM rather than always fork?
         final def apiFiles = collectAndVerifyInputs()
-        // TODO(csyoung) Right now, it is difficult to get the exit code of an ExecTask (including
-        // JavaExec), and it is also difficult to have a custom error message on failure. But it is
-        // easy to get the exit code with Project#javaexec.
+
+        OutputStream errStream = new ByteArrayOutputStream()
+
         // If either of those gets tweaked, then this should be refactored to extend JavaExec.
-        ExecResult result = project.javaexec {
+        project.javaexec {
             // Put Doclava on the classpath so we can get the ApiCheck class.
             classpath(getDoclavaClasspath())
             main = 'com.google.doclava.apicheck.ApiCheck'
@@ -343,12 +228,45 @@
 
             args(apiFiles.collect( { it.absolutePath } ))
 
+            // Redirect error output so that we can whitelist specific errors.
+            errorOutput = errStream
+
             // We will be handling failures ourselves with a custom message.
             ignoreExitValue = true
         }
 
-        if (result.exitValue != 0) {
-            throw new GradleException(getOnFailMessageFormatted())
+        // Load the whitelist file, if present.
+        if (whitelistErrorsFile && whitelistErrorsFile.exists()) {
+            whitelistErrors += whitelistErrorsFile.readLines()
+        }
+
+        // Parse the error output.
+        def unparsedErrors = []
+        def ignoredErrors = []
+        def parsedErrors = []
+        errStream.toString().split("\n").each {
+            if (it) {
+                def matcher = it =~ ~/^(.+):(.+): (\w+) (\d+): (.+)$/
+                if (!matcher) {
+                    unparsedErrors += [it]
+                } else if (matcher[0][3] == "error") {
+                    def hash = getShortHash(matcher[0][5]);
+                    def error = matcher[0][1..-1] + [hash]
+                    if (hash in whitelistErrors) {
+                        ignoredErrors += [error]
+                    } else {
+                        parsedErrors += [error]
+                    }
+                }
+            }
+        }
+
+        unparsedErrors.each { error -> logger.error "$ANSI_RED$error$ANSI_RESET" }
+        parsedErrors.each { logger.error "$ANSI_RED${it[5]}$ANSI_RESET ${it[4]}"}
+        ignoredErrors.each { logger.warn "$ANSI_YELLOW${it[5]}$ANSI_RESET ${it[4]}"}
+
+        if (unparsedErrors || parsedErrors) {
+            throw new GradleException(onFailMessage)
         }
 
         // Just create a dummy file upon completion. Without any outputs, Gradle will run this task
@@ -357,4 +275,11 @@
         outputFile.parentFile.mkdirs()
         outputFile.createNewFile()
     }
+
+    def getShortHash(src) {
+        return MessageDigest.getInstance("SHA-1")
+                .digest(src.toString().bytes)
+                .encodeHex()
+                .toString()[-7..-1]
+    }
 }
\ No newline at end of file
diff --git a/buildSrc/src/main/groovy/android/support/checkapi/UpdateApiTask.groovy b/buildSrc/src/main/groovy/android/support/checkapi/UpdateApiTask.groovy
index c1b7563..944154e 100644
--- a/buildSrc/src/main/groovy/android/support/checkapi/UpdateApiTask.groovy
+++ b/buildSrc/src/main/groovy/android/support/checkapi/UpdateApiTask.groovy
@@ -17,7 +17,10 @@
 package android.support.checkapi;
 
 import org.gradle.api.DefaultTask
+import org.gradle.api.Nullable
+import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.Optional
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.WorkResult
@@ -28,11 +31,20 @@
     @InputFile
     File newRemovedApiFile
 
+    @Input
+    @Optional
+    Set whitelistErrors = []
+
     @OutputFile
     File oldApiFile
     @OutputFile
     File oldRemovedApiFile
 
+    @OutputFile
+    @Optional
+    @Nullable
+    File whitelistErrorsFile
+
     private WorkResult copyFromToFile(File src, File dest) {
         return project.copy {
             from src
@@ -45,6 +57,15 @@
     public void doUpdate() {
         copyFromToFile(getNewApiFile(), getOldApiFile())
         copyFromToFile(getNewRemovedApiFile(), getOldRemovedApiFile())
-        project.logger.warn("Updated ${getOldApiFile().name} and ${getOldRemovedApiFile().name} API files.")
+
+        if (whitelistErrorsFile && !whitelistErrors.empty) {
+            if (whitelistErrorsFile.exists()) {
+                whitelistErrors.removeAll(whitelistErrorsFile.readLines())
+            }
+            whitelistErrors.each { whitelistErrorsFile << "$it\n" }
+            logger.lifecycle "Whitelisted ${whitelistErrors.size()} error(s)..."
+        }
+
+        logger.lifecycle "Wrote public API definition to ${oldApiFile.name}"
     }
 }
\ No newline at end of file
diff --git a/compat/api23/android/support/v4/app/AppOpsManagerCompat23.java b/compat/api23/android/support/v4/app/AppOpsManagerCompat23.java
deleted file mode 100644
index 26448ee..0000000
--- a/compat/api23/android/support/v4/app/AppOpsManagerCompat23.java
+++ /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.
- */
-
-package android.support.v4.app;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.support.annotation.RequiresApi;
-
-/**
- * AppOpsManager implementations for API 23.
- */
-
-@RequiresApi(23)
-class AppOpsManagerCompat23 {
-    public static String permissionToOp(String permission) {
-        return AppOpsManager.permissionToOp(permission);
-    }
-
-    public static int noteOp(Context context, String op, int uid, String packageName) {
-        AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
-        return appOpsManager.noteOp(op, uid, packageName);
-    }
-
-    public static int noteProxyOp(Context context, String op, String proxiedPackageName) {
-        AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
-        return appOpsManager.noteProxyOp(op, proxiedPackageName);
-    }
-}
diff --git a/compat/api26/android/support/v4/app/NotificationCompatApi26.java b/compat/api26/android/support/v4/app/NotificationCompatApi26.java
index 0ad1569..a35646d 100644
--- a/compat/api26/android/support/v4/app/NotificationCompatApi26.java
+++ b/compat/api26/android/support/v4/app/NotificationCompatApi26.java
@@ -30,6 +30,7 @@
 class NotificationCompatApi26 {
     public static class Builder implements NotificationBuilderWithBuilderAccessor,
             NotificationBuilderWithActions {
+
         private Notification.Builder mB;
 
         Builder(Context context, Notification n,
@@ -42,7 +43,7 @@
                 int visibility, Notification publicVersion, String groupKey, boolean groupSummary,
                 String sortKey, CharSequence[] remoteInputHistory, RemoteViews contentView,
                 RemoteViews bigContentView, RemoteViews headsUpContentView,
-                String channelId) {
+                String channelId, int badgeIcon, String shortcutId, long timeoutMs) {
             mB = new Notification.Builder(context, channelId)
                     .setWhen(n.when)
                     .setShowWhen(showWhen)
@@ -78,7 +79,11 @@
                     .setColor(color)
                     .setVisibility(visibility)
                     .setPublicVersion(publicVersion)
-                    .setRemoteInputHistory(remoteInputHistory);
+                    .setRemoteInputHistory(remoteInputHistory)
+                    .setChannel(channelId)
+                    .setBadgeIconType(badgeIcon)
+                    .setShortcutId(shortcutId)
+                    .setTimeout(timeoutMs);
             if (contentView != null) {
                 mB.setCustomContentView(contentView);
             }
@@ -112,4 +117,16 @@
     public static String getChannel(Notification n) {
         return n.getChannel();
     }
+
+    public static int getBadgeIcon(Notification n) {
+        return n.getBadgeIconType();
+    }
+
+    public static String getShortcutId(Notification n) {
+        return n.getShortcutId();
+    }
+
+    public static long getTimeout(Notification n) {
+        return n.getTimeout();
+    }
 }
diff --git a/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
deleted file mode 100644
index 62cabea..0000000
--- a/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
+++ /dev/null
@@ -1,95 +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.support.annotation.RequiresApi;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
-
-import java.util.List;
-
-/**
- * ICS specific AccessibilityManager API implementation.
- */
-
-@RequiresApi(14)
-class AccessibilityManagerCompatIcs {
-
-    public static class AccessibilityStateChangeListenerWrapper
-            implements AccessibilityStateChangeListener {
-        Object mListener;
-        AccessibilityStateChangeListenerBridge mListenerBridge;
-
-        public AccessibilityStateChangeListenerWrapper(Object listener,
-                AccessibilityStateChangeListenerBridge listenerBridge) {
-            mListener = listener;
-            mListenerBridge = listenerBridge;
-        }
-
-        @Override
-        public int hashCode() {
-            return mListener == null ? 0 : mListener.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-            AccessibilityStateChangeListenerWrapper other =
-                    (AccessibilityStateChangeListenerWrapper) o;
-            return mListener == null ? other.mListener == null : mListener.equals(other.mListener);
-        }
-
-        @Override
-        public void onAccessibilityStateChanged(boolean enabled) {
-            mListenerBridge.onAccessibilityStateChanged(enabled);
-        }
-    }
-
-    interface AccessibilityStateChangeListenerBridge {
-        void onAccessibilityStateChanged(boolean enabled);
-    }
-
-    public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerWrapper listener) {
-        return manager.addAccessibilityStateChangeListener(listener);
-    }
-
-    public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerWrapper listener) {
-        return manager.removeAccessibilityStateChangeListener(listener);
-    }
-
-    public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-            AccessibilityManager manager,int feedbackTypeFlags) {
-        return manager.getEnabledAccessibilityServiceList(feedbackTypeFlags);
-    }
-
-    public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-            AccessibilityManager manager) {
-        return manager.getInstalledAccessibilityServiceList();
-    }
-
-    public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
-        return manager.isTouchExplorationEnabled();
-    }
-}
diff --git a/compat/java/android/support/v4/app/ActivityManagerCompat.java b/compat/java/android/support/v4/app/ActivityManagerCompat.java
index 53d8703..e8aaab6 100644
--- a/compat/java/android/support/v4/app/ActivityManagerCompat.java
+++ b/compat/java/android/support/v4/app/ActivityManagerCompat.java
@@ -21,8 +21,8 @@
 import android.support.annotation.NonNull;
 
 /**
- * Helper for accessing features in {@link android.app.ActivityManager}
- * introduced after API level 4 in a backwards compatible fashion.
+ * Helper for accessing features in {@link android.app.ActivityManager} in a backwards compatible
+ * fashion.
  */
 public final class ActivityManagerCompat {
 
@@ -35,9 +35,9 @@
      * This is mostly intended to be used by apps to determine whether they should turn
      * off certain features that require more RAM.
      */
-    public static boolean isLowRamDevice(@NonNull ActivityManager am) {
+    public static boolean isLowRamDevice(@NonNull ActivityManager activityManager) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return ActivityManagerCompatKitKat.isLowRamDevice(am);
+            return activityManager.isLowRamDevice();
         }
         return false;
     }
diff --git a/compat/java/android/support/v4/app/AppOpsManagerCompat.java b/compat/java/android/support/v4/app/AppOpsManagerCompat.java
index d67dbac..5b8fdd9 100644
--- a/compat/java/android/support/v4/app/AppOpsManagerCompat.java
+++ b/compat/java/android/support/v4/app/AppOpsManagerCompat.java
@@ -16,10 +16,11 @@
 
 package android.support.v4.app;
 
+import static android.os.Build.VERSION.SDK_INT;
+
+import android.app.AppOpsManager;
 import android.content.Context;
-import android.os.Build;
 import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
 
 /**
  * Helper for accessing features in android.app.AppOpsManager
@@ -48,53 +49,6 @@
      */
     public static final int MODE_DEFAULT = 3;
 
-    private static class AppOpsManagerImpl {
-        AppOpsManagerImpl() {
-        }
-
-        public String permissionToOp(String permission) {
-            return null;
-        }
-
-        public int noteOp(Context context, String op, int uid, String packageName) {
-            return MODE_IGNORED;
-        }
-
-        public int noteProxyOp(Context context, String op, String proxiedPackageName) {
-            return MODE_IGNORED;
-        }
-    }
-
-    @RequiresApi(23)
-    private static class AppOpsManager23 extends AppOpsManagerImpl {
-        AppOpsManager23() {
-        }
-
-        @Override
-        public String permissionToOp(String permission) {
-            return AppOpsManagerCompat23.permissionToOp(permission);
-        }
-
-        @Override
-        public int noteOp(Context context, String op, int uid, String packageName) {
-            return AppOpsManagerCompat23.noteOp(context, op, uid, packageName);
-        }
-
-        @Override
-        public int noteProxyOp(Context context, String op, String proxiedPackageName) {
-            return AppOpsManagerCompat23.noteProxyOp(context, op, proxiedPackageName);
-        }
-    }
-
-    private static final AppOpsManagerImpl IMPL;
-    static {
-        if (Build.VERSION.SDK_INT >= 23) {
-            IMPL = new AppOpsManager23();
-        } else {
-            IMPL = new AppOpsManagerImpl();
-        }
-    }
-
     private AppOpsManagerCompat() {}
 
     /**
@@ -104,7 +58,11 @@
      * @return The app op associated with the permission or null.
      */
     public static String permissionToOp(@NonNull String permission) {
-        return IMPL.permissionToOp(permission);
+        if (SDK_INT >= 23) {
+            return AppOpsManager.permissionToOp(permission);
+        } else {
+            return null;
+        }
     }
 
     /**
@@ -124,7 +82,12 @@
      */
     public static int noteOp(@NonNull Context context, @NonNull String op, int uid,
             @NonNull String packageName) {
-        return IMPL.noteOp(context, op, uid, packageName);
+        if (SDK_INT >= 23) {
+            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
+            return appOpsManager.noteOp(op, uid, packageName);
+        } else {
+            return MODE_IGNORED;
+        }
     }
 
     /**
@@ -145,6 +108,11 @@
      */
     public static int noteProxyOp(@NonNull Context context, @NonNull String op,
             @NonNull String proxiedPackageName) {
-        return IMPL.noteProxyOp(context, op, proxiedPackageName);
+        if (SDK_INT >= 23) {
+            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
+            return appOpsManager.noteProxyOp(op, proxiedPackageName);
+        } else {
+            return MODE_IGNORED;
+        }
     }
 }
diff --git a/compat/java/android/support/v4/app/NotificationCompat.java b/compat/java/android/support/v4/app/NotificationCompat.java
index ca17882..5a65a4b 100644
--- a/compat/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/java/android/support/v4/app/NotificationCompat.java
@@ -42,6 +42,7 @@
 import android.widget.RemoteViews;
 
 import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -525,6 +526,29 @@
      */
     public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS;
 
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @RestrictTo(LIBRARY_GROUP)
+    @IntDef({BADGE_ICON_NONE, BADGE_ICON_SMALL, BADGE_ICON_LARGE})
+    public @interface BadgeIconType {}
+    /**
+     * If this notification is being shown as a badge, always show as a number.
+     */
+    public static final int BADGE_ICON_NONE = Notification.BADGE_ICON_NONE;
+
+    /**
+     * If this notification is being shown as a badge, use the icon provided to
+     * {@link Builder#setSmallIcon(int)} to represent this notification.
+     */
+    public static final int BADGE_ICON_SMALL = Notification.BADGE_ICON_SMALL;
+
+    /**
+     * If this notification is being shown as a badge, use the icon provided to
+     * {@link Builder#setLargeIcon(Bitmap) to represent this notification.
+     */
+    public static final int BADGE_ICON_LARGE = Notification.BADGE_ICON_LARGE;
+
+
     static final NotificationCompatImpl IMPL;
 
     interface NotificationCompatImpl {
@@ -544,6 +568,9 @@
                 Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
                 RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
         String getChannel(Notification n);
+        String getShortcutId(Notification n);
+        int getBadgeIconType(Notification n);
+        long getTimeout(Notification n);
     }
 
     /**
@@ -684,6 +711,21 @@
         public String getChannel(Notification n) {
             return null;
         }
+
+        @Override
+        public int getBadgeIconType(Notification n) {
+            return BADGE_ICON_NONE;
+        }
+
+        @Override
+        public String getShortcutId(Notification n) {
+            return null;
+        }
+
+        @Override
+        public long getTimeout(Notification n) {
+            return 0;
+        }
     }
 
     @RequiresApi(16)
@@ -945,7 +987,8 @@
                     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, b.mChannelId);
+                    b.mBigContentView, b.mHeadsUpContentView, b.mChannelId, b.mBadgeIcon,
+                    b.mShortcutId, b.mTimeout);
             addActionsToBuilder(builder, b.mActions);
             addStyleToBuilderApi24(builder, b.mStyle);
             Notification notification = extender.build(b, builder);
@@ -959,6 +1002,21 @@
         public String getChannel(Notification n) {
             return NotificationCompatApi26.getChannel(n);
         }
+
+        @Override
+        public int getBadgeIconType(Notification n) {
+            return NotificationCompatApi26.getBadgeIcon(n);
+        }
+
+        @Override
+        public String getShortcutId(Notification n) {
+            return NotificationCompatApi26.getShortcutId(n);
+        }
+
+        @Override
+        public long getTimeout(Notification n) {
+            return NotificationCompatApi26.getTimeout(n);
+        }
     }
 
     static void addActionsToBuilder(NotificationBuilderWithActions builder,
@@ -1029,7 +1087,6 @@
 
     static {
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             IMPL = new NotificationCompatApi26Impl();
         } else if (Build.VERSION.SDK_INT >= 24) {
             IMPL = new NotificationCompatApi24Impl();
@@ -1133,6 +1190,9 @@
         RemoteViews mBigContentView;
         RemoteViews mHeadsUpContentView;
         String mChannelId;
+        int mBadgeIcon = BADGE_ICON_NONE;
+        String mShortcutId;
+        long mTimeout;
 
         /** @hide */
         @RestrictTo(LIBRARY_GROUP)
@@ -1828,12 +1888,51 @@
          *
          * No-op on versions prior to {@link android.os.Build.VERSION_CODES#O} .
          */
-        public Builder setChannel(String channelId) {
+        public Builder setChannel(@NonNull String channelId) {
             mChannelId = channelId;
             return this;
         }
 
         /**
+         * Specifies the time at which this notification should be canceled, if it is not already
+         * canceled.
+         */
+        public Builder setTimeout(long durationMs) {
+            mTimeout = durationMs;
+            return this;
+        }
+
+        /**
+         * If this notification is duplicative of a Launcher shortcut, sets the
+         * {@link android.support.v4.content.pm.ShortcutInfoCompat#getId() id} of the shortcut, in
+         * case the Launcher wants to hide the shortcut.
+         *
+         * <p><strong>Note:</strong>This field will be ignored by Launchers that don't support
+         * badging or {@link android.support.v4.content.pm.ShortcutManagerCompat shortcuts}.
+         *
+         * @param shortcutId the {@link android.support.v4.content.pm.ShortcutInfoCompat#getId() id}
+         *                   of the shortcut this notification supersedes
+         */
+        public Builder setShortcutId(String shortcutId) {
+            mShortcutId = shortcutId;
+            return this;
+        }
+
+        /**
+         * Sets which icon to display as a badge for this notification.
+         *
+         * <p>Must be one of {@link #BADGE_ICON_NONE}, {@link #BADGE_ICON_SMALL},
+         * {@link #BADGE_ICON_LARGE}.
+         *
+         * <p><strong>Note:</strong> This value might be ignored, for launchers that don't support
+         * badge icons.
+         */
+        public Builder setBadgeIconType(@BadgeIconType int icon) {
+            mBadgeIcon = icon;
+            return this;
+        }
+
+        /**
          * Apply an extender to this notification builder. Extenders may be used to add
          * metadata or change options on this builder.
          */
@@ -4349,4 +4448,29 @@
     public static String getChannel(Notification notification) {
         return IMPL.getChannel(notification);
     }
+
+    /**
+     * Returns the time at which this notification should be canceled by the system, if it's not
+     * canceled already.
+     */
+    public static long getTimeout(Notification n) {
+        return IMPL.getTimeout(n);
+    }
+
+    /**
+     * Returns what icon should be shown for this notification if it is being displayed in a
+     * Launcher that supports badging. Will be one of {@link #BADGE_ICON_NONE},
+     * {@link #BADGE_ICON_SMALL}, or {@link #BADGE_ICON_LARGE}.
+     */
+    public static int getBadgeIconType(Notification n) {
+        return IMPL.getBadgeIconType(n);
+    }
+
+    /**
+     * Returns the {@link android.support.v4.content.pm.ShortcutInfoCompat#getId() id} that this
+     * notification supersedes, if any.
+     */
+    public static String getShortcutId(Notification n) {
+        return IMPL.getShortcutId(n);
+    }
 }
diff --git a/compat/java/android/support/v4/content/ContextCompat.java b/compat/java/android/support/v4/content/ContextCompat.java
index fde2f33..2790234 100644
--- a/compat/java/android/support/v4/content/ContextCompat.java
+++ b/compat/java/android/support/v4/content/ContextCompat.java
@@ -30,6 +30,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v4.os.BuildCompat;
 import android.support.v4.os.EnvironmentCompat;
 import android.util.Log;
 import android.util.TypedValue;
@@ -544,4 +545,23 @@
             return false;
         }
     }
+
+    /**
+     * startForegroundService() was introduced in O, just call startService
+     * for before O.
+     *
+     * @param context Context to start Service from.
+     * @param intent The description of the Service to start.
+     *
+     * @see Context#startForegeroundService()
+     * @see Context#startService()
+     */
+    public static void startForegroundService(Context context, Intent intent) {
+        if (BuildCompat.isAtLeastO()) {
+            context.startForegroundService(intent);
+        } else {
+            // Pre-O behavior.
+            context.startService(intent);
+        }
+    }
 }
diff --git a/compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java b/compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java
index bbb2568..f761339 100644
--- a/compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java
+++ b/compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java
@@ -20,11 +20,11 @@
 import android.content.Intent;
 import android.content.pm.ShortcutInfo;
 import android.graphics.Bitmap;
-import android.graphics.drawable.Icon;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
+import android.support.v4.graphics.drawable.IconCompat;
 import android.text.TextUtils;
 
 import java.util.Arrays;
@@ -45,20 +45,17 @@
     private CharSequence mLongLabel;
     private CharSequence mDisabledMessage;
 
-    private Bitmap mIconBitmap;
-    private int mIconId;
+    private IconCompat mIcon;
 
     private ShortcutInfoCompat() { }
 
-    @RequiresApi(25)
+    @RequiresApi(26)
     ShortcutInfo toShortcutInfo() {
         ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mContext, mId)
                 .setShortLabel(mLabel)
                 .setIntents(mIntents);
-        if (mIconId != 0) {
-            builder.setIcon(Icon.createWithResource(mContext, mIconId));
-        } else if (mIconBitmap != null) {
-            builder.setIcon(Icon.createWithBitmap(mIconBitmap));
+        if (mIcon != null) {
+            builder.setIcon(mIcon.toIcon());
         }
         if (!TextUtils.isEmpty(mLongLabel)) {
             builder.setLongLabel(mLongLabel);
@@ -75,12 +72,8 @@
     Intent addToIntent(Intent outIntent) {
         outIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mIntents[mIntents.length - 1])
                 .putExtra(Intent.EXTRA_SHORTCUT_NAME, mLabel.toString());
-        if (mIconId != 0) {
-            outIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
-                    Intent.ShortcutIconResource.fromContext(mContext, mIconId));
-        }
-        if (mIconBitmap != null) {
-            outIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, mIconBitmap);
+        if (mIcon != null) {
+            mIcon.addToShortcutIntent(outIntent);
         }
         return outIntent;
     }
@@ -245,19 +238,28 @@
 
         /**
          * Sets an icon of a shortcut.
+         * @deprecated use {@link #setIcon(IconCompat)} instead
          */
         @NonNull
         public Builder setIcon(@NonNull Bitmap icon) {
-            mInfo.mIconBitmap = icon;
-            return this;
+            return setIcon(IconCompat.createWithBitmap(icon));
+        }
+
+        /**
+         * Sets an icon of a shortcut.
+         * @deprecated use {@link #setIcon(IconCompat)} instead
+         */
+        @NonNull
+        public Builder setIcon(@DrawableRes int icon) {
+            return setIcon(IconCompat.createWithResource(mInfo.mContext, icon));
         }
 
         /**
          * Sets an icon of a shortcut.
          */
         @NonNull
-        public Builder setIcon(@DrawableRes int icon) {
-            mInfo.mIconId = icon;
+        public Builder setIcon(IconCompat icon) {
+            mInfo.mIcon = icon;
             return this;
         }
 
diff --git a/compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java b/compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java
index b421a1c..ecc9344 100644
--- a/compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java
+++ b/compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java
@@ -16,7 +16,6 @@
 
 package android.support.v4.content.pm;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -51,10 +50,8 @@
      * @return {@code true} if the launcher supports {@link #requestPinShortcut},
      * {@code false} otherwise
      */
-    @SuppressLint("NewApi")
     public static boolean isRequestPinShortcutSupported(@NonNull Context context) {
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             return context.getSystemService(ShortcutManager.class).isRequestPinShortcutSupported();
         }
 
@@ -89,11 +86,9 @@
      * @see IntentSender
      * @see android.app.PendingIntent#getIntentSender()
      */
-    @SuppressLint("NewApi")
     public static boolean requestPinShortcut(@NonNull final Context context,
             @NonNull ShortcutInfoCompat shortcut, @Nullable final IntentSender callback) {
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             return context.getSystemService(ShortcutManager.class).requestPinShortcut(
                     shortcut.toShortcutInfo(), callback);
         }
@@ -134,12 +129,10 @@
      * @see Intent#ACTION_CREATE_SHORTCUT
      */
     @NonNull
-    @SuppressLint("NewApi")
     public static Intent createShortcutResultIntent(@NonNull Context context,
             @NonNull ShortcutInfoCompat shortcut) {
         Intent result = null;
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             result = context.getSystemService(ShortcutManager.class)
                     .createShortcutResultIntent(shortcut.toShortcutInfo());
         }
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompat.java b/compat/java/android/support/v4/graphics/TypefaceCompat.java
new file mode 100644
index 0000000..ecb959e
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/TypefaceCompat.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+import android.support.v4.graphics.fonts.FontRequest;
+import android.support.v4.provider.FontsContract;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Helper for accessing features in {@link Typeface} in a backwards compatible fashion.
+ */
+public class TypefaceCompat {
+
+    private static TypefaceCompatImpl sTypefaceCompatImpl;
+    private static final Object sLock = new Object();
+
+    /**
+     * Create a typeface object given a font request. The font will be asynchronously fetched,
+     * therefore the result is delivered to the given callback. See {@link FontRequest}.
+     * Only one of the methods in callback will be invoked, depending on whether the request
+     * succeeds or fails. These calls will happen on the main thread.
+     * @param request A {@link FontRequest} object that identifies the provider and query for the
+     *                request. May not be null.
+     * @param callback A callback that will be triggered when results are obtained. May not be null.
+     */
+    @TargetApi(26)
+    public static void create(Context context, @NonNull final FontRequest request,
+            @NonNull final FontRequestCallback callback) {
+        synchronized (sLock) {
+            if (sTypefaceCompatImpl == null) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                    sTypefaceCompatImpl = new TypefaceCompatApi26Impl();
+                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                    sTypefaceCompatImpl = new TypefaceCompatApi24Impl(context);
+                } else {
+                    sTypefaceCompatImpl = new TypefaceCompatBaseImpl(context);
+                }
+            }
+        }
+        sTypefaceCompatImpl.create(request, callback);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    interface TypefaceCompatImpl {
+        /**
+         * Create a typeface object given a font request. The font will be asynchronously fetched,
+         * therefore the result is delivered to the given callback. See {@link FontRequest}.
+         * Only one of the methods in callback will be invoked, depending on whether the request
+         * succeeds or fails. These calls will happen on the main thread.
+         * @param request A {@link FontRequest} object that identifies the provider and query for
+         *                the request. May not be null.
+         * @param callback A callback that will be triggered when results are obtained. May not be
+         *                 null.
+         */
+        void create(@NonNull FontRequest request,
+                @NonNull TypefaceCompat.FontRequestCallback callback);
+    }
+
+    /**
+     * Interface used to receive asynchronously fetched typefaces.
+     */
+    public abstract static class FontRequestCallback {
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+         * provider was not found on the device.
+         */
+        public static final int FAIL_REASON_PROVIDER_NOT_FOUND =
+                FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND;
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+         * provider must be authenticated and the given certificates do not match its signature.
+         */
+        public static final int FAIL_REASON_WRONG_CERTIFICATES =
+                FontsContract.RESULT_CODE_WRONG_CERTIFICATES;
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
+         * returned by the provider was not loaded properly.
+         */
+        public static final int FAIL_REASON_FONT_LOAD_ERROR = -3;
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
+         * provider did not return any results for the given query.
+         */
+        public static final int FAIL_REASON_FONT_NOT_FOUND =
+                FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
+         * provider found the queried font, but it is currently unavailable.
+         */
+        public static final int FAIL_REASON_FONT_UNAVAILABLE =
+                FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
+        /**
+         * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+         * query was not supported by the provider.
+         */
+        public static final int FAIL_REASON_MALFORMED_QUERY =
+                FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
+
+        /** @hide */
+        @RestrictTo(LIBRARY_GROUP)
+        @IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
+                FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
+                FAIL_REASON_MALFORMED_QUERY })
+        @Retention(RetentionPolicy.SOURCE)
+        @interface FontRequestFailReason {}
+
+        /**
+         * Called then a Typeface request done via {@link TypefaceCompat#create(Context,
+         * FontRequest, FontRequestCallback)} is complete. Note that this method will not be called
+         * if {@link #onTypefaceRequestFailed(int)} is called instead.
+         * @param typeface  The Typeface object retrieved.
+         */
+        public abstract void onTypefaceRetrieved(Typeface typeface);
+
+        /**
+         * Called when a Typeface request done via {@link TypefaceCompat#create(Context,
+         * FontRequest, FontRequestCallback)} fails.
+         * @param reason One of {@link #FAIL_REASON_PROVIDER_NOT_FOUND},
+         *               {@link #FAIL_REASON_FONT_NOT_FOUND},
+         *               {@link #FAIL_REASON_FONT_LOAD_ERROR},
+         *               {@link #FAIL_REASON_FONT_UNAVAILABLE} or
+         *               {@link #FAIL_REASON_MALFORMED_QUERY}.
+         */
+        public abstract void onTypefaceRequestFailed(@FontRequestFailReason int reason);
+    }
+
+    private TypefaceCompat() {}
+}
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java b/compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
new file mode 100644
index 0000000..c4155cd
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.v4.graphics.fonts.FontResult;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.List;
+
+/**
+ * Implementation of the Typeface compat methods for API 24 and above.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+@RequiresApi(24)
+class TypefaceCompatApi24Impl extends TypefaceCompatBaseImpl {
+    private static final String TAG = "TypefaceCompatApi24Impl";
+
+    private static final Class<?> sFamilyClass;
+    private static final Constructor<?> sFamilyCtor;
+    private static final Method sAddFontWeightStyleMethod;
+    private static final Method sCreateFromFamiliesWithDefaultMethod;
+
+    static {
+        Class<?> typefaceClass = Typeface.class;
+        Class<?> familyClass = null;
+        Constructor<?> familyCtor = null;
+        Method addFontWeightStyleMethod = null;
+        Method createFromFamiliesWithDefaultMethod = null;
+        boolean success = true;
+        try {
+            familyClass = Class.forName("android.graphics.FontFamily");
+            familyCtor = familyClass.getDeclaredConstructor();
+
+            // boolean nAddFont(long nativeFamily, ByteBuffer font, int ttcIndex);
+            addFontWeightStyleMethod = familyClass
+                    .getDeclaredMethod("addFontWeightStyle", ByteBuffer.class, int.class,
+                            List.class, int.class, boolean.class);
+            addFontWeightStyleMethod.setAccessible(true);
+
+            // Typeface createFromFamiliesWithDefault(FontFamily[] families)
+            Object familyArray = Array.newInstance(familyClass, 1);
+            createFromFamiliesWithDefaultMethod = typefaceClass
+                    .getDeclaredMethod("createFromFamiliesWithDefault", familyArray.getClass());
+            createFromFamiliesWithDefaultMethod.setAccessible(true);
+        } catch (NoSuchMethodException | ClassNotFoundException e) {
+            Log.i(TAG, "Could not locate Typeface reflection classes for API 24, falling back to"
+                    + "creating font via ICS APIs.");
+            success = false;
+        }
+        if (success) {
+            sFamilyClass = familyClass;
+            sFamilyCtor = familyCtor;
+            sAddFontWeightStyleMethod = addFontWeightStyleMethod;
+            sCreateFromFamiliesWithDefaultMethod = createFromFamiliesWithDefaultMethod;
+        } else {
+            sFamilyClass = null;
+            sFamilyCtor = null;
+            sAddFontWeightStyleMethod = null;
+            sCreateFromFamiliesWithDefaultMethod = null;
+        }
+    }
+
+    TypefaceCompatApi24Impl(Context context) {
+        super(context);
+    }
+
+    @Override
+    Typeface createTypeface(List<FontResult> resultList) {
+        if (sFamilyClass == null) {
+            // If the reflection methods were not available, fall back to loading from file path.
+            return super.createTypeface(resultList);
+        }
+        FileInputStream fis = null;
+        try {
+            Object family = sFamilyCtor.newInstance();
+
+            for (int i = 0; i < resultList.size(); i++) {
+                FontResult result = resultList.get(i);
+
+                // create and memory map the file
+                fis = new FileInputStream(result.getFileDescriptor().getFileDescriptor());
+                FileChannel fileChannel = fis.getChannel();
+                long fontSize = fileChannel.size();
+                ByteBuffer fontBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
+
+                // load font into FontFamily
+                sAddFontWeightStyleMethod.invoke(family, fontBuffer, result.getTtcIndex(), null,
+                        result.getWeight(), result.getItalic());
+                closeQuietly(fis);
+            }
+
+            Object familyArray = Array.newInstance(sFamilyClass, 1);
+            Array.set(familyArray, 0, family);
+
+            @SuppressWarnings("unchecked")
+            Typeface typeface = (Typeface) sCreateFromFamiliesWithDefaultMethod.invoke(
+                    null, familyArray);
+
+            return typeface;
+        } catch (IllegalAccessException | InstantiationException | InvocationTargetException
+                | IOException e) {
+            Log.e(TAG, "Error generating typeface by reflection", e);
+            return null;
+        } finally {
+            closeQuietly(fis);
+        }
+    }
+}
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java b/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
new file mode 100644
index 0000000..3112961
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.graphics.Typeface;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.v4.graphics.fonts.FontRequest;
+
+/**
+ * Implementation of the Typeface compat methods for API 26 and above.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+@RequiresApi(26)
+class TypefaceCompatApi26Impl implements TypefaceCompat.TypefaceCompatImpl {
+
+    public void create(@NonNull final FontRequest request,
+            @NonNull final TypefaceCompat.FontRequestCallback callback) {
+        Typeface.create(new android.graphics.fonts.FontRequest(request.getProviderAuthority(),
+                request.getProviderPackage(), request.getQuery(), request.getCertificates()),
+                new Typeface.FontRequestCallback() {
+                    @Override
+                    public void onTypefaceRetrieved(Typeface typeface) {
+                        callback.onTypefaceRetrieved(typeface);
+                    }
+
+                    @Override
+                    public void onTypefaceRequestFailed(int reason) {
+                        callback.onTypefaceRequestFailed(reason);
+                    }
+                });
+    }
+}
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java b/compat/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java
new file mode 100644
index 0000000..df7544a
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.graphics.fonts.FontRequest;
+import android.support.v4.graphics.fonts.FontResult;
+import android.support.v4.os.ResultReceiver;
+import android.support.v4.provider.FontsContract;
+import android.support.v4.util.LruCache;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * Implementation of the Typeface compat methods for API 14 and above.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+@RequiresApi(14)
+class TypefaceCompatBaseImpl implements TypefaceCompat.TypefaceCompatImpl {
+    private static final String TAG = "TypefaceCompatBaseImpl";
+    private static final String FONT_FILE = "tmp_font_file";
+
+    /**
+     * Cache for Typeface objects dynamically loaded from assets. Currently max size is 16.
+     */
+    private static final LruCache<String, Typeface> sDynamicTypefaceCache = new LruCache<>(16);
+    private static final Object sLock = new Object();
+    private static FontsContract sFontsContract;
+    private static Handler sHandler;
+
+    private final Context mApplicationContext;
+
+    TypefaceCompatBaseImpl(Context context) {
+        mApplicationContext = context.getApplicationContext();
+    }
+
+    /**
+     * Create a typeface object given a font request. The font will be asynchronously fetched,
+     * therefore the result is delivered to the given callback. See {@link FontRequest}.
+     * Only one of the methods in callback will be invoked, depending on whether the request
+     * succeeds or fails. These calls will happen on the main thread.
+     * @param request A {@link FontRequest} object that identifies the provider and query for the
+     *                request. May not be null.
+     * @param callback A callback that will be triggered when results are obtained. May not be null.
+     */
+    public void create(@NonNull final FontRequest request,
+            @NonNull final TypefaceCompat.FontRequestCallback callback) {
+        final Typeface cachedTypeface = findFromCache(
+                request.getProviderAuthority(), request.getQuery());
+        if (cachedTypeface != null) {
+            sHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    callback.onTypefaceRetrieved(cachedTypeface);
+                }
+            });
+            return;
+        }
+        synchronized (sLock) {
+            if (sFontsContract == null) {
+                sFontsContract = new FontsContract(mApplicationContext);
+                sHandler = new Handler();
+            }
+            final ResultReceiver receiver = new ResultReceiver(null) {
+                @Override
+                public void onReceiveResult(final int resultCode, final Bundle resultData) {
+                    sHandler.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            receiveResult(request, callback, resultCode, resultData);
+                        }
+                    });
+                }
+            };
+            sFontsContract.getFont(request, receiver);
+        }
+    }
+
+    private static Typeface findFromCache(String providerAuthority, String query) {
+        synchronized (sDynamicTypefaceCache) {
+            final String key = createProviderUid(providerAuthority, query);
+            Typeface typeface = sDynamicTypefaceCache.get(key);
+            if (typeface != null) {
+                return typeface;
+            }
+        }
+        return null;
+    }
+
+    static void putInCache(String providerAuthority, String query, Typeface typeface) {
+        synchronized (sDynamicTypefaceCache) {
+            String key = createProviderUid(providerAuthority, query);
+            sDynamicTypefaceCache.put(key, typeface);
+        }
+    }
+
+    @VisibleForTesting
+    void receiveResult(FontRequest request,
+            TypefaceCompat.FontRequestCallback callback, int resultCode, Bundle resultData) {
+        Typeface cachedTypeface = findFromCache(
+                request.getProviderAuthority(), request.getQuery());
+        if (cachedTypeface != null) {
+            // We already know the result.
+            // Probably the requester requests the same font again in a short interval.
+            callback.onTypefaceRetrieved(cachedTypeface);
+            return;
+        }
+        if (resultCode != FontsContract.Columns.RESULT_CODE_OK) {
+            callback.onTypefaceRequestFailed(resultCode);
+            return;
+        }
+        if (resultData == null) {
+            callback.onTypefaceRequestFailed(
+                    TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+            return;
+        }
+        List<FontResult> resultList =
+                resultData.getParcelableArrayList(FontsContract.PARCEL_FONT_RESULTS);
+        if (resultList == null || resultList.isEmpty()) {
+            callback.onTypefaceRequestFailed(
+                    TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+            return;
+        }
+
+        Typeface typeface = createTypeface(resultList);
+
+        if (typeface == null) {
+            Log.e(TAG, "Error creating font " + request.getQuery());
+            callback.onTypefaceRequestFailed(
+                    TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
+            return;
+        }
+        putInCache(request.getProviderAuthority(), request.getQuery(), typeface);
+        callback.onTypefaceRetrieved(typeface);
+    }
+
+    /**
+     * To be overriden by other implementations according to available APIs.
+     * @param resultList a list of results, guaranteed to be non-null and non empty.
+     */
+    Typeface createTypeface(List<FontResult> resultList) {
+        // When we load from file, we can only load one font so just take the first one.
+        Typeface typeface = null;
+        File tmpFile = copyToCacheFile(resultList.get(0).getFileDescriptor().getFileDescriptor());
+        if (tmpFile != null) {
+            try {
+                typeface = Typeface.createFromFile(tmpFile.getPath());
+            } catch (RuntimeException e) {
+                // This was thrown from Typeface.createFromFile when a Typeface could not be loaded,
+                // such as due to an invalid ttf or unreadable file. We don't want to throw that
+                // exception anymore.
+                return null;
+            } finally {
+                tmpFile.delete();
+            }
+        }
+        return typeface;
+    }
+
+    private File copyToCacheFile(final FileDescriptor fd) {
+        final File cacheFile = new File(mApplicationContext.getCacheDir(),
+                FONT_FILE + Thread.currentThread().getId());
+        final InputStream is = new FileInputStream(fd);
+        try {
+            final FileOutputStream fos = new FileOutputStream(cacheFile, false);
+            try {
+                byte[] buffer = new byte[1024];
+                int readLen;
+                while ((readLen = is.read(buffer)) != -1) {
+                    fos.write(buffer, 0, readLen);
+                }
+            } finally {
+                fos.close();
+            }
+        } catch (IOException e) {
+            Log.e(TAG, "Error copying font file descriptor to temp local file.", e);
+            return null;
+        } finally {
+            closeQuietly(is);
+        }
+        return cacheFile;
+    }
+
+    static void closeQuietly(InputStream is) {
+        if (is != null) {
+            try {
+                is.close();
+            } catch (IOException io) {
+                Log.e(TAG, "Error closing input stream", io);
+            }
+        }
+    }
+
+    /**
+     * Creates a unique id for a given font provider and query.
+     */
+    private static String createProviderUid(String authority, String query) {
+        return "provider:" + authority + "-" + query;
+    }
+}
diff --git a/compat/java/android/support/v4/graphics/drawable/IconCompat.java b/compat/java/android/support/v4/graphics/drawable/IconCompat.java
new file mode 100644
index 0000000..c820366
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/drawable/IconCompat.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Shader;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.os.BuildCompat;
+
+/**
+ * Helper for accessing features in {@link android.graphics.drawable.Icon}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class IconCompat {
+
+    // Ratio of expected size to actual icon size
+    private static final float ADAPTIVE_ICON_INSET_FACTOR = 1 / 4f;
+    private static final float DEFAULT_VIEW_PORT_SCALE = 1 / (1 + 2 * ADAPTIVE_ICON_INSET_FACTOR);
+    private static final float ICON_DIAMETER_FACTOR = 176f / 192;
+    private static final float BLUR_FACTOR = 0.5f / 48;
+    private static final float KEY_SHADOW_OFFSET_FACTOR = 1f / 48;
+
+    private static final int KEY_SHADOW_ALPHA = 61;
+    private static final int AMBIENT_SHADOW_ALPHA = 30;
+
+    private static final int TYPE_BITMAP   = 1;
+    private static final int TYPE_RESOURCE = 2;
+    private static final int TYPE_DATA     = 3;
+    private static final int TYPE_URI      = 4;
+    private static final int TYPE_ADAPTIVE_BITMAP = 5;
+
+    private final int mType;
+
+    // To avoid adding unnecessary overhead, we have a few basic objects that get repurposed
+    // based on the value of mType.
+
+    // TYPE_BITMAP: Bitmap
+    // TYPE_ADAPTIVE_BITMAP: Bitmap
+    // TYPE_RESOURCE: Context
+    // TYPE_URI: String
+    // TYPE_DATA: DataBytes
+    private Object          mObj1;
+
+    // TYPE_RESOURCE: resId
+    // TYPE_DATA: data offset
+    private int             mInt1;
+
+    // TYPE_DATA: data length
+    private int             mInt2;
+
+    /**
+     * Create an Icon pointing to a drawable resource.
+     * @param context The context for the application whose resources should be used to resolve the
+     *                given resource ID.
+     * @param resId ID of the drawable resource
+     * @see android.graphics.drawable.Icon#createWithResource(Context, int)
+     */
+    public static IconCompat createWithResource(Context context, @DrawableRes int resId) {
+        if (context == null) {
+            throw new IllegalArgumentException("Context must not be null.");
+        }
+        final IconCompat rep = new IconCompat(TYPE_RESOURCE);
+        rep.mInt1 = resId;
+        rep.mObj1 = context;
+        return rep;
+    }
+
+    /**
+     * Create an Icon pointing to a bitmap in memory.
+     * @param bits A valid {@link android.graphics.Bitmap} object
+     * @see android.graphics.drawable.Icon#createWithBitmap(Bitmap)
+     */
+    public static IconCompat createWithBitmap(Bitmap bits) {
+        if (bits == null) {
+            throw new IllegalArgumentException("Bitmap must not be null.");
+        }
+        final IconCompat rep = new IconCompat(TYPE_BITMAP);
+        rep.mObj1 = bits;
+        return rep;
+    }
+
+    /**
+     * Create an Icon pointing to a bitmap in memory that follows the icon design guideline defined
+     * by {@link android.graphics.drawable.AdaptiveIconDrawable}.
+     * @param bits A valid {@link android.graphics.Bitmap} object
+     * @see android.graphics.drawable.Icon#createWithAdaptiveBitmap(Bitmap)
+     */
+    public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {
+        if (bits == null) {
+            throw new IllegalArgumentException("Bitmap must not be null.");
+        }
+        final IconCompat rep = new IconCompat(TYPE_ADAPTIVE_BITMAP);
+        rep.mObj1 = bits;
+        return rep;
+    }
+
+    /**
+     * Create an Icon pointing to a compressed bitmap stored in a byte array.
+     * @param data Byte array storing compressed bitmap data of a type that
+     *             {@link android.graphics.BitmapFactory}
+     *             can decode (see {@link android.graphics.Bitmap.CompressFormat}).
+     * @param offset Offset into <code>data</code> at which the bitmap data starts
+     * @param length Length of the bitmap data
+     * @see android.graphics.drawable.Icon#createWithData(byte[], int, int)
+     */
+    public static IconCompat createWithData(byte[] data, int offset, int length) {
+        if (data == null) {
+            throw new IllegalArgumentException("Data must not be null.");
+        }
+        final IconCompat rep = new IconCompat(TYPE_DATA);
+        rep.mObj1 = data;
+        rep.mInt1 = offset;
+        rep.mInt2 = length;
+        return rep;
+    }
+
+    /**
+     * Create an Icon pointing to an image file specified by URI.
+     *
+     * @param uri A uri referring to local content:// or file:// image data.
+     * @see android.graphics.drawable.Icon#createWithContentUri(String)
+     */
+    public static IconCompat createWithContentUri(String uri) {
+        if (uri == null) {
+            throw new IllegalArgumentException("Uri must not be null.");
+        }
+        final IconCompat rep = new IconCompat(TYPE_URI);
+        rep.mObj1 = uri;
+        return rep;
+    }
+
+    /**
+     * Create an Icon pointing to an image file specified by URI.
+     *
+     * @param uri A uri referring to local content:// or file:// image data.
+     * @see android.graphics.drawable.Icon#createWithContentUri(String)
+     */
+    public static IconCompat createWithContentUri(Uri uri) {
+        if (uri == null) {
+            throw new IllegalArgumentException("Uri must not be null.");
+        }
+        return createWithContentUri(uri.toString());
+    }
+
+    private IconCompat(int mType) {
+        this.mType = mType;
+    }
+
+    /**
+     * @hide
+     */
+    @VisibleForTesting
+    @RestrictTo(LIBRARY_GROUP)
+    @TargetApi(Build.VERSION_CODES.O)
+    public Icon toIcon() {
+        switch (mType) {
+            case TYPE_BITMAP:
+                return Icon.createWithBitmap((Bitmap) mObj1);
+            case TYPE_ADAPTIVE_BITMAP:
+                if (BuildCompat.isAtLeastO()) {
+                    return Icon.createWithAdaptiveBitmap((Bitmap) mObj1);
+                } else {
+                    return Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon((Bitmap) mObj1));
+                }
+            case TYPE_RESOURCE:
+                return Icon.createWithResource((Context) mObj1, mInt1);
+            case TYPE_DATA:
+                return Icon.createWithData((byte[]) mObj1, mInt1, mInt2);
+            case TYPE_URI:
+                return Icon.createWithContentUri((String) mObj1);
+            default:
+                throw new IllegalArgumentException("Unknown type");
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    public void addToShortcutIntent(Intent outIntent) {
+        switch (mType) {
+            case TYPE_BITMAP:
+                outIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, (Bitmap) mObj1);
+                break;
+            case TYPE_ADAPTIVE_BITMAP:
+                outIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
+                        createLegacyIconFromAdaptiveIcon((Bitmap) mObj1));
+                break;
+            case TYPE_RESOURCE:
+                outIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+                        Intent.ShortcutIconResource.fromContext((Context) mObj1, mInt1));
+                break;
+            default:
+                throw new IllegalArgumentException("Icon type not supported for intent shortcuts");
+        }
+    }
+
+    /**
+     * Converts a bitmap following the adaptive icon guide lines, into a bitmap following the
+     * shortcut icon guide lines.
+     * The returned bitmap will always have same width and height and clipped to a circle.
+     */
+    @VisibleForTesting
+    static Bitmap createLegacyIconFromAdaptiveIcon(Bitmap adaptiveIconBitmap) {
+        int size = (int) (DEFAULT_VIEW_PORT_SCALE * Math.min(adaptiveIconBitmap.getWidth(),
+                adaptiveIconBitmap.getHeight()));
+
+        Bitmap icon = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(icon);
+        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+
+        float center = size * 0.5f;
+        float radius = center * ICON_DIAMETER_FACTOR;
+
+        // Draw key shadow
+        float blur = BLUR_FACTOR * size;
+        paint.setColor(Color.TRANSPARENT);
+        paint.setShadowLayer(blur, 0, KEY_SHADOW_OFFSET_FACTOR * size, KEY_SHADOW_ALPHA << 24);
+        canvas.drawCircle(center, center, radius, paint);
+
+        // Draw ambient shadow
+        paint.setShadowLayer(blur, 0, 0, AMBIENT_SHADOW_ALPHA << 24);
+        canvas.drawCircle(center, center, radius, paint);
+        paint.clearShadowLayer();
+
+        // Draw the clipped icon
+        paint.setColor(Color.BLACK);
+        BitmapShader shader = new BitmapShader(adaptiveIconBitmap, Shader.TileMode.CLAMP,
+                Shader.TileMode.CLAMP);
+        Matrix shift = new Matrix();
+        shift.setTranslate(-(adaptiveIconBitmap.getWidth() - size) / 2,
+                -(adaptiveIconBitmap.getHeight() - size) / 2);
+        shader.setLocalMatrix(shift);
+        paint.setShader(shader);
+        canvas.drawCircle(center, center, radius, paint);
+
+        canvas.setBitmap(null);
+        return icon;
+    }
+}
diff --git a/compat/java/android/support/v4/graphics/fonts/FontRequest.java b/compat/java/android/support/v4/graphics/fonts/FontRequest.java
new file mode 100644
index 0000000..152b264
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/fonts/FontRequest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.fonts;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.v4.util.Preconditions;
+import android.util.Base64;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Information about a font request that may be sent to a Font Provider.
+ */
+public final class FontRequest implements Parcelable {
+    private final String mProviderAuthority;
+    private final String mProviderPackage;
+    private final String mQuery;
+    private final List<List<byte[]>> mCertificates;
+
+    /**
+     * @param providerAuthority The authority of the Font Provider to be used for the request.
+     * @param query The query to be sent over to the provider. Refer to your font provider's
+     *         documentation on the format of this string.
+     * @param providerPackage The package for the Font Provider to be used for the request. This is
+     *         used to verify the identity of the provider.
+     * @param certificates The list of sets of hashes for the certificates the provider should be
+     *         signed with. This is used to verify the identity of the provider. Each set in the
+     *         list represents one collection of signature hashes. Refer to your font provider's
+     *         documentation for these values.
+     */
+    public FontRequest(@NonNull String providerAuthority, @NonNull String providerPackage,
+            @NonNull String query, @NonNull List<List<byte[]>> certificates) {
+        mProviderAuthority = Preconditions.checkNotNull(providerAuthority);
+        mProviderPackage = Preconditions.checkNotNull(providerPackage);
+        mQuery = Preconditions.checkNotNull(query);
+        mCertificates = Preconditions.checkNotNull(certificates);
+    }
+
+    /**
+     * Returns the selected font provider's authority. This tells the system what font provider
+     * it should request the font from.
+     */
+    public String getProviderAuthority() {
+        return mProviderAuthority;
+    }
+
+    /**
+     * Returns the selected font provider's package. This helps the system verify that the provider
+     * identified by the given authority is the one requested.
+     */
+    public String getProviderPackage() {
+        return mProviderPackage;
+    }
+
+    /**
+     * Returns the query string. Refer to your font provider's documentation on the format of this
+     * string.
+     */
+    public String getQuery() {
+        return mQuery;
+    }
+
+    /**
+     * Returns the list of certificate sets given for this provider. This helps the system verify
+     * that the provider identified by the given authority is the one requested.
+     */
+    public List<List<byte[]>> getCertificates() {
+        return mCertificates;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mProviderAuthority);
+        dest.writeString(mProviderPackage);
+        dest.writeString(mQuery);
+        dest.writeList(mCertificates);
+    }
+
+    private FontRequest(Parcel in) {
+        mProviderAuthority = in.readString();
+        mProviderPackage = in.readString();
+        mQuery = in.readString();
+        mCertificates = new ArrayList<>();
+        in.readList(mCertificates, null);
+    }
+
+    public static final Parcelable.Creator<FontRequest> CREATOR =
+            new Parcelable.Creator<FontRequest>() {
+                @Override
+                public FontRequest createFromParcel(Parcel in) {
+                    return new FontRequest(in);
+                }
+
+                @Override
+                public FontRequest[] newArray(int size) {
+                    return new FontRequest[size];
+                }
+            };
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("FontRequest {"
+                + "mProviderAuthority: " + mProviderAuthority
+                + ", mProviderPackage: " + mProviderPackage
+                + ", mQuery: " + mQuery
+                + ", mCertificates:");
+        for (int i = 0; i < mCertificates.size(); i++) {
+            builder.append(" [");
+            List<byte[]> set = mCertificates.get(i);
+            for (int j = 0; j < set.size(); j++) {
+                builder.append(" \"");
+                byte[] array = set.get(j);
+                builder.append(Base64.encodeToString(array, Base64.DEFAULT));
+                builder.append("\"");
+            }
+            builder.append(" ]");
+        }
+        builder.append("}");
+        return builder.toString();
+    }
+}
diff --git a/compat/java/android/support/v4/graphics/fonts/FontResult.java b/compat/java/android/support/v4/graphics/fonts/FontResult.java
new file mode 100644
index 0000000..19ce48f
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/fonts/FontResult.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.fonts;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v4.util.Preconditions;
+
+/**
+ * Results returned from a Font Provider to the system.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+public final class FontResult implements Parcelable {
+    private final ParcelFileDescriptor mFileDescriptor;
+    private final int mTtcIndex;
+    private final String mFontVariationSettings;
+    private final int mWeight;
+    private final boolean mItalic;
+
+    /**
+     * Creates a FontResult with all the information needed about a provided font.
+     * @param fileDescriptor A ParcelFileDescriptor pointing to the font file. This shoult point to
+     *                       a real file or shared memory, as the client will mmap the given file
+     *                       descriptor. Pipes, sockets and other non-mmap-able file descriptors
+     *                       will fail to load in the client application.
+     * @param ttcIndex If providing a TTC_INDEX file, the index to point to. Otherwise, 0.
+     * @param fontVariationSettings If providing a variation font, the settings for it. May be null.
+     * @param weight An integer that indicates the font weight.
+     * @param italic A boolean that indicates the font is italic style or not.
+     */
+    public FontResult(@NonNull ParcelFileDescriptor fileDescriptor, int ttcIndex,
+            @Nullable String fontVariationSettings, int weight, boolean italic) {
+        mFileDescriptor = Preconditions.checkNotNull(fileDescriptor);
+        mTtcIndex = ttcIndex;
+        mFontVariationSettings = fontVariationSettings;
+        mWeight = weight;
+        mItalic = italic;
+    }
+
+    public ParcelFileDescriptor getFileDescriptor() {
+        return mFileDescriptor;
+    }
+
+    public int getTtcIndex() {
+        return mTtcIndex;
+    }
+
+    public String getFontVariationSettings() {
+        return mFontVariationSettings;
+    }
+
+    public int getWeight() {
+        return mWeight;
+    }
+
+    public boolean getItalic() {
+        return mItalic;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeParcelable(mFileDescriptor, flags);
+        dest.writeInt(mTtcIndex);
+        dest.writeInt(mFontVariationSettings != null ? 1 : 0);
+        if (mFontVariationSettings != null) {
+            dest.writeString(mFontVariationSettings);
+        }
+        dest.writeInt(mWeight);
+        dest.writeInt(mItalic ? 1 : 0);
+    }
+
+    private FontResult(Parcel in) {
+        mFileDescriptor = in.readParcelable(null);
+        mTtcIndex = in.readInt();
+        if (in.readInt() == 1) {
+            mFontVariationSettings = in.readString();
+        } else {
+            mFontVariationSettings = null;
+        }
+        mWeight = in.readInt();
+        mItalic = in.readInt() == 1;
+    }
+
+    public static final Parcelable.Creator<FontResult> CREATOR =
+            new Parcelable.Creator<FontResult>() {
+                @Override
+                public FontResult createFromParcel(Parcel in) {
+                    return new FontResult(in);
+                }
+
+                @Override
+                public FontResult[] newArray(int size) {
+                    return new FontResult[size];
+                }
+            };
+}
diff --git a/compat/java/android/support/v4/internal/view/SupportMenuItem.java b/compat/java/android/support/v4/internal/view/SupportMenuItem.java
index 4f1f5a1..e6cdd3d 100644
--- a/compat/java/android/support/v4/internal/view/SupportMenuItem.java
+++ b/compat/java/android/support/v4/internal/view/SupportMenuItem.java
@@ -18,6 +18,9 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.view.ActionProvider;
 import android.view.MenuItem;
@@ -329,4 +332,47 @@
      */
     @Override
     int getAlphabeticModifiers();
+
+    /**
+     * Applies a tint to this item's icon. Does not modify the
+     * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
+     * <p>
+     * Subsequent calls to {@link MenuItem#setIcon(Drawable)} or {@link MenuItem#setIcon(int)} will
+     * automatically mutate the icon and apply the specified tint and
+     * tint mode.
+     *
+     * @param tint the tint to apply, may be {@code null} to clear tint
+     *
+     * @see #getIconTintList()
+     */
+    @Override
+    MenuItem setIconTintList(ColorStateList tint);
+
+    /**
+     * @return the tint applied to this item's icon
+     * @see #setIconTintList(ColorStateList)
+     */
+    @Override
+    ColorStateList getIconTintList();
+
+    /**
+     * Specifies the blending mode used to apply the tint specified by
+     * {@link #setIconTintList(ColorStateList)} to this item's icon. 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 #setIconTintList(ColorStateList)
+     */
+    @Override
+    MenuItem setIconTintMode(PorterDuff.Mode tintMode);
+
+    /**
+     * Returns the blending mode used to apply the tint to this item's icon, if specified.
+     *
+     * @return the blending mode used to apply the tint to this item's icon
+     * @see #setIconTintMode(PorterDuff.Mode)
+     */
+    @Override
+    PorterDuff.Mode getIconTintMode();
 }
\ No newline at end of file
diff --git a/compat/java/android/support/v4/os/BuildCompat.java b/compat/java/android/support/v4/os/BuildCompat.java
index 6358b9e..2bfd907 100644
--- a/compat/java/android/support/v4/os/BuildCompat.java
+++ b/compat/java/android/support/v4/os/BuildCompat.java
@@ -14,51 +14,84 @@
  * limitations under the License.
  */
 
-
 package android.support.v4.os;
 
 import android.os.Build.VERSION;
 
 /**
- * BuildCompat contains additional platform version checking methods for
- * testing compatibility with new features.
+ * This class contains additional platform version checking methods for targeting pre-release
+ * versions of Android.
  */
 public class BuildCompat {
     private BuildCompat() {
     }
-    /* Boilerplate for isAtLeast${PLATFORM}:
-     * public static boolean isAtLeast*() {
-     *     return !"REL".equals(VERSION.CODENAME)
-     *             && ("${PLATFORM}".equals(VERSION.CODENAME)
-     *                     || VERSION.CODENAME.startsWith("${PLATFORM}MR"));
-     * }
-     */
 
     /**
-     * Check if the device is running on the Android N release or newer.
+     * Checks if the device is running on the Android N release or newer.
      *
      * @return {@code true} if N APIs are available for use
+     * @deprecated Android N is a finalized release and this method is no longer necessary. It will
+     *             be removed in a future release of the Support Library. Instead, use
+     *             {@code Build.SDK_INT >= Build.VERSION_CODES#N}.
      */
+    @Deprecated
     public static boolean isAtLeastN() {
         return VERSION.SDK_INT >= 24;
     }
 
     /**
-     * Check if the device is running on the Android N MR1 release or newer.
+     * Checks if the device is running on the Android N MR1 release or newer.
      *
      * @return {@code true} if N MR1 APIs are available for use
+     * @deprecated Android N MR1 is a finalized release and this method is no longer necessary. It
+     *             will be removed in a future release of the Support Library. Instead, use
+     *             {@code Build.SDK_INT >= Build.VERSION_CODES#N_MR1}.
      */
+    @Deprecated
     public static boolean isAtLeastNMR1() {
         return VERSION.SDK_INT >= 25;
     }
 
     /**
-     * Check if the device is running on the Android O release or newer.
+     * Checks if the device is running on a pre-release version of Android O or newer.
+     * <p>
+     * <strong>Note:</strong> This method will return {@code false} on devices running release
+     * versions of Android. When Android O is finalized for release, this method will be deprecated
+     * and all calls should be replaced with {@code Build.SDK_INT >= Build.VERSION_CODES#O}.
      *
-     * @return {@code true} if O APIs are available for use
+     * @return {@code true} if O APIs are available for use, {@code false} otherwise
      */
     public static boolean isAtLeastO() {
-        return !"REL".equals(VERSION.CODENAME)
-                && ("O".equals(VERSION.CODENAME) || VERSION.CODENAME.startsWith("OMR"));
+        return VERSION.CODENAME.equals("O")
+                || VERSION.CODENAME.startsWith("ODR")
+                || isAtLeastOMR1();
+    }
+
+    /**
+     * Checks if the device is running on a pre-release version of Android O MR1 or newer.
+     * <p>
+     * <strong>Note:</strong> This method will return {@code false} on devices running release
+     * versions of Android. When Android O MR1 is finalized for release, this method will be
+     * deprecated and all calls should be replaced with
+     * {@code Build.SDK_INT >= Build.VERSION_CODES#O_MR1}.
+     *
+     * @return {@code true} if O MR1 APIs are available for use, {@code false} otherwise
+     */
+    public static boolean isAtLeastOMR1() {
+        return VERSION.CODENAME.startsWith("OMR")
+                || isAtLeastP();
+    }
+
+    /**
+     * Checks if the device is running on a pre-release version of Android P or newer.
+     * <p>
+     * <strong>Note:</strong> This method will return {@code false} on devices running release
+     * versions of Android. When Android P is finalized for release, this method will be deprecated
+     * and all calls should be replaced with {@code Build.SDK_INT >= Build.VERSION_CODES#P}.
+     *
+     * @return {@code true} if P APIs are available for use, {@code false} otherwise
+     */
+    public static boolean isAtLeastP() {
+        return VERSION.CODENAME.equals("P");
     }
 }
diff --git a/compat/java/android/support/v4/os/EnvironmentCompat.java b/compat/java/android/support/v4/os/EnvironmentCompat.java
index 9781a8a..90c8e15 100644
--- a/compat/java/android/support/v4/os/EnvironmentCompat.java
+++ b/compat/java/android/support/v4/os/EnvironmentCompat.java
@@ -24,8 +24,7 @@
 import java.io.IOException;
 
 /**
- * Helper for accessing features in {@link Environment} introduced after API
- * level 4 in a backwards compatible fashion.
+ * Helper for accessing features in {@link Environment} in a backwards compatible fashion.
  */
 public final class EnvironmentCompat {
     private static final String TAG = "EnvironmentCompat";
@@ -54,7 +53,7 @@
      */
     public static String getStorageState(File path) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return EnvironmentCompatKitKat.getStorageState(path);
+            return Environment.getStorageState(path);
         }
 
         try {
diff --git a/compat/java/android/support/v4/os/UserManagerCompat.java b/compat/java/android/support/v4/os/UserManagerCompat.java
index d73354f..0a82a5d 100644
--- a/compat/java/android/support/v4/os/UserManagerCompat.java
+++ b/compat/java/android/support/v4/os/UserManagerCompat.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.Build;
+import android.os.UserManager;
 
 /**
  * Helper for accessing features in {@link android.os.UserManager} in a backwards compatible
@@ -36,7 +37,7 @@
      */
     public static boolean isUserUnlocked(Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
-            return UserManagerCompatApi24.isUserUnlocked(context);
+            return context.getSystemService(UserManager.class).isUserUnlocked();
         } else {
             return true;
         }
diff --git a/compat/java/android/support/v4/provider/FontsContract.java b/compat/java/android/support/v4/provider/FontsContract.java
new file mode 100644
index 0000000..935ecfe
--- /dev/null
+++ b/compat/java/android/support/v4/provider/FontsContract.java
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.provider;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.Signature;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+import android.provider.BaseColumns;
+import android.support.annotation.GuardedBy;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.graphics.fonts.FontRequest;
+import android.support.v4.graphics.fonts.FontResult;
+import android.support.v4.os.ResultReceiver;
+import android.util.Log;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Utility class to deal with Font ContentProviders.
+ */
+public class FontsContract {
+    private static final String TAG = "FontsContractCompat";
+
+    /**
+     * Defines the constants used in a response from a Font Provider. The cursor returned from the
+     * query should have the ID column populated with the content uri ID for the resulting font.
+     * This should point to a real file or shared memory, as the client will mmap the given file
+     * descriptor. Pipes, sockets and other non-mmap-able file descriptors will fail to load in the
+     * client application.
+     */
+    public static final class Columns implements BaseColumns {
+        /**
+         * Constant used to request data from a font provider. The cursor returned from the query
+         * should have this column populated with an int for the ttc index for the resulting font.
+         */
+        public static final String TTC_INDEX = android.provider.FontsContract.Columns.TTC_INDEX;
+        /**
+         * Constant used to request data from a font provider. The cursor returned from the query
+         * may populate this column with the font variation settings String information for the
+         * font.
+         */
+        public static final String VARIATION_SETTINGS =
+                android.provider.FontsContract.Columns.VARIATION_SETTINGS;
+        /**
+         * Constant used to request data from a font provider. The cursor returned from the query
+         * should have this column populated with the int weight for the resulting font. This value
+         * should be between 100 and 900. The most common values are 400 for regular weight and 700
+         * for bold weight.
+         */
+        public static final String WEIGHT = android.provider.FontsContract.Columns.WEIGHT;
+        /**
+         * Constant used to request data from a font provider. The cursor returned from the query
+         * should have this column populated with the int italic for the resulting font. This should
+         * be 0 for regular style and 1 for italic.
+         */
+        public static final String ITALIC = android.provider.FontsContract.Columns.ITALIC;
+        /**
+         * Constant used to request data from a font provider. The cursor returned from the query
+         * should have this column populated to indicate the result status of the
+         * query. This will be checked before any other data in the cursor. Possible values are
+         * {@link #RESULT_CODE_OK}, {@link #RESULT_CODE_FONT_NOT_FOUND},
+         * {@link #RESULT_CODE_MALFORMED_QUERY} and {@link #RESULT_CODE_FONT_UNAVAILABLE}. If not
+         * present, {@link #RESULT_CODE_OK} will be assumed.
+         */
+        public static final String RESULT_CODE = android.provider.FontsContract.Columns.RESULT_CODE;
+
+        /**
+         * Constant used to represent a result was retrieved successfully. The given fonts will be
+         * attempted to retrieve immediately via
+         * {@link android.content.ContentProvider#openFile(Uri, String)}. See {@link #RESULT_CODE}.
+         */
+        public static final int RESULT_CODE_OK =
+                android.provider.FontsContract.Columns.RESULT_CODE_OK;
+        /**
+         * Constant used to represent a result was not found. See {@link #RESULT_CODE}.
+         */
+        public static final int RESULT_CODE_FONT_NOT_FOUND =
+                android.provider.FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
+        /**
+         * Constant used to represent a result was found, but cannot be provided at this moment. Use
+         * this to indicate, for example, that a font needs to be fetched from the network. See
+         * {@link #RESULT_CODE}.
+         */
+        public static final int RESULT_CODE_FONT_UNAVAILABLE =
+                android.provider.FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
+        /**
+         * Constant used to represent that the query was not in a supported format by the provider.
+         * See {@link #RESULT_CODE}.
+         */
+        public static final int RESULT_CODE_MALFORMED_QUERY =
+                android.provider.FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
+    }
+
+    /**
+     * Constant used to identify the List of {@link ParcelFileDescriptor} item in the Bundle
+     * returned to the ResultReceiver in getFont.
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    public static final String PARCEL_FONT_RESULTS = "font_results";
+
+    // Error codes internal to the system, which can not come from a provider. To keep the number
+    // space open for new provider codes, these should all be negative numbers.
+    /** @hide */
+    @RestrictTo(LIBRARY_GROUP)
+    public static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
+    /** @hide */
+    @RestrictTo(LIBRARY_GROUP)
+    public static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
+    // Note -3 is used by Typeface to indicate the font failed to load.
+
+    private static final int THREAD_RENEWAL_THRESHOLD_MS = 10000;
+
+    private final Context mContext;
+    private final PackageManager mPackageManager;
+    private final Object mLock = new Object();
+    @GuardedBy("mLock")
+    private Handler mHandler;
+    @GuardedBy("mLock")
+    private HandlerThread mThread;
+
+    /** @hide */
+    @RestrictTo(LIBRARY_GROUP)
+    public FontsContract(Context context) {
+        mContext = context.getApplicationContext();
+        mPackageManager = mContext.getPackageManager();
+    }
+
+    @VisibleForTesting
+    FontsContract(Context context, PackageManager packageManager) {
+        mContext = context;
+        mPackageManager = packageManager;
+    }
+
+    // We use a background thread to post the content resolving work for all requests on. This
+    // thread should be quit/stopped after all requests are done.
+    private final Runnable mReplaceDispatcherThreadRunnable = new Runnable() {
+        @Override
+        public void run() {
+            synchronized (mLock) {
+                if (mThread != null) {
+                    mThread.quit();
+                    mThread = null;
+                    mHandler = null;
+                }
+            }
+        }
+    };
+
+    /** @hide */
+    @RestrictTo(LIBRARY_GROUP)
+    public void getFont(final FontRequest request, final ResultReceiver receiver) {
+        synchronized (mLock) {
+            if (mHandler == null) {
+                mThread = new HandlerThread("fonts", Process.THREAD_PRIORITY_BACKGROUND);
+                mThread.start();
+                mHandler = new Handler(mThread.getLooper());
+            }
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    ProviderInfo providerInfo = getProvider(request, receiver);
+                    if (providerInfo == null) {
+                        return;
+                    }
+                    getFontFromProvider(request, receiver, providerInfo.authority);
+                }
+            });
+            mHandler.removeCallbacks(mReplaceDispatcherThreadRunnable);
+            mHandler.postDelayed(mReplaceDispatcherThreadRunnable, THREAD_RENEWAL_THRESHOLD_MS);
+        }
+    }
+
+    @VisibleForTesting
+    ProviderInfo getProvider(FontRequest request, ResultReceiver receiver) {
+        String providerAuthority = request.getProviderAuthority();
+        ProviderInfo info = mPackageManager.resolveContentProvider(providerAuthority, 0);
+        if (info == null) {
+            Log.e(TAG, "Can't find content provider " + providerAuthority);
+            receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
+            return null;
+        }
+
+        if (!info.packageName.equals(request.getProviderPackage())) {
+            Log.e(TAG, "Found content provider " + providerAuthority + ", but package was not "
+                    + request.getProviderPackage());
+            receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
+            return null;
+        }
+
+        List<byte[]> signatures;
+        try {
+            PackageInfo packageInfo = mPackageManager.getPackageInfo(info.packageName,
+                    PackageManager.GET_SIGNATURES);
+            signatures = convertToByteArrayList(packageInfo.signatures);
+            Collections.sort(signatures, sByteArrayComparator);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Can't find content provider " + providerAuthority, e);
+            receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
+            return null;
+        }
+        List<List<byte[]>> requestCertificatesList = request.getCertificates();
+        for (int i = 0; i < requestCertificatesList.size(); ++i) {
+            // Make a copy so we can sort it without modifying the incoming data.
+            List<byte[]> requestSignatures = new ArrayList<>(requestCertificatesList.get(i));
+            Collections.sort(requestSignatures, sByteArrayComparator);
+            if (equalsByteArrayList(signatures, requestSignatures)) {
+                return info;
+            }
+        }
+        Log.e(TAG, "Certificates don't match for given provider " + providerAuthority);
+        receiver.send(RESULT_CODE_WRONG_CERTIFICATES, null);
+        return null;
+    }
+
+    private static final Comparator<byte[]> sByteArrayComparator = new Comparator<byte[]>() {
+        @Override
+        public int compare(byte[] l, byte[] r) {
+            if (l.length != r.length) {
+                return l.length - r.length;
+            }
+            for (int i = 0; i < l.length; ++i) {
+                if (l[i] != r[i]) {
+                    return l[i] - r[i];
+                }
+            }
+            return 0;
+        }
+    };
+
+    private boolean equalsByteArrayList(List<byte[]> signatures, List<byte[]> requestSignatures) {
+        if (signatures.size() != requestSignatures.size()) {
+            return false;
+        }
+        for (int i = 0; i < signatures.size(); ++i) {
+            if (!Arrays.equals(signatures.get(i), requestSignatures.get(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private List<byte[]> convertToByteArrayList(Signature[] signatures) {
+        List<byte[]> shas = new ArrayList<>();
+        for (int i = 0; i < signatures.length; ++i) {
+            shas.add(signatures[i].toByteArray());
+        }
+        return shas;
+    }
+
+    @VisibleForTesting
+    void getFontFromProvider(FontRequest request, ResultReceiver receiver,
+            String authority) {
+        ArrayList<FontResult> result = null;
+        Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority)
+                .build();
+        Cursor cursor = null;
+        try {
+            cursor = mContext.getContentResolver().query(uri, new String[] { Columns._ID,
+                    Columns.TTC_INDEX, Columns.VARIATION_SETTINGS, Columns.WEIGHT, Columns.ITALIC,
+                    Columns.RESULT_CODE },
+                    "query = ?", new String[] { request.getQuery() }, null);
+            if (cursor != null && cursor.getCount() > 0) {
+                final int resultCodeColumnIndex = cursor.getColumnIndex(Columns.RESULT_CODE);
+                int resultCode = -1;
+                result = new ArrayList<>();
+                final int idColumnIndex = cursor.getColumnIndex(Columns._ID);
+                final int ttcIndexColumnIndex = cursor.getColumnIndex(Columns.TTC_INDEX);
+                final int vsColumnIndex = cursor.getColumnIndex(Columns.VARIATION_SETTINGS);
+                final int weightColumnIndex = cursor.getColumnIndex(Columns.WEIGHT);
+                final int italicColumnIndex = cursor.getColumnIndex(Columns.ITALIC);
+                while (cursor.moveToNext()) {
+                    resultCode = resultCodeColumnIndex != -1
+                            ? cursor.getInt(resultCodeColumnIndex) : Columns.RESULT_CODE_OK;
+                    if (resultCode != Columns.RESULT_CODE_OK) {
+                        if (resultCode < 0) {
+                            // Negative values are reserved for the internal errors.
+                            resultCode = Columns.RESULT_CODE_FONT_NOT_FOUND;
+                        }
+                        for (int i = 0; i < result.size(); ++i) {
+                            try {
+                                result.get(i).getFileDescriptor().close();
+                            } catch (IOException e) {
+                                // Ignore, as we are closing fds for cleanup.
+                            }
+                        }
+                        receiver.send(resultCode, null);
+                        return;
+                    }
+                    long id = cursor.getLong(idColumnIndex);
+                    Uri fileUri = ContentUris.withAppendedId(uri, id);
+                    try {
+                        ParcelFileDescriptor pfd =
+                                mContext.getContentResolver().openFileDescriptor(fileUri, "r");
+                        final int ttcIndex = ttcIndexColumnIndex != -1
+                                ? cursor.getInt(ttcIndexColumnIndex) : 0;
+                        final String variationSettings = vsColumnIndex != -1
+                                ? cursor.getString(vsColumnIndex) : null;
+                        int weight;
+                        boolean italic;
+                        if (weightColumnIndex != -1 && italicColumnIndex != -1) {
+                            weight = cursor.getInt(weightColumnIndex);
+                            italic = cursor.getInt(italicColumnIndex) == 1;
+                        } else {
+                            weight = 400;
+                            italic = false;
+                        }
+                        result.add(
+                                new FontResult(pfd, ttcIndex, variationSettings, weight, italic));
+                    } catch (FileNotFoundException e) {
+                        Log.e(TAG, "FileNotFoundException raised when interacting with content "
+                                + "provider " + authority, e);
+                    }
+                }
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        if (result != null && !result.isEmpty()) {
+            Bundle bundle = new Bundle();
+            bundle.putParcelableArrayList(PARCEL_FONT_RESULTS, result);
+            receiver.send(Columns.RESULT_CODE_OK, bundle);
+            return;
+        }
+        receiver.send(Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+    }
+}
diff --git a/compat/java/android/support/v4/view/MenuItemCompat.java b/compat/java/android/support/v4/view/MenuItemCompat.java
index 0c5ba63..649c413 100644
--- a/compat/java/android/support/v4/view/MenuItemCompat.java
+++ b/compat/java/android/support/v4/view/MenuItemCompat.java
@@ -16,6 +16,9 @@
 
 package android.support.v4.view;
 
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
 import android.support.annotation.RequiresApi;
 import android.support.v4.internal.view.SupportMenuItem;
 import android.support.v4.os.BuildCompat;
@@ -27,7 +30,7 @@
 
 /**
  * Helper for accessing features in {@link android.view.MenuItem}
- * introduced after API level 4 in a backwards compatible fashion.
+ * introduced after API level 14 in a backwards compatible fashion.
  * <p class="note"><strong>Note:</strong> You cannot get an instance of this class. Instead,
  * it provides <em>static</em> methods that correspond to the methods in {@link
  * android.view.MenuItem}, but take a {@link android.view.MenuItem} object as an additional
@@ -98,6 +101,10 @@
         int getAlphabeticModifiers(MenuItem item);
         void setNumericShortcut(MenuItem item, char numericChar, int numericModifiers);
         int getNumericModifiers(MenuItem item);
+        void setIconTintList(MenuItem item, ColorStateList tint);
+        ColorStateList getIconTintList(MenuItem item);
+        void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode);
+        PorterDuff.Mode getIconTintMode(MenuItem item);
     }
 
     /**
@@ -173,6 +180,24 @@
         public int getNumericModifiers(MenuItem item) {
             return 0;
         }
+
+        @Override
+        public void setIconTintList(MenuItem item, ColorStateList tint) {
+        }
+
+        @Override
+        public ColorStateList getIconTintList(MenuItem item) {
+            return null;
+        }
+
+        @Override
+        public void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {
+        }
+
+        @Override
+        public PorterDuff.Mode getIconTintMode(MenuItem item) {
+            return null;
+        }
     }
 
     @RequiresApi(26)
@@ -222,6 +247,26 @@
         public int getNumericModifiers(MenuItem item) {
             return item.getNumericModifiers();
         }
+
+        @Override
+        public void setIconTintList(MenuItem item, ColorStateList tint) {
+            item.setIconTintList(tint);
+        }
+
+        @Override
+        public ColorStateList getIconTintList(MenuItem item) {
+            return item.getIconTintList();
+        }
+
+        @Override
+        public void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {
+            item.setIconTintMode(tintMode);
+        }
+
+        @Override
+        public PorterDuff.Mode getIconTintMode(MenuItem item) {
+            return item.getIconTintMode();
+        }
     }
 
     /**
@@ -230,7 +275,6 @@
     static final MenuVersionImpl IMPL;
     static {
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             IMPL = new MenuItemCompatApi26Impl();
         } else {
             IMPL = new MenuItemCompatBaseImpl();
@@ -545,7 +589,7 @@
      *
      * @return Modifier associated with the numeric shortcut.
      */
-    public int getNumericModifiers(MenuItem item) {
+    public static int getNumericModifiers(MenuItem item) {
         if (item instanceof SupportMenuItem) {
             return ((SupportMenuItem) item).getNumericModifiers();
         }
@@ -587,12 +631,73 @@
      *
      * @return Modifier associated with the keyboard shortcut.
      */
-    public int getAlphabeticModifiers(MenuItem item) {
+    public static int getAlphabeticModifiers(MenuItem item) {
         if (item instanceof SupportMenuItem) {
             return ((SupportMenuItem) item).getAlphabeticModifiers();
         }
         return IMPL.getAlphabeticModifiers(item);
     }
 
+    /**
+     * Applies a tint to the item's icon. Does not modify the
+     * current tint mode of that item, which is {@link PorterDuff.Mode#SRC_IN} by default.
+     * <p>
+     * Subsequent calls to {@link MenuItem#setIcon(Drawable)} or {@link MenuItem#setIcon(int)} will
+     * automatically mutate the icon and apply the specified tint and
+     * tint mode.
+     *
+     * @param tint the tint to apply, may be {@code null} to clear tint
+     *
+     * @see #getIconTintList(MenuItem)
+     */
+    public static void setIconTintList(MenuItem item, ColorStateList tint) {
+        if (item instanceof SupportMenuItem) {
+            ((SupportMenuItem) item).setIconTintList(tint);
+        } else {
+            IMPL.setIconTintList(item, tint);
+        }
+    }
+
+    /**
+     * @return the tint applied to the item's icon
+     * @see #setIconTintList(MenuItem, ColorStateList)
+     */
+    public static ColorStateList getIconTintList(MenuItem item) {
+        if (item instanceof SupportMenuItem) {
+            return ((SupportMenuItem) item).getIconTintList();
+        }
+        return IMPL.getIconTintList(item);
+    }
+
+    /**
+     * Specifies the blending mode used to apply the tint specified by
+     * {@link #setIconTintList(MenuItem, ColorStateList)} to the item's icon. 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 #setIconTintList(MenuItem, ColorStateList)
+     */
+    public static void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {
+        if (item instanceof SupportMenuItem) {
+            ((SupportMenuItem) item).setIconTintMode(tintMode);
+        } else {
+            IMPL.setIconTintMode(item, tintMode);
+        }
+    }
+
+    /**
+     * Returns the blending mode used to apply the tint to the item's icon, if specified.
+     *
+     * @return the blending mode used to apply the tint to the item's icon
+     * @see #setIconTintMode(MenuItem, PorterDuff.Mode)
+     */
+    public static PorterDuff.Mode getIconTintMode(MenuItem item) {
+        if (item instanceof SupportMenuItem) {
+            return ((SupportMenuItem) item).getIconTintMode();
+        }
+        return IMPL.getIconTintMode(item);
+    }
+
     private MenuItemCompat() {}
 }
diff --git a/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java b/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
index 9141fb1..afe7a53 100644
--- a/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
+++ b/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
@@ -17,78 +17,68 @@
 package android.support.v4.view;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
+import android.view.ScaleGestureDetector;
 
 /**
- * Helper for accessing features in <code>ScaleGestureDetector</code> introduced
- * after API level 19 (KitKat) in a backwards compatible fashion.
+ * Helper for accessing features in {@link ScaleGestureDetector} in a backwards compatible fashion.
  */
 public final class ScaleGestureDetectorCompat {
-    static final ScaleGestureDetectorImpl IMPL;
-
-    interface ScaleGestureDetectorImpl {
-
-        public void setQuickScaleEnabled(Object o, boolean enabled);
-
-        public boolean isQuickScaleEnabled(Object o);
-    }
-
-    private static class BaseScaleGestureDetectorImpl implements ScaleGestureDetectorImpl {
-        BaseScaleGestureDetectorImpl() {
-        }
-
-        @Override
-        public void setQuickScaleEnabled(Object o, boolean enabled) {
-            // Intentionally blank
-        }
-
-        @Override
-        public boolean isQuickScaleEnabled(Object o) {
-            return false;
-        }
-    }
-
-    @RequiresApi(19)
-    private static class ScaleGestureDetectorCompatKitKatImpl implements ScaleGestureDetectorImpl {
-        ScaleGestureDetectorCompatKitKatImpl() {
-        }
-
-        @Override
-        public void setQuickScaleEnabled(Object o, boolean enabled) {
-            ScaleGestureDetectorCompatKitKat.setQuickScaleEnabled(o, enabled);
-        }
-
-        @Override
-        public boolean isQuickScaleEnabled(Object o) {
-            return ScaleGestureDetectorCompatKitKat.isQuickScaleEnabled(o);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 19) { // KitKat
-            IMPL = new ScaleGestureDetectorCompatKitKatImpl();
-        } else {
-            IMPL = new BaseScaleGestureDetectorImpl();
-        }
-    }
-
     private ScaleGestureDetectorCompat() {}
 
     /**
-     * Set whether the associated <code>OnScaleGestureListener</code> should receive onScale
-     * callbacks when the user performs a doubleTap followed by a swipe. Note that this is enabled
-     * by default if the app targets API 19 and newer.
+     * Sets whether the associated {@link ScaleGestureDetector.OnScaleGestureListener} should
+     * receive onScale callbacks when the user performs a doubleTap followed by a swipe. Note that
+     * this is enabled by default if the app targets API 19 and newer.
+     *
      * @param enabled true to enable quick scaling, false to disable
+     *
+     * @deprecated Use {@link #setQuickScaleEnabled(ScaleGestureDetector, boolean)} that takes
+     * {@link ScaleGestureDetector} instead of {@link Object}.
      */
+    @Deprecated
     public static void setQuickScaleEnabled(Object scaleGestureDetector, boolean enabled) {
-        IMPL.setQuickScaleEnabled(scaleGestureDetector, enabled);
+        ScaleGestureDetectorCompat.setQuickScaleEnabled(
+                (ScaleGestureDetector) scaleGestureDetector, enabled);
     }
 
     /**
-     * Return whether the quick scale gesture, in which the user performs a double tap followed by a
-     * swipe, should perform scaling. See <code>setQuickScaleEnabled(Object, boolean)<code>.
+     * Sets whether the associated {@link ScaleGestureDetector.OnScaleGestureListener} should
+     * receive onScale callbacks when the user performs a doubleTap followed by a swipe. Note that
+     * this is enabled by default if the app targets API 19 and newer.
+     *
+     * @param enabled true to enable quick scaling, false to disable
      */
+    public static void setQuickScaleEnabled(
+            ScaleGestureDetector scaleGestureDetector, boolean enabled) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            scaleGestureDetector.setQuickScaleEnabled(enabled);
+        }
+    }
+
+    /**
+     * Returns whether the quick scale gesture, in which the user performs a double tap followed by
+     * a swipe, should perform scaling. See
+     * {@link #setQuickScaleEnabled(ScaleGestureDetector, boolean)}.
+     *
+     * @deprecated Use {@link #isQuickScaleEnabled(ScaleGestureDetector)} that takes
+     * {@link ScaleGestureDetector} instead of {@link Object}.
+     */
+    @Deprecated
     public static boolean isQuickScaleEnabled(Object scaleGestureDetector) {
-        return IMPL.isQuickScaleEnabled(scaleGestureDetector); // KitKat
+        return ScaleGestureDetectorCompat.isQuickScaleEnabled(
+                (ScaleGestureDetector) scaleGestureDetector);
+    }
+
+    /**
+     * Returns whether the quick scale gesture, in which the user performs a double tap followed by
+     * a swipe, should perform scaling. See
+     * {@link #setQuickScaleEnabled(ScaleGestureDetector, boolean)}.
+     */
+    public static boolean isQuickScaleEnabled(ScaleGestureDetector scaleGestureDetector) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            return scaleGestureDetector.isQuickScaleEnabled();
+        } else {
+            return false;
+        }
     }
 }
diff --git a/compat/java/android/support/v4/view/ViewCompat.java b/compat/java/android/support/v4/view/ViewCompat.java
index df7953d..3391a42 100644
--- a/compat/java/android/support/v4/view/ViewCompat.java
+++ b/compat/java/android/support/v4/view/ViewCompat.java
@@ -58,6 +58,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.WeakHashMap;
 
 /**
@@ -923,6 +924,44 @@
 
         public void setTooltipText(View view, CharSequence tooltipText) {
         }
+
+        public int getNextClusterForwardId(@NonNull View view) {
+            return View.NO_ID;
+        }
+
+        public void setNextClusterForwardId(@NonNull View view, int nextClusterForwardId) {
+            // no-op
+        }
+
+        public boolean isKeyboardNavigationCluster(@NonNull View view) {
+            return false;
+        }
+
+        public void setKeyboardNavigationCluster(@NonNull View view, boolean isCluster) {
+            // no-op
+        }
+
+        public boolean isFocusedByDefault(@NonNull View view) {
+            return false;
+        }
+
+        public void setFocusedByDefault(@NonNull View view, boolean isFocusedByDefault) {
+            // no-op
+        }
+
+        public View keyboardNavigationClusterSearch(@NonNull View view, View currentCluster,
+                @FocusDirection int direction) {
+            return null;
+        }
+
+        public void addKeyboardNavigationClusters(@NonNull View view,
+                @NonNull Collection<View> views, int direction) {
+            // no-op
+        }
+
+        public boolean restoreDefaultFocus(@NonNull View view) {
+            return view.requestFocus();
+        }
     }
 
     @RequiresApi(15)
@@ -1459,12 +1498,58 @@
         public void setTooltipText(View view, CharSequence tooltipText) {
             view.setTooltipText(tooltipText);
         }
+
+        @Override
+        public int getNextClusterForwardId(@NonNull View view) {
+            return view.getNextClusterForwardId();
+        }
+
+        @Override
+        public void setNextClusterForwardId(@NonNull View view, int nextClusterForwardId) {
+            view.setNextClusterForwardId(nextClusterForwardId);
+        }
+
+        @Override
+        public boolean isKeyboardNavigationCluster(@NonNull View view) {
+            return view.isKeyboardNavigationCluster();
+        }
+
+        @Override
+        public void setKeyboardNavigationCluster(@NonNull View view, boolean isCluster) {
+            view.setKeyboardNavigationCluster(isCluster);
+        }
+
+        @Override
+        public boolean isFocusedByDefault(@NonNull View view) {
+            return view.isFocusedByDefault();
+        }
+
+        @Override
+        public void setFocusedByDefault(@NonNull View view, boolean isFocusedByDefault) {
+            view.setFocusedByDefault(isFocusedByDefault);
+        }
+
+        @Override
+        public View keyboardNavigationClusterSearch(@NonNull View view, View currentCluster,
+                @FocusDirection int direction) {
+            return view.keyboardNavigationClusterSearch(currentCluster, direction);
+        }
+
+        @Override
+        public void addKeyboardNavigationClusters(@NonNull View view,
+                @NonNull Collection<View> views, int direction) {
+            view.addKeyboardNavigationClusters(views, direction);
+        }
+
+        @Override
+        public boolean restoreDefaultFocus(@NonNull View view) {
+            return view.restoreDefaultFocus();
+        }
     }
 
     static final ViewCompatBaseImpl IMPL;
     static {
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             IMPL = new ViewCompatApi26Impl();
         } else if (Build.VERSION.SDK_INT >= 24) {
             IMPL = new ViewCompatApi24Impl();
@@ -3353,5 +3438,117 @@
         IMPL.updateDragShadow(v, shadowBuilder);
     }
 
+    /**
+     * Gets the ID of the next keyboard navigation cluster root.
+     *
+     * @return the next keyboard navigation cluster ID, or {@link View#NO_ID} if the framework
+     *         should decide automatically or API < 26.
+     */
+    public static int getNextClusterForwardId(@NonNull View view) {
+        return IMPL.getNextClusterForwardId(view);
+    }
+
+    /**
+     * Sets the ID of the next keyboard navigation cluster root view. Does nothing if {@code view}
+     * is not a keyboard navigation cluster or if API < 26.
+     *
+     * @param nextClusterForwardId next cluster ID, or {@link View#NO_ID} if the framework
+     *                             should decide automatically.
+     */
+    public static void setNextClusterForwardId(@NonNull View view, int nextClusterForwardId) {
+        IMPL.setNextClusterForwardId(view, nextClusterForwardId);
+    }
+
+    /**
+     * Returns whether {@code view} is a root of a keyboard navigation cluster. Always returns
+     * {@code false} on API < 26.
+     *
+     * @return {@code true} if this view is a root of a cluster, or {@code false} otherwise.
+     */
+    public static boolean isKeyboardNavigationCluster(@NonNull View view) {
+        return IMPL.isKeyboardNavigationCluster(view);
+    }
+
+    /**
+     * Set whether {@code view} is a root of a keyboard navigation cluster. Does nothing if
+     * API < 26.
+     *
+     * @param isCluster {@code true} to mark {@code view} as the root of a cluster, {@code false}
+     *                  to unmark.
+     */
+    public static void setKeyboardNavigationCluster(@NonNull View view, boolean isCluster) {
+        IMPL.setKeyboardNavigationCluster(view, isCluster);
+    }
+
+    /**
+     * Returns whether {@code view} should receive focus when the focus is restored for the view
+     * hierarchy containing it. Returns {@code false} on API < 26.
+     * <p>
+     * Focus gets restored for a view hierarchy when the root of the hierarchy gets added to a
+     * window or serves as a target of cluster navigation.
+     *
+     * @return {@code true} if {@code view} is the default-focus view, {@code false} otherwise.
+     */
+    public static boolean isFocusedByDefault(@NonNull View view) {
+        return IMPL.isFocusedByDefault(view);
+    }
+
+    /**
+     * Sets whether {@code view} should receive focus when the focus is restored for the view
+     * hierarchy containing it.
+     * <p>
+     * Focus gets restored for a view hierarchy when the root of the hierarchy gets added to a
+     * window or serves as a target of cluster navigation.
+     * <p>
+     * Does nothing on API < 26.
+     *
+     * @param isFocusedByDefault {@code true} to set {@code view} as the default-focus view,
+     *                           {@code false} otherwise.
+     */
+    public static void setFocusedByDefault(@NonNull View view, boolean isFocusedByDefault) {
+        IMPL.setFocusedByDefault(view, isFocusedByDefault);
+    }
+
+    /**
+     * Find the nearest keyboard navigation cluster in the specified direction.
+     * This does not actually give focus to that cluster.
+     *
+     * @param currentCluster The starting point of the search. {@code null} means the current
+     *                       cluster is not found yet.
+     * @param direction Direction to look.
+     *
+     * @return the nearest keyboard navigation cluster in the specified direction, or {@code null}
+     *         if one can't be found or if API < 26.
+     */
+    public static View keyboardNavigationClusterSearch(@NonNull View view, View currentCluster,
+            @FocusDirection int direction) {
+        return IMPL.keyboardNavigationClusterSearch(view, currentCluster, direction);
+    }
+
+    /**
+     * Adds any keyboard navigation cluster roots that are descendants of {@code view} (
+     * including {@code view} if it is a cluster root itself) to {@code views}. Does nothing
+     * on API < 26.
+     *
+     * @param views collection of keyboard navigation cluster roots found so far.
+     * @param direction direction to look.
+     */
+    public static void addKeyboardNavigationClusters(@NonNull View view,
+            @NonNull Collection<View> views, int direction) {
+        IMPL.addKeyboardNavigationClusters(view, views, direction);
+    }
+
+    /**
+     * Gives focus to the default-focus view in the view hierarchy rooted at {@code view}.
+     * If the default-focus view cannot be found or if API < 26, this falls back to calling
+     * {@link View#requestFocus(int)}.
+     *
+     * @return {@code true} if {@code view} or one of its descendants took focus, {@code false}
+     *         otherwise.
+     */
+    public static boolean restoreDefaultFocus(@NonNull View view) {
+        return IMPL.restoreDefaultFocus(view);
+    }
+
     protected ViewCompat() {}
 }
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
index b7581cf..112d809 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
@@ -18,185 +18,16 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
-import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
-import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerWrapper;
-import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerBridge;
-import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerWrapper;
 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.
+ * Helper for accessing features in {@link AccessibilityManager} in a backwards compatible fashion.
  */
 public final class AccessibilityManagerCompat {
-
-    interface AccessibilityManagerVersionImpl {
-        AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
-                AccessibilityStateChangeListener listener);
-        boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener listener);
-        boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener listener);
-        List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-                AccessibilityManager manager,int feedbackTypeFlags);
-        List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-                AccessibilityManager manager);
-        boolean isTouchExplorationEnabled(AccessibilityManager manager);
-        TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
-                TouchExplorationStateChangeListener listener);
-        boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener);
-        boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener);
-    }
-
-    static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
-        @Override
-        public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
-                AccessibilityStateChangeListener listener) {
-            return null;
-        }
-
-        @Override
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener listener) {
-            return false;
-        }
-
-        @Override
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener 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;
-        }
-
-        @Override
-        public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
-                TouchExplorationStateChangeListener listener) {
-            return null;
-        }
-
-        @Override
-        public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener) {
-            return false;
-        }
-
-        @Override
-        public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener) {
-            return false;
-        }
-    }
-
-    @RequiresApi(14)
-    static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
-        @Override
-        public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
-                final AccessibilityStateChangeListener listener) {
-            return new AccessibilityStateChangeListenerWrapper(listener,
-                    new AccessibilityStateChangeListenerBridge() {
-                        @Override
-                        public void onAccessibilityStateChanged(boolean enabled) {
-                            listener.onAccessibilityStateChanged(enabled);
-                        }
-                    });
-        }
-
-        @Override
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener listener) {
-            return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
-                    newAccessibilityStateChangeListener(listener));
-        }
-
-        @Override
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListener listener) {
-            return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
-                    newAccessibilityStateChangeListener(listener));
-        }
-
-        @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);
-        }
-    }
-
-    @RequiresApi(19)
-    static class AccessibilityManagerKitKatImpl extends AccessibilityManagerIcsImpl {
-        @Override
-        public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
-                final TouchExplorationStateChangeListener listener) {
-            return new TouchExplorationStateChangeListenerWrapper(listener,
-                    new TouchExplorationStateChangeListenerBridge() {
-                        @Override
-                        public void onTouchExplorationStateChanged(boolean enabled) {
-                            listener.onTouchExplorationStateChanged(enabled);
-                        }
-                    });
-        }
-
-        @Override
-        public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener) {
-            return AccessibilityManagerCompatKitKat.addTouchExplorationStateChangeListener(
-                    manager, newTouchExplorationStateChangeListener(listener));
-        }
-
-        @Override
-        public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
-                TouchExplorationStateChangeListener listener) {
-            return AccessibilityManagerCompatKitKat.removeTouchExplorationStateChangeListener(
-                    manager, newTouchExplorationStateChangeListener(listener));
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 19) { // KitKat
-            IMPL = new AccessibilityManagerKitKatImpl();
-        } else 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.
@@ -204,10 +35,18 @@
      * @param manager The accessibility manager.
      * @param listener The listener.
      * @return True if successfully registered.
+     *
+     * @deprecated Use {@link AccessibilityManager#addAccessibilityStateChangeListener(
+     *             AccessibilityManager.AccessibilityStateChangeListener)} directly.
      */
+    @Deprecated
     public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
             AccessibilityStateChangeListener listener) {
-        return IMPL.addAccessibilityStateChangeListener(manager, listener);
+        if (listener == null) {
+            return false;
+        }
+        return manager.addAccessibilityStateChangeListener(
+                new AccessibilityStateChangeListenerWrapper(listener));
     }
 
     /**
@@ -216,10 +55,51 @@
      * @param manager The accessibility manager.
      * @param listener The listener.
      * @return True if successfully unregistered.
+     *
+     * @deprecated Use {@link AccessibilityManager#removeAccessibilityStateChangeListener(
+     *             AccessibilityManager.AccessibilityStateChangeListener)} directly.
      */
+    @Deprecated
     public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
             AccessibilityStateChangeListener listener) {
-        return IMPL.removeAccessibilityStateChangeListener(manager, listener);
+        if (listener == null) {
+            return false;
+        }
+        return manager.removeAccessibilityStateChangeListener(
+                new AccessibilityStateChangeListenerWrapper(listener));
+    }
+
+    private static class AccessibilityStateChangeListenerWrapper
+            implements AccessibilityManager.AccessibilityStateChangeListener {
+        AccessibilityStateChangeListener mListener;
+
+        AccessibilityStateChangeListenerWrapper(
+                @NonNull AccessibilityStateChangeListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public int hashCode() {
+            return mListener.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            AccessibilityStateChangeListenerWrapper other =
+                    (AccessibilityStateChangeListenerWrapper) o;
+            return mListener.equals(other.mListener);
+        }
+
+        @Override
+        public void onAccessibilityStateChanged(boolean enabled) {
+            mListener.onAccessibilityStateChanged(enabled);
+        }
     }
 
     /**
@@ -227,10 +107,13 @@
      *
      * @param manager The accessibility manager.
      * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
+     *
+     * @deprecated Use {@link AccessibilityManager#getInstalledAccessibilityServiceList()} directly.
      */
+    @Deprecated
     public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
             AccessibilityManager manager) {
-        return IMPL.getInstalledAccessibilityServiceList(manager);
+        return manager.getInstalledAccessibilityServiceList();
     }
 
     /**
@@ -246,10 +129,14 @@
      * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
      * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
      * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
+     *
+     * @deprecated Use {@link AccessibilityManager#getEnabledAccessibilityServiceList(int)}
+     * directly.
      */
+    @Deprecated
     public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
             AccessibilityManager manager, int feedbackTypeFlags) {
-        return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
+        return manager.getEnabledAccessibilityServiceList(feedbackTypeFlags);
     }
 
     /**
@@ -257,9 +144,12 @@
      *
      * @param manager The accessibility manager.
      * @return True if touch exploration is enabled, false otherwise.
+     *
+     * @deprecated Use {@link AccessibilityManager#isTouchExplorationEnabled()} directly.
      */
+    @Deprecated
     public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
-        return IMPL.isTouchExplorationEnabled(manager);
+        return manager.isTouchExplorationEnabled();
     }
 
     /**
@@ -271,7 +161,15 @@
      */
     public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
             TouchExplorationStateChangeListener listener) {
-        return IMPL.addTouchExplorationStateChangeListener(manager, listener);
+        if (Build.VERSION.SDK_INT >= 19) {
+            if (listener == null) {
+                return false;
+            }
+            return manager.addTouchExplorationStateChangeListener(
+                    new TouchExplorationStateChangeListenerWrapper(listener));
+        } else {
+            return false;
+        }
     }
 
     /**
@@ -282,12 +180,56 @@
      */
     public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
             TouchExplorationStateChangeListener listener) {
-        return IMPL.removeTouchExplorationStateChangeListener(manager, listener);
+        if (Build.VERSION.SDK_INT >= 19) {
+            if (listener == null) {
+                return false;
+            }
+            return manager.removeTouchExplorationStateChangeListener(
+                    new TouchExplorationStateChangeListenerWrapper(listener));
+        } else {
+            return false;
+        }
+    }
+
+    @RequiresApi(19)
+    private static class TouchExplorationStateChangeListenerWrapper
+            implements AccessibilityManager.TouchExplorationStateChangeListener {
+        final TouchExplorationStateChangeListener mListener;
+
+        TouchExplorationStateChangeListenerWrapper(
+                @NonNull TouchExplorationStateChangeListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public int hashCode() {
+            return mListener.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            TouchExplorationStateChangeListenerWrapper other =
+                    (TouchExplorationStateChangeListenerWrapper) o;
+            return mListener.equals(other.mListener);
+        }
+
+        @Override
+        public void onTouchExplorationStateChanged(boolean enabled) {
+            mListener.onTouchExplorationStateChanged(enabled);
+        }
     }
 
     /**
      * Listener for the accessibility state.
-     * @deprecated Use {@link AccessibilityStateChangeListener} instead.
+     *
+     * @deprecated Use {@link AccessibilityManager.AccessibilityStateChangeListener} directly
+     * instead of this listener.
      */
     @Deprecated
     public static abstract class AccessibilityStateChangeListenerCompat
@@ -296,13 +238,20 @@
 
     /**
      * Listener for the accessibility state.
+     *
+     * @deprecated Use {@link AccessibilityManager.AccessibilityStateChangeListener} directly
+     * instead of this listener.
      */
+    @Deprecated
     public interface AccessibilityStateChangeListener {
         /**
          * Called back on change in the accessibility state.
          *
          * @param enabled Whether accessibility is enabled.
+         *
+         * @deprecated Use {@link AccessibilityManager.AccessibilityStateChangeListener} directly.
          */
+        @Deprecated
         void onAccessibilityStateChanged(boolean enabled);
     }
 
diff --git a/compat/java/android/support/v4/widget/ListPopupWindowCompat.java b/compat/java/android/support/v4/widget/ListPopupWindowCompat.java
index 9901f04..691d5b6 100644
--- a/compat/java/android/support/v4/widget/ListPopupWindowCompat.java
+++ b/compat/java/android/support/v4/widget/ListPopupWindowCompat.java
@@ -16,56 +16,15 @@
 
 package android.support.v4.widget;
 
-import android.support.annotation.RequiresApi;
 import android.os.Build;
 import android.view.View;
 import android.view.View.OnTouchListener;
+import android.widget.ListPopupWindow;
 
 /**
- * Helper for accessing features in ListPopupWindow introduced after API level 4
- * in a backwards compatible fashion.
+ * Helper for accessing features in {@link ListPopupWindow} in a backwards compatible fashion.
  */
 public final class ListPopupWindowCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface ListPopupWindowImpl {
-        public OnTouchListener createDragToOpenListener(Object listPopupWindow, View src);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything above v4 APIs.
-     */
-    static class BaseListPopupWindowImpl implements ListPopupWindowImpl {
-        @Override
-        public OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {
-            return null;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least KitKat APIs.
-     */
-    @RequiresApi(19)
-    static class KitKatListPopupWindowImpl extends BaseListPopupWindowImpl {
-        @Override
-        public OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {
-            return ListPopupWindowCompatKitKat.createDragToOpenListener(listPopupWindow, src);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final ListPopupWindowImpl IMPL;
-    static {
-        if (Build.VERSION.SDK_INT >= 19) {
-            IMPL = new KitKatListPopupWindowImpl();
-        } else {
-            IMPL = new BaseListPopupWindowImpl();
-        }
-    }
-
     private ListPopupWindowCompat() {
         // This class is not publicly instantiable.
     }
@@ -81,7 +40,7 @@
      * currently touched list item.
      * <p>
      * Example usage:
-     * 
+     *
      * <pre>
      * ListPopupWindow myPopup = new ListPopupWindow(context);
      * myPopup.setAnchor(myAnchor);
@@ -92,10 +51,49 @@
      * @param listPopupWindow the ListPopupWindow against which to invoke the
      *            method
      * @param src the view on which the resulting listener will be set
-     * @return a touch listener that controls drag-to-open behavior, or null on
+     * @return a touch listener that controls drag-to-open behavior, or {@code null} on
+     *         unsupported APIs
+     *
+     * @deprecated Use {@link #createDragToOpenListener(ListPopupWindow, View)} that takes in
+     * {@link ListPopupWindow} instead of {@link Object}.
+     */
+    @Deprecated
+    public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {
+        return ListPopupWindowCompat.createDragToOpenListener(
+                (ListPopupWindow) listPopupWindow, src);
+    }
+
+    /**
+     * On API {@link android.os.Build.VERSION_CODES#KITKAT} and higher, returns
+     * an {@link OnTouchListener} that can be added to the source view to
+     * implement drag-to-open behavior. Generally, the source view should be the
+     * same view that was passed to ListPopupWindow.setAnchorView(View).
+     * <p>
+     * When the listener is set on a view, touching that view and dragging
+     * outside of its bounds will open the popup window. Lifting will select the
+     * currently touched list item.
+     * <p>
+     * Example usage:
+     *
+     * <pre>
+     * ListPopupWindow myPopup = new ListPopupWindow(context);
+     * myPopup.setAnchor(myAnchor);
+     * OnTouchListener dragListener = myPopup.createDragToOpenListener(myAnchor);
+     * myAnchor.setOnTouchListener(dragListener);
+     * </pre>
+     *
+     * @param listPopupWindow the ListPopupWindow against which to invoke the
+     *            method
+     * @param src the view on which the resulting listener will be set
+     * @return a touch listener that controls drag-to-open behavior, or {@code null} on
      *         unsupported APIs
      */
-    public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {
-        return IMPL.createDragToOpenListener(listPopupWindow, src);
+    public static OnTouchListener createDragToOpenListener(
+            ListPopupWindow listPopupWindow, View src) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            return listPopupWindow.createDragToOpenListener(src);
+        } else {
+            return null;
+        }
     }
 }
diff --git a/compat/java/android/support/v4/widget/PopupMenuCompat.java b/compat/java/android/support/v4/widget/PopupMenuCompat.java
index 2de7cc8..d8b65b5 100644
--- a/compat/java/android/support/v4/widget/PopupMenuCompat.java
+++ b/compat/java/android/support/v4/widget/PopupMenuCompat.java
@@ -16,55 +16,14 @@
 
 package android.support.v4.widget;
 
-import android.support.annotation.RequiresApi;
 import android.os.Build;
 import android.view.View.OnTouchListener;
+import android.widget.PopupMenu;
 
 /**
- * Helper for accessing features in PopupMenu introduced after API level 4 in a
- * backwards compatible fashion.
+ * Helper for accessing features in {@link PopupMenu} in a backwards compatible fashion.
  */
 public final class PopupMenuCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface PopupMenuImpl {
-        public OnTouchListener getDragToOpenListener(Object popupMenu);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything above v4 APIs.
-     */
-    static class BasePopupMenuImpl implements PopupMenuImpl {
-        @Override
-        public OnTouchListener getDragToOpenListener(Object popupMenu) {
-            return null;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least KitKat APIs.
-     */
-    @RequiresApi(19)
-    static class KitKatPopupMenuImpl extends BasePopupMenuImpl {
-        @Override
-        public OnTouchListener getDragToOpenListener(Object popupMenu) {
-            return PopupMenuCompatKitKat.getDragToOpenListener(popupMenu);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final PopupMenuImpl IMPL;
-    static {
-        if (Build.VERSION.SDK_INT >= 19) {
-            IMPL = new KitKatPopupMenuImpl();
-        } else {
-            IMPL = new BasePopupMenuImpl();
-        }
-    }
-
     private PopupMenuCompat() {
         // This class is not publicly instantiable.
     }
@@ -85,10 +44,14 @@
      * </pre>
      *
      * @param popupMenu the PopupMenu against which to invoke the method
-     * @return a touch listener that controls drag-to-open behavior, or null on
+     * @return a touch listener that controls drag-to-open behavior, or {@code null} on
      *         unsupported APIs
      */
     public static OnTouchListener getDragToOpenListener(Object popupMenu) {
-        return IMPL.getDragToOpenListener(popupMenu);
+        if (Build.VERSION.SDK_INT >= 19) {
+            return ((PopupMenu) popupMenu).getDragToOpenListener();
+        } else {
+            return null;
+        }
     }
 }
diff --git a/compat/java/android/support/v4/widget/TextViewCompat.java b/compat/java/android/support/v4/widget/TextViewCompat.java
index 6529903..b163c73 100644
--- a/compat/java/android/support/v4/widget/TextViewCompat.java
+++ b/compat/java/android/support/v4/widget/TextViewCompat.java
@@ -337,6 +337,7 @@
             textView.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
         }
 
+        @Override
         public int getAutoSizeTextType(TextView textView) {
             return textView.getAutoSizeTextType();
         }
diff --git a/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java b/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
index d302175..feee689 100644
--- a/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
+++ b/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
@@ -16,7 +16,6 @@
 
 package android.support.v4.app;
 
-import android.annotation.SuppressLint;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -348,14 +347,13 @@
         }
     }
 
-    @SuppressLint("NewApi") // Intentionally looking up Notification.Action using reflection.
     private static boolean ensureActionReflectionReadyLocked() {
         if (sActionsAccessFailed) {
             return false;
         }
         try {
             if (sActionsField == null) {
-                sActionClass = Class.forName(Notification.Action.class.getName());
+                sActionClass = Class.forName("android.app.Notification$Action");
                 sActionIconField = sActionClass.getDeclaredField("icon");
                 sActionTitleField = sActionClass.getDeclaredField("title");
                 sActionIntentField = sActionClass.getDeclaredField("actionIntent");
diff --git a/compat/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java b/compat/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java
deleted file mode 100644
index 098c581..0000000
--- a/compat/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java
+++ /dev/null
@@ -1,27 +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.ActivityManager;
-import android.support.annotation.RequiresApi;
-
-@RequiresApi(19)
-class ActivityManagerCompatKitKat {
-    public static boolean isLowRamDevice(ActivityManager am) {
-        return am.isLowRamDevice();
-    }
-}
diff --git a/compat/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java b/compat/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java
deleted file mode 100644
index c31acf6..0000000
--- a/compat/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java
+++ /dev/null
@@ -1,29 +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.os;
-
-import android.os.Environment;
-import android.support.annotation.RequiresApi;
-
-import java.io.File;
-
-@RequiresApi(19)
-class EnvironmentCompatKitKat {
-    public static String getStorageState(File path) {
-        return Environment.getStorageState(path);
-    }
-}
diff --git a/compat/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java b/compat/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java
deleted file mode 100644
index 36ede1b..0000000
--- a/compat/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.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.support.annotation.RequiresApi;
-import android.view.ScaleGestureDetector;
-
-/**
- * Implementation of ScaleGestureDetector compatibility that can call KitKat APIs. This class is an
- * implementation detail for ScaleGestureDetectorCompat and should not be used directly.
- */
-
-@RequiresApi(19)
-class ScaleGestureDetectorCompatKitKat {
-
-    private ScaleGestureDetectorCompatKitKat() {
-    }
-
-    public static void setQuickScaleEnabled(Object scaleGestureDetector, boolean enabled) {
-        ((ScaleGestureDetector) scaleGestureDetector).setQuickScaleEnabled(enabled);
-    }
-
-    public static boolean isQuickScaleEnabled(Object scaleGestureDetector) {
-        return ((ScaleGestureDetector) scaleGestureDetector).isQuickScaleEnabled();
-    }
-}
diff --git a/compat/kitkat/android/support/v4/view/accessibility/AccessibilityManagerCompatKitKat.java b/compat/kitkat/android/support/v4/view/accessibility/AccessibilityManagerCompatKitKat.java
deleted file mode 100644
index b8d742c..0000000
--- a/compat/kitkat/android/support/v4/view/accessibility/AccessibilityManagerCompatKitKat.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.view.accessibility;
-
-import android.support.annotation.RequiresApi;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
-
-/**
- * KitKat-specific AccessibilityManager API implementation.
- */
-
-@RequiresApi(19)
-class AccessibilityManagerCompatKitKat {
-
-    public static class TouchExplorationStateChangeListenerWrapper
-            implements TouchExplorationStateChangeListener {
-        final Object mListener;
-        final TouchExplorationStateChangeListenerBridge mListenerBridge;
-
-        public TouchExplorationStateChangeListenerWrapper(Object listener,
-                TouchExplorationStateChangeListenerBridge listenerBridge) {
-            mListener = listener;
-            mListenerBridge = listenerBridge;
-        }
-
-        @Override
-        public int hashCode() {
-            return mListener == null ? 0 : mListener.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-            TouchExplorationStateChangeListenerWrapper other =
-                    (TouchExplorationStateChangeListenerWrapper) o;
-            return mListener == null ? other.mListener == null : mListener.equals(other.mListener);
-        }
-
-        @Override
-        public void onTouchExplorationStateChanged(boolean enabled) {
-            mListenerBridge.onTouchExplorationStateChanged(enabled);
-        }
-    }
-
-    interface TouchExplorationStateChangeListenerBridge {
-        void onTouchExplorationStateChanged(boolean enabled);
-    }
-
-    public static Object newTouchExplorationStateChangeListener(
-            final TouchExplorationStateChangeListenerBridge bridge) {
-        return new TouchExplorationStateChangeListener() {
-            @Override
-            public void onTouchExplorationStateChanged(boolean enabled) {
-                bridge.onTouchExplorationStateChanged(enabled);
-            }
-        };
-    }
-
-    public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
-            Object listener) {
-        return manager.addTouchExplorationStateChangeListener(
-                (TouchExplorationStateChangeListener) listener);
-    }
-
-    public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
-            Object listener) {
-        return manager.removeTouchExplorationStateChangeListener(
-                (TouchExplorationStateChangeListener) listener);
-    }
-}
diff --git a/compat/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java b/compat/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java
deleted file mode 100644
index 1e11ea3..0000000
--- a/compat/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java
+++ /dev/null
@@ -1,33 +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.annotation.RequiresApi;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.widget.ListPopupWindow;
-
-/**
- * Implementation of ListPopupWindow compatibility that can call KitKat APIs.
- */
-
-@RequiresApi(19)
-class ListPopupWindowCompatKitKat {
-    public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {
-        return ((ListPopupWindow) listPopupWindow).createDragToOpenListener(src);
-    }
-}
diff --git a/compat/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java b/compat/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java
deleted file mode 100644
index ed2b78c..0000000
--- a/compat/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java
+++ /dev/null
@@ -1,32 +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.annotation.RequiresApi;
-import android.view.View.OnTouchListener;
-import android.widget.PopupMenu;
-
-/**
- * Implementation of PopupMenu compatibility that can call KitKat APIs.
- */
-
-@RequiresApi(19)
-class PopupMenuCompatKitKat {
-    public static OnTouchListener getDragToOpenListener(Object popupMenu) {
-        return ((PopupMenu) popupMenu).getDragToOpenListener();
-    }
-}
diff --git a/compat/tests/assets/samplefont.ttf b/compat/tests/assets/samplefont.ttf
new file mode 100644
index 0000000..49f1c62
--- /dev/null
+++ b/compat/tests/assets/samplefont.ttf
Binary files differ
diff --git a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
index 7455ddd..1ad6584 100644
--- a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
+++ b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
@@ -57,6 +57,46 @@
     }
 
     @Test
+    public void testBadgeIcon() throws Throwable {
+        int badgeIcon = NotificationCompat.BADGE_ICON_SMALL;
+        Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                .setBadgeIconType(badgeIcon)
+                .build();
+        if (BuildCompat.isAtLeastO()) {
+            assertEquals(badgeIcon, NotificationCompat.getBadgeIconType(n));
+        } else {
+            assertEquals(NotificationCompat.BADGE_ICON_NONE,
+                    NotificationCompat.getBadgeIconType(n));
+        }
+    }
+
+    @Test
+    public void testTimeout() throws Throwable {
+        long timeout = 23552;
+        Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                .setTimeout(timeout)
+                .build();
+        if (BuildCompat.isAtLeastO()) {
+            assertEquals(timeout, NotificationCompat.getTimeout(n));
+        } else {
+            assertEquals(0, NotificationCompat.getTimeout(n));
+        }
+    }
+
+    @Test
+    public void testShortcutId() throws Throwable {
+        String shortcutId = "fgdfg";
+        Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                .setShortcutId(shortcutId)
+                .build();
+        if (BuildCompat.isAtLeastO()) {
+            assertEquals(shortcutId, NotificationCompat.getShortcutId(n));
+        } else {
+            assertEquals(null, NotificationCompat.getShortcutId(n));
+        }
+    }
+
+    @Test
     public void testNotificationChannel() throws Throwable {
         String channelId = "new ID";
         Notification n  = new NotificationCompat.Builder(mActivityTestRule.getActivity())
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
new file mode 100644
index 0000000..687902f
--- /dev/null
+++ b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static android.content.res.AssetManager.ACCESS_BUFFER;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.graphics.Typeface;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.app.TestSupportActivity;
+import android.support.v4.graphics.TypefaceCompat.FontRequestCallback;
+import android.support.v4.graphics.fonts.FontRequest;
+import android.support.v4.graphics.fonts.FontResult;
+import android.support.v4.provider.FontsContract;
+import android.util.Base64;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests for {@link TypefaceCompatBaseImpl}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TypefaceCompatTest extends BaseInstrumentationTestCase<TestSupportActivity> {
+    private static final String TEST_FONT_FILE = "samplefont.ttf";
+    private static final String PROVIDER = "com.test.fontprovider.authority";
+    private static final String QUERY_CACHED = "query_cached";
+    private static final String QUERY = "query";
+    private static final String PACKAGE = "com.test.fontprovider.package";
+    private static final byte[] BYTE_ARRAY =
+            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
+    private static final List<List<byte[]>> CERTS = Arrays.asList(Arrays.asList(BYTE_ARRAY));
+
+    private TypefaceCompatBaseImpl mCompat;
+    private boolean mIsPreN;
+
+    public TypefaceCompatTest() {
+        super(TestSupportActivity.class);
+    }
+
+    @Before
+    public void setup() {
+        mIsPreN = Build.VERSION.SDK_INT < Build.VERSION_CODES.N;
+        mCompat = mIsPreN ? new TypefaceCompatBaseImpl(mActivityTestRule.getActivity())
+                : new TypefaceCompatApi24Impl(mActivityTestRule.getActivity());
+        TypefaceCompatBaseImpl.putInCache(PROVIDER, QUERY_CACHED, Typeface.MONOSPACE);
+    }
+
+    @Test
+    public void testReceiveResult_cachedResult() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY_CACHED, CERTS),
+                callback, 0, null);
+
+        verify(callback).onTypefaceRetrieved(Typeface.MONOSPACE);
+    }
+
+    @Test
+    public void testReceiveResult_resultCodeProviderNotFound() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS), callback,
+                FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
+
+        verify(callback).onTypefaceRequestFailed(
+                FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND);
+    }
+
+    @Test
+    public void testReceiveResult_resultCodeFontNotFound() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS), callback,
+                FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+
+        verify(callback).onTypefaceRequestFailed(
+                FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+    }
+
+    @Test
+    public void testReceiveResult_nullBundle() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS), callback,
+                FontsContract.Columns.RESULT_CODE_OK, null);
+
+        verify(callback).onTypefaceRequestFailed(
+                FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+    }
+
+    @Test
+    public void testReceiveResult_nullResult() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS), callback,
+                FontsContract.Columns.RESULT_CODE_OK, new Bundle());
+
+        verify(callback).onTypefaceRequestFailed(
+                FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+    }
+
+    @Test
+    public void testReceiveResult_emptyResult() {
+        FontRequestCallback callback = mock(FontRequestCallback.class);
+        Bundle bundle = new Bundle();
+        bundle.putParcelableArrayList(
+                FontsContract.PARCEL_FONT_RESULTS, new ArrayList<FontResult>());
+
+        mCompat.receiveResult(new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS), callback,
+                FontsContract.Columns.RESULT_CODE_OK, bundle);
+
+        verify(callback).onTypefaceRequestFailed(
+                FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+    }
+
+    @Test
+    public void testTypefaceRequestFailureConstantsAreInSync() {
+        // Error codes from the provider are positive numbers and are in sync
+        assertEquals(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND,
+                TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
+        assertEquals(FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE,
+                TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE);
+        assertEquals(FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY,
+                TypefaceCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY);
+
+        // Internal errors are negative
+        assertTrue(0 > TypefaceCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND);
+        assertTrue(0 > TypefaceCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES);
+        assertTrue(0 > TypefaceCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
+    }
+
+    private File loadFont() {
+        File cacheFile = new File(mActivityTestRule.getActivity().getCacheDir(), TEST_FONT_FILE);
+        try {
+            copyToCacheFile(TEST_FONT_FILE, cacheFile);
+            return cacheFile;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private void copyToCacheFile(final String assetPath, final File cacheFile)
+            throws IOException {
+        InputStream is = null;
+        FileOutputStream fos = null;
+        try {
+            is = mActivityTestRule.getActivity().getAssets().open(assetPath, ACCESS_BUFFER);
+            fos = new FileOutputStream(cacheFile, false);
+            byte[] buffer = new byte[1024];
+            int readLen;
+            while ((readLen = is.read(buffer)) != -1) {
+                fos.write(buffer, 0, readLen);
+            }
+        } finally {
+            if (is != null) {
+                is.close();
+            }
+            if (fos != null) {
+                fos.close();
+            }
+        }
+    }
+
+    @Test
+    public void testCreateTypeface() throws IOException, InterruptedException {
+        File file = loadFont();
+        ParcelFileDescriptor pfd =
+                ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+        try {
+            FontResult result = new FontResult(pfd, 0, null, 400, false /* italic */);
+            Typeface typeface = mCompat.createTypeface(Arrays.asList(result));
+
+            assertNotNull(typeface);
+        } finally {
+            if (file != null) {
+                file.delete();
+            }
+            if (pfd != null) {
+                pfd.close();
+            }
+        }
+    }
+}
diff --git a/compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java b/compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java
new file mode 100644
index 0000000..ddf56ed
--- /dev/null
+++ b/compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.compat.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.BuildCompat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IconCompatTest {
+
+    private void verifyClippedCircle(Bitmap bitmap, int fillColor, int size) {
+        assertEquals(size, bitmap.getHeight());
+        assertEquals(bitmap.getWidth(), bitmap.getHeight());
+        assertEquals(fillColor, bitmap.getPixel(size / 2, size / 2));
+
+        assertEquals(Color.TRANSPARENT, bitmap.getPixel(0, 0));
+        assertEquals(Color.TRANSPARENT, bitmap.getPixel(0, size - 1));
+        assertEquals(Color.TRANSPARENT, bitmap.getPixel(size - 1, 0));
+        assertEquals(Color.TRANSPARENT, bitmap.getPixel(size - 1, size - 1));
+    }
+
+    @Test
+    public void testClipAdaptiveIcon() throws Throwable {
+        Bitmap source = Bitmap.createBitmap(200, 150, Bitmap.Config.ARGB_8888);
+        source.eraseColor(Color.RED);
+        Bitmap result = IconCompat.createLegacyIconFromAdaptiveIcon(source);
+        verifyClippedCircle(result, Color.RED, 100);
+    }
+
+    @Test
+    public void testCreateWithBitmap_legacy() {
+        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        bitmap.eraseColor(Color.RED);
+        Intent intent = new Intent();
+        IconCompat.createWithBitmap(bitmap).addToShortcutIntent(intent);
+        assertEquals(bitmap, intent.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON));
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
+    @TargetApi(Build.VERSION_CODES.M)
+    public void testCreateWithBitmap() {
+        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        bitmap.eraseColor(Color.RED);
+        IconCompat compat = IconCompat.createWithBitmap(bitmap);
+        Drawable d = compat.toIcon().loadDrawable(InstrumentationRegistry.getContext());
+        assertTrue(d instanceof BitmapDrawable);
+        assertEquals(bitmap, ((BitmapDrawable) d).getBitmap());
+    }
+
+    @Test
+    public void testCreateWithAdaptiveBitmap_legacy() {
+        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        bitmap.eraseColor(Color.GREEN);
+        Intent intent = new Intent();
+        IconCompat.createWithAdaptiveBitmap(bitmap).addToShortcutIntent(intent);
+
+        Bitmap clipped = intent.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
+        verifyClippedCircle(clipped, Color.GREEN, clipped.getWidth());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
+    @TargetApi(Build.VERSION_CODES.O)
+    public void testCreateWithAdaptiveBitmap() {
+        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        bitmap.eraseColor(Color.GREEN);
+        IconCompat compat = IconCompat.createWithAdaptiveBitmap(bitmap);
+        Drawable d = compat.toIcon().loadDrawable(InstrumentationRegistry.getContext());
+        if (BuildCompat.isAtLeastO()) {
+            assertTrue(d instanceof AdaptiveIconDrawable);
+        } else {
+            assertTrue(d instanceof BitmapDrawable);
+            Bitmap clipped = ((BitmapDrawable) d).getBitmap();
+            verifyClippedCircle(clipped, Color.GREEN, clipped.getWidth());
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
+    @TargetApi(Build.VERSION_CODES.M)
+    public void testCreateWithData() {
+        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        bitmap.eraseColor(Color.YELLOW);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+        byte[] bytes = out.toByteArray();
+
+        byte[] resultCopy = Arrays.copyOf(bytes, bytes.length + 100);
+        // Shift all elements by 20
+        for (int i = bytes.length - 1; i >= 0; i--) {
+            resultCopy[i + 20] = resultCopy[i];
+        }
+
+        IconCompat compat = IconCompat.createWithData(resultCopy, 20, bytes.length);
+        Drawable d = compat.toIcon().loadDrawable(InstrumentationRegistry.getContext());
+        assertTrue(d instanceof BitmapDrawable);
+        assertTrue(bitmap.sameAs(((BitmapDrawable) d).getBitmap()));
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
+    @TargetApi(Build.VERSION_CODES.M)
+    public void testCreateWithResource() {
+        Context context = InstrumentationRegistry.getContext();
+        Drawable original = context.getDrawable(R.drawable.test_drawable_red);
+
+        IconCompat compat = IconCompat.createWithResource(context, R.drawable.test_drawable_red);
+        Drawable d = compat.toIcon().loadDrawable(InstrumentationRegistry.getContext());
+
+        // Drawables are same classes
+        assertEquals(original.getClass(), d.getClass());
+
+        Bitmap orgBitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        original.setBounds(0, 0, 200, 200);
+        original.draw(new Canvas(orgBitmap));
+
+        Bitmap compatBitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
+        d.setBounds(0, 0, 200, 200);
+        d.draw(new Canvas(compatBitmap));
+
+        // Drawables behave the same
+        assertTrue(orgBitmap.sameAs(compatBitmap));
+    }
+}
diff --git a/compat/tests/java/android/support/v4/graphics/fonts/FontRequestTest.java b/compat/tests/java/android/support/v4/graphics/fonts/FontRequestTest.java
new file mode 100644
index 0000000..1e84ab7
--- /dev/null
+++ b/compat/tests/java/android/support/v4/graphics/fonts/FontRequestTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.fonts;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Base64;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests for {@link FontRequest}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class FontRequestTest {
+    private static final String PROVIDER = "com.test.fontprovider.authority";
+    private static final String QUERY = "query";
+    private static final String PACKAGE = "com.test.fontprovider.package";
+    private static final byte[] BYTE_ARRAY =
+            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
+    private static final List<List<byte[]>> CERTS = Arrays.asList(Arrays.asList(BYTE_ARRAY));
+
+    @Test
+    public void testWriteToParcel() {
+        // GIVEN a FontRequest
+        FontRequest request = new FontRequest(PROVIDER, PACKAGE, QUERY, CERTS);
+
+        // WHEN we write it to a Parcel
+        Parcel dest = Parcel.obtain();
+        request.writeToParcel(dest, 0);
+        dest.setDataPosition(0);
+
+        // THEN we create from that parcel and get the same values.
+        FontRequest result = FontRequest.CREATOR.createFromParcel(dest);
+        assertEquals(PROVIDER, result.getProviderAuthority());
+        assertEquals(PACKAGE, result.getProviderPackage());
+        assertEquals(QUERY, result.getQuery());
+        assertEquals(CERTS.size(), result.getCertificates().size());
+        List<byte[]> cert = CERTS.get(0);
+        List<byte[]> resultCert = result.getCertificates().get(0);
+        assertEquals(cert.size(), resultCert.size());
+        assertTrue(Arrays.equals(cert.get(0), resultCert.get(0)));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testConstructor_nullAuthority() {
+        new FontRequest(null, PACKAGE, QUERY, CERTS);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testConstructor_nullPackage() {
+        new FontRequest(PROVIDER, null, QUERY, CERTS);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testConstructor_nullQuery() {
+        new FontRequest(PROVIDER, PACKAGE, null, CERTS);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testConstructor_nullCerts() {
+        new FontRequest(PROVIDER, PACKAGE, QUERY, null);
+    }
+}
diff --git a/compat/tests/java/android/support/v4/graphics/fonts/FontResultTest.java b/compat/tests/java/android/support/v4/graphics/fonts/FontResultTest.java
new file mode 100644
index 0000000..1259534
--- /dev/null
+++ b/compat/tests/java/android/support/v4/graphics/fonts/FontResultTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.fonts;
+
+import static android.content.res.AssetManager.ACCESS_BUFFER;
+import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.TestSupportActivity;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Tests for {@link FontResult}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class FontResultTest {
+    private static final int TTC_INDEX = 3;
+    private static final String FONT_VARIATION_SETTINGS = "my_settings";
+    private static final int BOLD_WEIGHT = 700;
+    private static final String TEST_FONT_FILE = "samplefont.ttf";
+    private Resources mResources;
+    private Activity mActivity;
+    private ParcelFileDescriptor mParcelFileDescriptor;
+
+    @Rule
+    public ActivityTestRule<TestSupportActivity> mActivityRule =
+            new ActivityTestRule<>(TestSupportActivity.class);
+
+    @Before
+    public void setup() throws Throwable {
+        mActivity = mActivityRule.getActivity();
+        mResources = mActivity.getResources();
+        mParcelFileDescriptor = loadFont();
+    }
+
+    @Test
+    public void testWriteToParcel() throws IOException {
+        // GIVEN a FontResult
+        FontResult fontResult = new FontResult(mParcelFileDescriptor, TTC_INDEX,
+                FONT_VARIATION_SETTINGS, BOLD_WEIGHT, true /* italic */);
+
+        // WHEN we write it to a Parcel
+        Parcel dest = Parcel.obtain();
+        fontResult.writeToParcel(dest, 0);
+        dest.setDataPosition(0);
+
+        // THEN we create from that parcel and get the same values.
+        FontResult result = FontResult.CREATOR.createFromParcel(dest);
+        assertNotNull(result.getFileDescriptor());
+        assertEquals(TTC_INDEX, result.getTtcIndex());
+        assertEquals(FONT_VARIATION_SETTINGS, result.getFontVariationSettings());
+        assertEquals(BOLD_WEIGHT, result.getWeight());
+        assertTrue(result.getItalic());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testConstructorWithNullFileDescriptor() {
+        new FontResult(null, TTC_INDEX, FONT_VARIATION_SETTINGS, BOLD_WEIGHT, false /* italic */);
+    }
+
+    @Test
+    public void testConstructorWithNullFontVariationSettings() {
+        // WHEN we create a result with a null fontVariationSettings
+        FontResult fontResult = new FontResult(mParcelFileDescriptor, TTC_INDEX, null, BOLD_WEIGHT,
+                false /* italic */);
+
+        // THEN we expect no exception to be raised, and null to be stored as the value.
+        assertNull(fontResult.getFontVariationSettings());
+    }
+
+    private ParcelFileDescriptor loadFont() {
+        File cacheFile = null;
+        try {
+            cacheFile = new File(mActivity.getCacheDir(), TEST_FONT_FILE);
+            cacheFile.getParentFile().mkdirs();
+            copyToCacheFile("samplefont.ttf", cacheFile);
+            return ParcelFileDescriptor.open(cacheFile, MODE_READ_ONLY);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (cacheFile != null) {
+                cacheFile.delete();
+            }
+        }
+        return null;
+    }
+
+    private void copyToCacheFile(final String assetPath, final File cacheFile)
+            throws IOException {
+        InputStream is = null;
+        FileOutputStream fos = null;
+        try {
+            is = mResources.getAssets().open(assetPath, ACCESS_BUFFER);
+            fos = new FileOutputStream(cacheFile, false);
+            byte[] buffer = new byte[1024];
+            int readLen;
+            while ((readLen = is.read(buffer)) != -1) {
+                fos.write(buffer, 0, readLen);
+            }
+        } finally {
+            if (is != null) {
+                is.close();
+            }
+            if (fos != null) {
+                fos.close();
+            }
+        }
+    }
+}
diff --git a/compat/tests/java/android/support/v4/provider/FontsContractTest.java b/compat/tests/java/android/support/v4/provider/FontsContractTest.java
new file mode 100644
index 0000000..2a84d0f
--- /dev/null
+++ b/compat/tests/java/android/support/v4/provider/FontsContractTest.java
@@ -0,0 +1,339 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.provider;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.Signature;
+import android.database.MatrixCursor;
+import android.os.Bundle;
+import android.support.test.filters.SmallTest;
+import android.support.v4.graphics.fonts.FontRequest;
+import android.support.v4.graphics.fonts.FontResult;
+import android.support.v4.os.ResultReceiver;
+import android.test.ProviderTestCase2;
+import android.util.Base64;
+
+import org.mockito.ArgumentCaptor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests for {@link FontsContract}.
+ */
+
+@SmallTest
+public class FontsContractTest extends ProviderTestCase2<TestFontsProvider> {
+    private static final byte[] BYTE_ARRAY =
+            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
+    // Use a different instance to test byte array comparison
+    private static final byte[] BYTE_ARRAY_COPY =
+            Base64.decode("e04fd020ea3a6910a2d808002b30", Base64.DEFAULT);
+    private static final byte[] BYTE_ARRAY_2 =
+            Base64.decode("e04fd020ea3a6910a2d808002b32", Base64.DEFAULT);
+    private static final String PACKAGE_NAME = "com.my.font.provider.package";
+
+    private final FontRequest mRequest = new FontRequest(TestFontsProvider.AUTHORITY, PACKAGE_NAME,
+            "query", Arrays.asList(Arrays.asList(BYTE_ARRAY)));
+    private TestFontsProvider mProvider;
+    private FontsContract mContract;
+    private ResultReceiver mResultReceiver;
+    private PackageManager mPackageManager;
+
+    public FontsContractTest() {
+        super(TestFontsProvider.class, TestFontsProvider.AUTHORITY);
+    }
+
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mProvider = getProvider();
+        mPackageManager = mock(PackageManager.class);
+        mContract = new FontsContract(getMockContext(), mPackageManager);
+        mResultReceiver = mock(ResultReceiver.class);
+    }
+
+    public void testGetFontFromProvider_resultOK() {
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+        verify(mResultReceiver).send(eq(
+                FontsContract.Columns.RESULT_CODE_OK), bundleCaptor.capture());
+
+        Bundle bundle = bundleCaptor.getValue();
+        assertNotNull(bundle);
+        List<FontResult> resultList =
+                bundle.getParcelableArrayList(FontsContract.PARCEL_FONT_RESULTS);
+        assertNotNull(resultList);
+        assertEquals(1, resultList.size());
+        FontResult fontResult = resultList.get(0);
+        assertEquals(TestFontsProvider.TTC_INDEX, fontResult.getTtcIndex());
+        assertEquals(TestFontsProvider.VARIATION_SETTINGS, fontResult.getFontVariationSettings());
+        assertEquals(TestFontsProvider.NORMAL_WEIGHT, fontResult.getWeight());
+        assertEquals(TestFontsProvider.ITALIC, fontResult.getItalic());
+        assertNotNull(fontResult.getFileDescriptor());
+    }
+
+    public void testGetFontFromProvider_providerDoesntReturnAllFields() {
+        mProvider.setReturnAllFields(false);
+
+        final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+        verify(mResultReceiver).send(eq(
+                FontsContract.Columns.RESULT_CODE_OK), bundleCaptor.capture());
+
+        Bundle bundle = bundleCaptor.getValue();
+        assertNotNull(bundle);
+        List<FontResult> resultList =
+                bundle.getParcelableArrayList(FontsContract.PARCEL_FONT_RESULTS);
+        assertNotNull(resultList);
+        assertEquals(1, resultList.size());
+        FontResult fontResult = resultList.get(0);
+        assertEquals(0, fontResult.getTtcIndex());
+        assertNull(fontResult.getFontVariationSettings());
+        assertEquals(400, fontResult.getWeight());
+        assertFalse(fontResult.getItalic());
+        assertNotNull(fontResult.getFileDescriptor());
+    }
+
+    public void testGetFontFromProvider_resultFontNotFound() {
+        // Make the provider return unknown
+        mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+    }
+
+    public void testGetFontFromProvider_resultFontUnavailable() {
+        // Make the provider return font unavailable
+        mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE, null);
+    }
+
+    public void testGetFontFromProvider_resultMalformedQuery() {
+        // Make the provider return font unavailable
+        mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY, null);
+    }
+
+    public void testGetFontFromProvider_resultFontNotFoundSecondRow() {
+        MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+                FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+                FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
+                FontsContract.Columns.RESULT_CODE });
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0, FontsContract.Columns.RESULT_CODE_OK});
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0,
+                FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND});
+        mProvider.setCustomCursor(cursor);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+    }
+
+    public void testGetFontFromProvider_resultFontNotFoundOtherRow() {
+        MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+                FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+                FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
+                FontsContract.Columns.RESULT_CODE });
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0, FontsContract.Columns.RESULT_CODE_OK});
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0,
+                FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND});
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0, FontsContract.Columns.RESULT_CODE_OK});
+        mProvider.setCustomCursor(cursor);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+    }
+
+    public void testGetFontFromProvider_resultCodeIsNegativeNumber() {
+        MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+                FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+                FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
+                FontsContract.Columns.RESULT_CODE });
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0, FontsContract.Columns.RESULT_CODE_OK});
+        cursor.addRow(new Object[] { 1, 0, null, 400, 0, -5});
+        mProvider.setCustomCursor(cursor);
+        mContract.getFontFromProvider(mRequest, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+        verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+    }
+
+    public void testGetProvider_providerNotFound() {
+        when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(null);
+
+        ProviderInfo result = mContract.getProvider(mRequest, mResultReceiver);
+
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
+        assertNull(result);
+    }
+
+    public void testGetProvider_noCertSets()
+            throws PackageManager.NameNotFoundException {
+        setupPackageManager();
+
+        FontRequest request = new FontRequest(TestFontsProvider.AUTHORITY, PACKAGE_NAME,
+                "query", new ArrayList<List<byte[]>>());
+        ProviderInfo result = mContract.getProvider(request, mResultReceiver);
+
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
+        assertNull(result);
+    }
+
+    public void testGetProvider_noCerts()
+            throws PackageManager.NameNotFoundException {
+        setupPackageManager();
+
+        FontRequest request = new FontRequest(TestFontsProvider.AUTHORITY, PACKAGE_NAME,
+                "query", Arrays.<List<byte[]>>asList(new ArrayList<byte[]>()));
+        ProviderInfo result = mContract.getProvider(request, mResultReceiver);
+
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
+        assertNull(result);
+    }
+
+    public void testGetProvider_wrongCerts()
+            throws PackageManager.NameNotFoundException {
+        setupPackageManager();
+
+        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
+        List<byte[]> certList = Arrays.asList(wrongCert);
+        FontRequest requestWrongCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+        ProviderInfo result = mContract.getProvider(requestWrongCerts, mResultReceiver);
+
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
+        assertNull(result);
+    }
+
+    public void testGetProvider_correctCerts()
+            throws PackageManager.NameNotFoundException {
+        ProviderInfo info = setupPackageManager();
+
+        List<byte[]> certList = Arrays.asList(BYTE_ARRAY);
+        FontRequest requestRightCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+        ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+
+        verifyZeroInteractions(mResultReceiver);
+        assertEquals(info, result);
+    }
+
+    public void testGetProvider_moreCerts()
+            throws PackageManager.NameNotFoundException {
+        setupPackageManager();
+
+        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
+        List<byte[]> certList = Arrays.asList(wrongCert, BYTE_ARRAY);
+        FontRequest requestRightCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+        ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+
+        // There is one too many certs, should fail as the set doesn't match.
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
+        // There is one too many certs, should fail as the set doesn't match.
+        assertNull(result);
+    }
+
+    public void testGetProvider_duplicateCerts()
+            throws PackageManager.NameNotFoundException {
+        ProviderInfo info = new ProviderInfo();
+        info.packageName = PACKAGE_NAME;
+        info.applicationInfo = new ApplicationInfo();
+        when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(info);
+        PackageInfo packageInfo = new PackageInfo();
+        Signature signature = mock(Signature.class);
+        when(signature.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
+        Signature signature2 = mock(Signature.class);
+        when(signature2.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
+        packageInfo.packageName = PACKAGE_NAME;
+        packageInfo.signatures = new Signature[] { signature, signature2 };
+        when(mPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
+
+        // The provider has {BYTE_ARRAY_COPY, BYTE_ARRAY_COPY}, the request has
+        // {BYTE_ARRAY_2, BYTE_ARRAY_COPY}.
+        List<byte[]> certList = Arrays.asList(BYTE_ARRAY_2, BYTE_ARRAY_COPY);
+        FontRequest requestRightCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+        ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+
+        // The given list includes an extra cert and doesn't have a second copy of the cert like
+        // the provider does, so it should have failed.
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
+        assertNull(result);
+    }
+
+    public void testGetProvider_correctCertsSeveralSets()
+            throws PackageManager.NameNotFoundException {
+        ProviderInfo info = setupPackageManager();
+
+        List<List<byte[]>> certList = new ArrayList<>();
+        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
+        certList.add(Arrays.asList(wrongCert));
+        certList.add(Arrays.asList(BYTE_ARRAY));
+        FontRequest requestRightCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", certList);
+        ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+
+        verifyZeroInteractions(mResultReceiver);
+        assertEquals(info, result);
+    }
+
+    public void testGetProvider_wrongPackage()
+            throws PackageManager.NameNotFoundException {
+        setupPackageManager();
+
+        List<List<byte[]>> certList = new ArrayList<>();
+        certList.add(Arrays.asList(BYTE_ARRAY));
+        FontRequest requestRightCerts = new FontRequest(
+                TestFontsProvider.AUTHORITY, "com.wrong.package.name", "query", certList);
+        ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+
+        verify(mResultReceiver).send(FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
+        assertNull(result);
+    }
+
+    private ProviderInfo setupPackageManager()
+            throws PackageManager.NameNotFoundException {
+        ProviderInfo info = new ProviderInfo();
+        info.packageName = PACKAGE_NAME;
+        info.applicationInfo = new ApplicationInfo();
+        when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(info);
+        PackageInfo packageInfo = new PackageInfo();
+        Signature signature = mock(Signature.class);
+        when(signature.toByteArray()).thenReturn(BYTE_ARRAY_COPY);
+        packageInfo.packageName = PACKAGE_NAME;
+        packageInfo.signatures = new Signature[] { signature };
+        when(mPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
+        return info;
+    }
+}
diff --git a/compat/tests/java/android/support/v4/provider/TestFontsProvider.java b/compat/tests/java/android/support/v4/provider/TestFontsProvider.java
new file mode 100644
index 0000000..35365f3
--- /dev/null
+++ b/compat/tests/java/android/support/v4/provider/TestFontsProvider.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.provider;
+
+import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Provides a test Content Provider implementing {@link FontsContract}.
+ */
+public class TestFontsProvider extends ContentProvider {
+    static final String AUTHORITY = "android.provider.TestFontsProvider";
+    static final int TTC_INDEX = 2;
+    static final String VARIATION_SETTINGS = "'wdth' 1";
+    static final int NORMAL_WEIGHT = 400;
+    static final boolean ITALIC = false;
+
+    private ParcelFileDescriptor mPfd;
+    private boolean mReturnAllFields = true;
+    private int mResultCode = FontsContract.Columns.RESULT_CODE_OK;
+    private MatrixCursor mCustomCursor = null;
+
+    /**
+     * Used by tests to modify the result code that should be returned.
+     */
+    void setResultCode(int resultCode) {
+        mResultCode = resultCode;
+    }
+
+    /**
+     * Used by tests to switch whether all fields should be returned or not.
+     */
+    void setReturnAllFields(boolean returnAllFields) {
+        mReturnAllFields = returnAllFields;
+    }
+
+    /**
+     * Used by tests to control what values are returned.
+     */
+    void setCustomCursor(MatrixCursor cursor) {
+        mCustomCursor = cursor;
+    }
+
+    @Override
+    public boolean onCreate() {
+        mPfd = createFontFile();
+        return true;
+    }
+
+    @Override
+    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
+            @Nullable String[] selectionArgs, @Nullable String sortOrder) {
+        if (mCustomCursor != null) {
+            return mCustomCursor;
+        }
+        MatrixCursor cursor;
+        if (mReturnAllFields) {
+            cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+                    FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+                    FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
+                    FontsContract.Columns.RESULT_CODE });
+            cursor.addRow(
+                    new Object[] { 1, TTC_INDEX, VARIATION_SETTINGS, 400, 0, mResultCode });
+        } else {
+            cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID });
+            cursor.addRow(new Object[] { 1 });
+        }
+        return cursor;
+    }
+
+    @Override
+    public ParcelFileDescriptor openFile(Uri uri, String mode) {
+        try {
+            return mPfd.dup();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public String getType(@NonNull Uri uri) {
+        return "application/x-font-ttf";
+    }
+
+    @Override
+    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+        return null;
+    }
+
+    @Override
+    public int delete(@NonNull Uri uri, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
+        return 0;
+    }
+
+    private ParcelFileDescriptor createFontFile() {
+        try {
+            final File file = new File(getContext().getCacheDir(), "font.ttf");
+            file.getParentFile().mkdirs();
+            file.createNewFile();
+            file.setReadable(true, false);
+            return ParcelFileDescriptor.open(file, MODE_READ_ONLY);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
index 5b14129..6f0a179 100644
--- a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -16,7 +16,6 @@
 
 package android.support.v4.widget;
 
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.support.annotation.ColorInt;
@@ -472,12 +471,10 @@
         mCircleView.startAnimation(mScaleDownAnimation);
     }
 
-    @SuppressLint("NewApi")
     private void startProgressAlphaStartAnimation() {
         mAlphaStartAnimation = startAlphaAnimation(mProgress.getAlpha(), STARTING_PROGRESS_ALPHA);
     }
 
-    @SuppressLint("NewApi")
     private void startProgressAlphaMaxAnimation() {
         mAlphaMaxAnimation = startAlphaAnimation(mProgress.getAlpha(), MAX_ALPHA);
     }
@@ -897,7 +894,6 @@
         return animation != null && animation.hasStarted() && !animation.hasEnded();
     }
 
-    @SuppressLint("NewApi")
     private void moveSpinner(float overscrollTop) {
         mProgress.showArrow(true);
         float originalDragPercent = overscrollTop / mTotalDragDistance;
diff --git a/core-utils/Android.mk b/core-utils/Android.mk
index 2003f24..b22c376 100644
--- a/core-utils/Android.mk
+++ b/core-utils/Android.mk
@@ -28,7 +28,6 @@
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
     $(call all-java-files-under,gingerbread) \
-    $(call all-java-files-under,jellybean) \
     $(call all-java-files-under,kitkat) \
     $(call all-java-files-under,api20) \
     $(call all-java-files-under,api21) \
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index a1ca98b..59879bb 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -24,8 +24,6 @@
     sourceSets {
         main.java.srcDirs = [
                 'gingerbread',
-                'honeycomb',
-                'jellybean',
                 'kitkat',
                 'api20',
                 'api21',
diff --git a/core-utils/java/android/support/v4/app/NavUtils.java b/core-utils/java/android/support/v4/app/NavUtils.java
index b5638c5..87e0cc3 100644
--- a/core-utils/java/android/support/v4/app/NavUtils.java
+++ b/core-utils/java/android/support/v4/app/NavUtils.java
@@ -16,8 +16,6 @@
 
 package android.support.v4.app;
 
-import android.os.Build;
-import android.support.annotation.RequiresApi;
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
@@ -25,6 +23,7 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
@@ -40,108 +39,6 @@
     private static final String TAG = "NavUtils";
     public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
 
-    interface NavUtilsImpl {
-        Intent getParentActivityIntent(Activity activity);
-        boolean shouldUpRecreateTask(Activity activity, Intent targetIntent);
-        void navigateUpTo(Activity activity, Intent upIntent);
-        String getParentActivityName(Context context, ActivityInfo info);
-    }
-
-    static class NavUtilsImplBase implements NavUtilsImpl {
-
-        @Override
-        public Intent getParentActivityIntent(Activity activity) {
-            String parentName = NavUtils.getParentActivityName(activity);
-            if (parentName == null) return null;
-
-            // If the parent itself has no parent, generate a main activity intent.
-            final ComponentName target = new ComponentName(activity, parentName);
-            try {
-                final String grandparent = NavUtils.getParentActivityName(activity, target);
-                final Intent parentIntent = grandparent == null
-                        ? Intent.makeMainActivity(target)
-                        : new Intent().setComponent(target);
-                return parentIntent;
-            } catch (NameNotFoundException e) {
-                Log.e(TAG, "getParentActivityIntent: bad parentActivityName '" + parentName +
-                        "' in manifest");
-                return null;
-            }
-        }
-
-        @Override
-        public boolean shouldUpRecreateTask(Activity activity, Intent targetIntent) {
-            String action = activity.getIntent().getAction();
-            return action != null && !action.equals(Intent.ACTION_MAIN);
-        }
-
-        @Override
-        public void navigateUpTo(Activity activity, Intent upIntent) {
-            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-            activity.startActivity(upIntent);
-            activity.finish();
-        }
-
-        @Override
-        public String getParentActivityName(Context context, ActivityInfo info) {
-            if (info.metaData == null) return null;
-            String parentActivity = info.metaData.getString(PARENT_ACTIVITY);
-            if (parentActivity == null) return null;
-            if (parentActivity.charAt(0) == '.') {
-                parentActivity = context.getPackageName() + parentActivity;
-            }
-            return parentActivity;
-        }
-    }
-
-    @RequiresApi(16)
-    static class NavUtilsImplJB extends NavUtilsImplBase {
-
-        @Override
-        public Intent getParentActivityIntent(Activity activity) {
-            // Prefer the "real" JB definition if available,
-            // else fall back to the meta-data element.
-            Intent result = NavUtilsJB.getParentActivityIntent(activity);
-            if (result == null) {
-                result = superGetParentActivityIntent(activity);
-            }
-            return result;
-        }
-
-        Intent superGetParentActivityIntent(Activity activity) {
-            return super.getParentActivityIntent(activity);
-        }
-
-        @Override
-        public boolean shouldUpRecreateTask(Activity activity, Intent targetIntent) {
-            return NavUtilsJB.shouldUpRecreateTask(activity, targetIntent);
-        }
-
-        @Override
-        public void navigateUpTo(Activity activity, Intent upIntent) {
-            NavUtilsJB.navigateUpTo(activity, upIntent);
-        }
-
-        @Override
-        public String getParentActivityName(Context context, ActivityInfo info) {
-            String result = NavUtilsJB.getParentActivityName(info);
-            if (result == null) {
-                result = super.getParentActivityName(context, info);
-            }
-            return result;
-        }
-    }
-
-    private static final NavUtilsImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new NavUtilsImplJB();
-        } else {
-            IMPL = new NavUtilsImplBase();
-        }
-    }
-
     /**
      * Returns true if sourceActivity should recreate the task when navigating 'up'
      * by using targetIntent.
@@ -157,7 +54,12 @@
      *         should be used for the destination
      */
     public static boolean shouldUpRecreateTask(Activity sourceActivity, Intent targetIntent) {
-        return IMPL.shouldUpRecreateTask(sourceActivity, targetIntent);
+        if (Build.VERSION.SDK_INT >= 16) {
+            return sourceActivity.shouldUpRecreateTask(targetIntent);
+        } else {
+            String action = sourceActivity.getIntent().getAction();
+            return action != null && !action.equals(Intent.ACTION_MAIN);
+        }
     }
 
     /**
@@ -200,7 +102,13 @@
      * @param upIntent An intent representing the target destination for up navigation
      */
     public static void navigateUpTo(Activity sourceActivity, Intent upIntent) {
-        IMPL.navigateUpTo(sourceActivity, upIntent);
+        if (Build.VERSION.SDK_INT >= 16) {
+            sourceActivity.navigateUpTo(upIntent);
+        } else {
+            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            sourceActivity.startActivity(upIntent);
+            sourceActivity.finish();
+        }
     }
 
     /**
@@ -214,7 +122,29 @@
      * @return a new Intent targeting the defined parent activity of sourceActivity
      */
     public static Intent getParentActivityIntent(Activity sourceActivity) {
-        return IMPL.getParentActivityIntent(sourceActivity);
+        if (Build.VERSION.SDK_INT >= 16) {
+            // Prefer the "real" JB definition if available,
+            // else fall back to the meta-data element.
+            Intent result = sourceActivity.getParentActivityIntent();
+            if (result != null) {
+                return null;
+            }
+        }
+        String parentName = NavUtils.getParentActivityName(sourceActivity);
+        if (parentName == null) return null;
+
+        // If the parent itself has no parent, generate a main activity intent.
+        final ComponentName target = new ComponentName(sourceActivity, parentName);
+        try {
+            final String grandparent = NavUtils.getParentActivityName(sourceActivity, target);
+            return grandparent == null
+                    ? Intent.makeMainActivity(target)
+                    : new Intent().setComponent(target);
+        } catch (NameNotFoundException e) {
+            Log.e(TAG, "getParentActivityIntent: bad parentActivityName '" + parentName
+                    + "' in manifest");
+            return null;
+        }
     }
 
     /**
@@ -300,7 +230,22 @@
             throws NameNotFoundException {
         PackageManager pm = context.getPackageManager();
         ActivityInfo info = pm.getActivityInfo(componentName, PackageManager.GET_META_DATA);
-        String parentActivity = IMPL.getParentActivityName(context, info);
+        if (Build.VERSION.SDK_INT >= 16) {
+            String result = info.parentActivityName;
+            if (result != null) {
+                return result;
+            }
+        }
+        if (info.metaData == null) {
+            return null;
+        }
+        String parentActivity = info.metaData.getString(PARENT_ACTIVITY);
+        if (parentActivity == null) {
+            return null;
+        }
+        if (parentActivity.charAt(0) == '.') {
+            parentActivity = context.getPackageName() + parentActivity;
+        }
         return parentActivity;
     }
 
diff --git a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java b/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
index fcfc674..b960939 100644
--- a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
+++ b/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
@@ -25,7 +25,7 @@
 import android.util.SparseArray;
 
 /**
- * Helper for the common pattern of implementing a {@link BroadcastReceiver}
+ * This helper is for an old pattern of implementing a {@link BroadcastReceiver}
  * that receives a device wakeup event and then passes the work off
  * to a {@link android.app.Service}, while ensuring that the
  * device does not go back to sleep during the transition.
@@ -57,7 +57,16 @@
  *
  * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
  *      complete}
+ *
+ * @deprecated As of {@link android.os.Build.VERSION_CODES#O Android O}, background check
+ * restrictions make this class no longer generally useful.  (It is generally not safe to
+ * start a service from the receipt of a broadcast, because you don't have any guarantees
+ * that your app is in the foreground at this point and thus allowed to do so.)  Instead,
+ * developers should use android.app.job.JobScheduler to schedule a job, and this
+ * does not require that the app hold a wake lock while doing so (the system will take
+ * care of holding a wake lock for the job).
  */
+@Deprecated
 public abstract class WakefulBroadcastReceiver extends BroadcastReceiver {
     private static final String EXTRA_WAKE_LOCK_ID = "android.support.content.wakelockid";
 
diff --git a/core-utils/jellybean/android/support/v4/app/NavUtilsJB.java b/core-utils/jellybean/android/support/v4/app/NavUtilsJB.java
deleted file mode 100644
index 64a6a81..0000000
--- a/core-utils/jellybean/android/support/v4/app/NavUtilsJB.java
+++ /dev/null
@@ -1,41 +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.Intent;
-import android.content.pm.ActivityInfo;
-import android.support.annotation.RequiresApi;
-
-@RequiresApi(16)
-class NavUtilsJB {
-    public static Intent getParentActivityIntent(Activity activity) {
-        return activity.getParentActivityIntent();
-    }
-
-    public static boolean shouldUpRecreateTask(Activity activity, Intent targetIntent) {
-        return activity.shouldUpRecreateTask(targetIntent);
-    }
-
-    public static void navigateUpTo(Activity activity, Intent upIntent) {
-        activity.navigateUpTo(upIntent);
-    }
-
-    public static String getParentActivityName(ActivityInfo info) {
-        return info.parentActivityName;
-    }
-}
diff --git a/design/res/layout/design_bottom_sheet_dialog.xml b/design/res/layout/design_bottom_sheet_dialog.xml
index f4edb66..28e023c 100644
--- a/design/res/layout/design_bottom_sheet_dialog.xml
+++ b/design/res/layout/design_bottom_sheet_dialog.xml
@@ -14,25 +14,37 @@
   ~ 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:layout_width="match_parent"
-        android:layout_height="match_parent">
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
 
-    <View
+    <android.support.design.widget.CoordinatorLayout
+        android:id="@+id/coordinator"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
+
+        <View
             android:id="@+id/touch_outside"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:importantForAccessibility="no"
-            android:soundEffectsEnabled="false"/>
+            android:soundEffectsEnabled="false"
+            tools:ignore="UnusedAttribute"/>
 
-    <FrameLayout
+        <FrameLayout
             android:id="@+id/design_bottom_sheet"
+            style="?attr/bottomSheetStyle"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal|top"
-            app:layout_behavior="@string/bottom_sheet_behavior"
-            style="?attr/bottomSheetStyle"/>
+            app:layout_behavior="@string/bottom_sheet_behavior"/>
 
-</android.support.design.widget.CoordinatorLayout>
+    </android.support.design.widget.CoordinatorLayout>
+
+</FrameLayout>
diff --git a/design/res/values/attrs.xml b/design/res/values/attrs.xml
index 41e0c0f..faeba76 100644
--- a/design/res/values/attrs.xml
+++ b/design/res/values/attrs.xml
@@ -458,9 +458,6 @@
         <attr name="bottomSheetDialogTheme" format="reference" />
         <!-- Style to use for modal bottom sheets in this theme. -->
         <attr name="bottomSheetStyle" format="reference" />
-
-        <!-- Text color used to indicate an error has occurred. -->
-        <attr name="textColorError" format="color" />
     </declare-styleable>
 
     <declare-styleable name="BottomNavigationView">
diff --git a/design/res/values/themes.xml b/design/res/values/themes.xml
index 5768692..af9d583 100644
--- a/design/res/values/themes.xml
+++ b/design/res/values/themes.xml
@@ -28,13 +28,9 @@
         <item name="bottomSheetStyle">@style/Widget.Design.BottomSheet.Modal</item>
     </style>
 
-    <style name="Theme.Design" parent="Theme.AppCompat">
-        <item name="textColorError">@color/design_textinput_error_color_dark</item>
-    </style>
+    <style name="Theme.Design" parent="Theme.AppCompat" />
 
-    <style name="Theme.Design.Light" parent="Theme.AppCompat.Light">
-        <item name="textColorError">@color/design_textinput_error_color_light</item>
-    </style>
+    <style name="Theme.Design.Light" parent="Theme.AppCompat.Light" />
 
     <style name="Theme.Design.NoActionBar">
         <item name="windowActionBar">false</item>
diff --git a/design/src/android/support/design/internal/BottomNavigationItemView.java b/design/src/android/support/design/internal/BottomNavigationItemView.java
index 72b80bf..885ea02 100644
--- a/design/src/android/support/design/internal/BottomNavigationItemView.java
+++ b/design/src/android/support/design/internal/BottomNavigationItemView.java
@@ -86,9 +86,9 @@
 
         LayoutInflater.from(context).inflate(R.layout.design_bottom_navigation_item, this, true);
         setBackgroundResource(R.drawable.design_bottom_navigation_item_background);
-        mIcon = (ImageView) findViewById(R.id.icon);
-        mSmallLabel = (TextView) findViewById(R.id.smallLabel);
-        mLargeLabel = (TextView) findViewById(R.id.largeLabel);
+        mIcon = findViewById(R.id.icon);
+        mSmallLabel = findViewById(R.id.smallLabel);
+        mLargeLabel = findViewById(R.id.largeLabel);
     }
 
     @Override
diff --git a/design/src/android/support/design/internal/NavigationMenuItemView.java b/design/src/android/support/design/internal/NavigationMenuItemView.java
index 53ef24a..eea9e90 100644
--- a/design/src/android/support/design/internal/NavigationMenuItemView.java
+++ b/design/src/android/support/design/internal/NavigationMenuItemView.java
@@ -96,7 +96,7 @@
         LayoutInflater.from(context).inflate(R.layout.design_navigation_menu_item, this, true);
         mIconSize = context.getResources().getDimensionPixelSize(
                 R.dimen.design_navigation_icon_size);
-        mTextView = (CheckedTextView) findViewById(R.id.design_menu_item_text);
+        mTextView = findViewById(R.id.design_menu_item_text);
         mTextView.setDuplicateParentStateEnabled(true);
         ViewCompat.setAccessibilityDelegate(mTextView, mAccessibilityDelegate);
     }
diff --git a/design/src/android/support/design/internal/SnackbarContentLayout.java b/design/src/android/support/design/internal/SnackbarContentLayout.java
index 55a66fb..2abf012 100644
--- a/design/src/android/support/design/internal/SnackbarContentLayout.java
+++ b/design/src/android/support/design/internal/SnackbarContentLayout.java
@@ -57,8 +57,8 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mMessageView = (TextView) findViewById(R.id.snackbar_text);
-        mActionView = (Button) findViewById(R.id.snackbar_action);
+        mMessageView = findViewById(R.id.snackbar_text);
+        mActionView = findViewById(R.id.snackbar_action);
     }
 
     public TextView getMessageView() {
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index 822b38d..d9f12ba 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -145,7 +145,7 @@
     private boolean mCollapsible;
     private boolean mCollapsed;
 
-    private final int[] mTmpStatesArray = new int[2];
+    private int[] mTmpStatesArray;
 
     public AppBarLayout(Context context) {
         this(context, null);
@@ -499,6 +499,12 @@
 
     @Override
     protected int[] onCreateDrawableState(int extraSpace) {
+        if (mTmpStatesArray == null) {
+            // Note that we can't allocate this at the class level (in declaration) since
+            // some paths in super View constructor are going to call this method before
+            // that
+            mTmpStatesArray = new int[2];
+        }
         final int[] extraStates = mTmpStatesArray;
         final int[] states = super.onCreateDrawableState(extraSpace + extraStates.length);
 
diff --git a/design/src/android/support/design/widget/BottomSheetDialog.java b/design/src/android/support/design/widget/BottomSheetDialog.java
index 6ee5d68..19b5782 100644
--- a/design/src/android/support/design/widget/BottomSheetDialog.java
+++ b/design/src/android/support/design/widget/BottomSheetDialog.java
@@ -33,6 +33,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.WindowManager;
 import android.widget.FrameLayout;
 
 /**
@@ -72,8 +73,15 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        getWindow().setLayout(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+        Window window = getWindow();
+        if (window != null) {
+            if (Build.VERSION.SDK_INT >= 21) {
+                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            }
+            window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT);
+        }
     }
 
     @Override
@@ -116,8 +124,10 @@
     }
 
     private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
-        final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
+        final FrameLayout container = (FrameLayout) View.inflate(getContext(),
                 R.layout.design_bottom_sheet_dialog, null);
+        final CoordinatorLayout coordinator =
+                (CoordinatorLayout) container.findViewById(R.id.coordinator);
         if (layoutResId != 0 && view == null) {
             view = getLayoutInflater().inflate(layoutResId, coordinator, false);
         }
@@ -169,7 +179,7 @@
                 return true;
             }
         });
-        return coordinator;
+        return container;
     }
 
     boolean shouldWindowCloseOnTouchOutside() {
diff --git a/design/src/android/support/design/widget/CollapsingToolbarLayout.java b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
index 2b0b1da..c3d1268 100644
--- a/design/src/android/support/design/widget/CollapsingToolbarLayout.java
+++ b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
@@ -342,7 +342,7 @@
 
         if (mToolbarId != -1) {
             // If we have an ID set, try and find it and it's direct parent to us
-            mToolbar = (Toolbar) findViewById(mToolbarId);
+            mToolbar = findViewById(mToolbarId);
             if (mToolbar != null) {
                 mToolbarDirectChild = findDirectChild(mToolbar);
             }
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
index 110b205..6d7a7e6 100755
--- a/design/tests/AndroidManifest.xml
+++ b/design/tests/AndroidManifest.xml
@@ -91,6 +91,10 @@
             android:name="android.support.design.widget.AppBarLayoutCollapsePinTestActivity"
             android:theme="@style/Theme.TranslucentStatus"/>
 
+        <activity
+            android:name="android.support.design.widget.AppBarWithScrollbarsActivity"
+            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
+
     </application>
 
 </manifest>
diff --git a/design/tests/res/layout/design_appbar_with_scrollbars.xml b/design/tests/res/layout/design_appbar_with_scrollbars.xml
new file mode 100644
index 0000000..6c89a2a
--- /dev/null
+++ b/design/tests/res/layout/design_appbar_with_scrollbars.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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.AppBarLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="200dp"
+    android:theme="@style/AppBarWithScrollbars"/>
\ No newline at end of file
diff --git a/design/tests/res/values/styles.xml b/design/tests/res/values/styles.xml
index 8f0af0c..eb6aee6 100644
--- a/design/tests/res/values/styles.xml
+++ b/design/tests/res/values/styles.xml
@@ -36,4 +36,7 @@
         <item name="android:textColor">@color/color_state_list_themed</item>
     </style>
 
+    <style name="AppBarWithScrollbars" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
+        <item name="android:scrollbars">horizontal</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java b/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java
index 38ea4fc..d7ea68f 100644
--- a/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java
+++ b/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java
@@ -28,7 +28,7 @@
 
     @Override
     protected void onContentViewSet() {
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
     }
 }
diff --git a/compat/api24/android/support/v4/os/UserManagerCompatApi24.java b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java
similarity index 65%
rename from compat/api24/android/support/v4/os/UserManagerCompatApi24.java
rename to design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java
index c8ef7c0..bd693d4 100644
--- a/compat/api24/android/support/v4/os/UserManagerCompatApi24.java
+++ b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java
@@ -14,15 +14,13 @@
  * limitations under the License.
  */
 
-package android.support.v4.os;
+package android.support.design.widget;
 
-import android.content.Context;
-import android.os.UserManager;
-import android.support.annotation.RequiresApi;
+import android.support.design.test.R;
 
-@RequiresApi(24)
-class UserManagerCompatApi24 {
-    public static boolean isUserUnlocked(Context context) {
-        return context.getSystemService(UserManager.class).isUserUnlocked();
+public class AppBarWithScrollbarsActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.design_appbar_with_scrollbars;
     }
 }
diff --git a/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java
new file mode 100644
index 0000000..f6fe8bf
--- /dev/null
+++ b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.support.test.filters.SmallTest;
+
+import org.junit.Test;
+
+public class AppBarWithScrollbarsTest extends
+        BaseInstrumentationTestCase<AppBarWithScrollbarsActivity> {
+
+    public AppBarWithScrollbarsTest() {
+        super(AppBarWithScrollbarsActivity.class);
+    }
+
+    @Test
+    @SmallTest
+    public void testInflationNoCrash() {
+        // This is the implicit test for to check that AppBarLayout inflation doesn't crash
+        // when its theme has attributes that would cause onCreateDrawableState to be called
+        // during the super's constructor flow.
+    }
+}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
index 6e04241..6ab6287 100644
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
+++ b/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
@@ -40,10 +40,10 @@
 
     @Override
     protected void onContentViewSet() {
-        mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
-        mBottomSheet = (LinearLayout) findViewById(R.id.bottom_sheet);
+        mCoordinatorLayout = findViewById(R.id.coordinator);
+        mBottomSheet = findViewById(R.id.bottom_sheet);
         mBehavior = BottomSheetBehavior.from(mBottomSheet);
-        mFab = (FloatingActionButton) findViewById(R.id.fab);
+        mFab = 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 2faf8a0..6d040d4 100644
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
+++ b/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
@@ -54,7 +54,6 @@
 import android.view.View;
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
-import android.widget.TextView;
 
 import org.hamcrest.Matcher;
 import org.hamcrest.Matchers;
@@ -512,18 +511,9 @@
             public void run() {
                 bottomSheet.addView(scroll, new ViewGroup.LayoutParams(
                         ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-                TextView view = new TextView(mActivityTestRule.getActivity());
-                StringBuilder sb = new StringBuilder();
-                for (int i = 0; i < 500; ++i) {
-                    sb.append("It is fine today. ");
-                }
-                view.setText(sb);
-                view.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        // Do nothing
-                    }
-                });
+                final View view = new View(mActivityTestRule.getActivity());
+                // Make sure that the NestedScrollView is always scrollable
+                view.setMinimumHeight(bottomSheet.getHeight() + 1000);
                 scroll.addView(view);
                 assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
                 // The scroll offset is 0 at first
diff --git a/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java b/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java
index 7d52666..a42ac8d 100644
--- a/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java
+++ b/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java
@@ -31,8 +31,8 @@
 
     @Override
     protected void onContentViewSet() {
-        mContainer = (FrameLayout) findViewById(R.id.container);
-        mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
+        mContainer = findViewById(R.id.container);
+        mCoordinatorLayout = findViewById(R.id.coordinator);
     }
 
 }
diff --git a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java b/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java
index ff92b36..39db827 100644
--- a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java
+++ b/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java
@@ -26,7 +26,7 @@
 
     @Override
     protected void onContentViewSet() {
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
     }
diff --git a/dynamic-animation/src/android/support/animation/SpringAnimation.java b/dynamic-animation/src/android/support/animation/SpringAnimation.java
index 47096df..e844fd1 100644
--- a/dynamic-animation/src/android/support/animation/SpringAnimation.java
+++ b/dynamic-animation/src/android/support/animation/SpringAnimation.java
@@ -37,7 +37,8 @@
  * // Create an animation to animate view's X property, set the rest position of the
  * // default spring to 0, and start the animation with a starting velocity of 5000 (pixel/s).
  * final SpringAnimation anim = new SpringAnimation(view, DynamicAnimation.X, 0)
- *         .setSpring(spring).setStartVelocity(5000).start();
+ *         .setStartVelocity(5000);
+ * anim.start();
  * </pre>
  *
  * <p>Alternatively, a {@link SpringAnimation} can take a pre-configured {@link SpringForce}, and
@@ -51,7 +52,8 @@
  * // the spring above and a starting value of 0.5. Additionally, constrain the range of value for
  * // the animation to be non-negative, effectively preventing any spring overshoot.
  * final SpringAnimation anim = new SpringAnimation(view, DynamicAnimation.SCALE_Y)
- *         .setMinValue(0).setSpring(spring).setStartValue(1).start();
+ *         .setMinValue(0).setSpring(spring).setStartValue(1);
+ * anim.start();
  * </pre>
  */
 public final class SpringAnimation extends DynamicAnimation<SpringAnimation> {
diff --git a/emoji/bundled/assets/NotoColorEmojiCompat.ttf b/emoji/bundled/assets/NotoColorEmojiCompat.ttf
index 95fe9f5..6e0c045 100644
--- a/emoji/bundled/assets/NotoColorEmojiCompat.ttf
+++ b/emoji/bundled/assets/NotoColorEmojiCompat.ttf
Binary files differ
diff --git a/emoji/core/scripts/createfont.py b/emoji/core/scripts/createfont.py
index 80508cc..37233f2 100755
--- a/emoji/core/scripts/createfont.py
+++ b/emoji/core/scripts/createfont.py
@@ -39,7 +39,7 @@
 After execution the following files are generated if they don't exist otherwise, they are updated:
 
 - ../tests/assets/NotoColorEmojiCompat.ttf
-- ../../bundled-typeface/assets/NotoColorEmojiCompat.ttf
+- ../../bundled/assets/NotoColorEmojiCompat.ttf
 - ../src/android/support/text/emoji/flatbuffer/*
 - data/emoji_metadata.txt
 """
@@ -83,7 +83,7 @@
 # main directories where output files are created
 EMOJI_CORE_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
 BUNDLED_MODULE_DIR = os.path.abspath(
-    os.path.join(SCRIPT_DIR, os.pardir, os.pardir, 'bundled-typeface'))
+    os.path.join(SCRIPT_DIR, os.pardir, os.pardir, 'bundled'))
 SUPPORT_ROOT_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir, os.pardir))
 
 # remapped font output file under test directory
@@ -536,10 +536,10 @@
         # returned is either default or 1 greater than the largest id in previous data
         self.emoji_id = load_previous_metadata(self.emoji_data_map)
 
-        with contextlib.closing(ttLib.TTFont(self.font_path)) as ttf:
-            # set the font revision to be the METADATA_VERSION
-            ttf['head'].fontRevision = METADATA_VERSION
-
+        # recalcTimestamp parameter will keep the modified field same as the original font. Changing
+        # the modified field in the font causes the font ttf file to change, which makes it harder
+        # to understand if something really changed in the font.
+        with contextlib.closing(ttLib.TTFont(self.font_path, recalcTimestamp=False)) as ttf:
             # read image size data
             self.read_cbdt(ttf)
 
@@ -572,7 +572,7 @@
             # save the new font
             ttf.save(TEST_FONT_FILE_PATH)
 
-            # copy to bundled-typeface project
+            # copy to bundled project
             makedirs_if_not_exists(BUNDLED_ASSET_DIR)
             shutil.copy(TEST_FONT_FILE_PATH, BUNDLED_ASSET_PATH)
 
diff --git a/emoji/core/src/android/support/text/emoji/MetadataListReader.java b/emoji/core/src/android/support/text/emoji/MetadataListReader.java
index 6dbff21..59aa682 100644
--- a/emoji/core/src/android/support/text/emoji/MetadataListReader.java
+++ b/emoji/core/src/android/support/text/emoji/MetadataListReader.java
@@ -48,6 +48,11 @@
     private static final int EMJI_TAG = 'E' << 24 | 'm' << 16 | 'j' << 8 | 'i';
 
     /**
+     * Deprecated meta tag name. Do not use, kept for compatibility reasons, will be removed soon.
+     */
+    private static final int EMJI_TAG_DEPRECATED = 'e' << 24 | 'm' << 16 | 'j' << 8 | 'i';
+
+    /**
      * The name of the meta table in the font. int representation for "meta"
      */
     private static final int META_TABLE_NAME = 'm' << 24 | 'e' << 16 | 't' << 8 | 'a';
@@ -155,7 +160,7 @@
                 final int tag = reader.readTag();
                 final long dataOffset = reader.readUnsignedInt();
                 final long dataLength = reader.readUnsignedInt();
-                if (EMJI_TAG == tag) {
+                if (EMJI_TAG == tag || EMJI_TAG_DEPRECATED == tag) {
                     return new OffsetInfo(dataOffset + metaOffset, dataLength);
                 }
             }
diff --git a/emoji/core/tests/assets/NotoColorEmojiCompat.ttf b/emoji/core/tests/assets/NotoColorEmojiCompat.ttf
index 95fe9f5..6e0c045 100644
--- a/emoji/core/tests/assets/NotoColorEmojiCompat.ttf
+++ b/emoji/core/tests/assets/NotoColorEmojiCompat.ttf
Binary files differ
diff --git a/fragment/Android.mk b/fragment/Android.mk
index 399b5d9..cc1b5f8 100644
--- a/fragment/Android.mk
+++ b/fragment/Android.mk
@@ -30,9 +30,6 @@
 LOCAL_MODULE := android-support-fragment
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under, api14) \
-    $(call all-java-files-under, jellybean) \
-    $(call all-java-files-under, api21) \
     $(call all-java-files-under, java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 574cc2d..b62784b 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -23,12 +23,7 @@
     }
 
     sourceSets {
-        main.java.srcDirs = [
-                'api14',
-                'jellybean',
-                'api21',
-                'java'
-        ]
+        main.java.srcDirs = ['java']
     }
 }
 
diff --git a/fragment/api14/android/support/v4/app/BaseFragmentActivityApi14.java b/fragment/java/android/support/v4/app/BaseFragmentActivityApi14.java
similarity index 100%
rename from fragment/api14/android/support/v4/app/BaseFragmentActivityApi14.java
rename to fragment/java/android/support/v4/app/BaseFragmentActivityApi14.java
diff --git a/fragment/jellybean/android/support/v4/app/BaseFragmentActivityJB.java b/fragment/java/android/support/v4/app/BaseFragmentActivityApi16.java
similarity index 95%
rename from fragment/jellybean/android/support/v4/app/BaseFragmentActivityJB.java
rename to fragment/java/android/support/v4/app/BaseFragmentActivityApi16.java
index 3df56e1..0af2cec 100644
--- a/fragment/jellybean/android/support/v4/app/BaseFragmentActivityJB.java
+++ b/fragment/java/android/support/v4/app/BaseFragmentActivityApi16.java
@@ -11,7 +11,7 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
 package android.support.v4.app;
@@ -31,7 +31,7 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP)
-abstract class BaseFragmentActivityJB extends BaseFragmentActivityApi14 {
+abstract class BaseFragmentActivityApi16 extends BaseFragmentActivityApi14 {
 
     // We need to keep track of whether startActivityForResult originated from a Fragment, so we
     // can conditionally check whether the requestCode collides with our reserved ID space for the
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
index 7604319..42644bb 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -334,6 +334,10 @@
     // removal animations.
     float mPostponedAlpha;
 
+    // The cached value from onGetLayoutInflater(Bundle) that will be returned from
+    // getLayoutInflater()
+    LayoutInflater mLayoutInflater;
+
     /**
      * State information that has been retrieved from a fragment instance
      * through {@link FragmentManager#saveFragmentInstanceState(Fragment)
@@ -1174,9 +1178,45 @@
     }
 
     /**
-     * Use {@link #onGetLayoutInflater(Bundle)} instead
+     * Returns the cached LayoutInflater used to inflate Views of this Fragment. If
+     * {@link #onGetLayoutInflater(Bundle)} has not been called {@link #onGetLayoutInflater(Bundle)}
+     * will be called with a {@code null} argument and that value will be cached.
+     * <p>
+     * The cached LayoutInflater will be replaced immediately prior to
+     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} and cleared immediately after
+     * {@link #onDetach()}.
+     *
+     * @return The LayoutInflater used to inflate Views of this Fragment.
+     */
+    public final LayoutInflater getLayoutInflater() {
+        if (mLayoutInflater == null) {
+            return performGetLayoutInflater(null);
+        }
+        return mLayoutInflater;
+    }
+
+    /**
+     * Calls {@link #onGetLayoutInflater(Bundle)} and caches the result for use by
+     * {@link #getLayoutInflater()}.
+     *
+     * @param savedInstanceState If the fragment is being re-created from
+     * a previous saved state, this is the state.
+     * @return The LayoutInflater used to inflate Views of this Fragment.
+     */
+    LayoutInflater performGetLayoutInflater(Bundle savedInstanceState) {
+        LayoutInflater layoutInflater = onGetLayoutInflater(savedInstanceState);
+        mLayoutInflater = layoutInflater;
+        return mLayoutInflater;
+    }
+
+    /**
+     * Override {@link #onGetLayoutInflater(Bundle)} when you need to change the
+     * LayoutInflater or call {@link #getLayoutInflater()} when you want to
+     * retrieve the current LayoutInflater.
+     *
      * @hide
-     * @deprecated Use {@link #onGetLayoutInflater(Bundle)} instead.
+     * @deprecated Override {@link #onGetLayoutInflater(Bundle)} or call
+     * {@link #getLayoutInflater()} instead of this method.
      */
     @Deprecated
     @RestrictTo(LIBRARY_GROUP)
@@ -2309,6 +2349,12 @@
         }
     }
 
+    void noteStateNotSaved() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+        }
+    }
+
     void performMultiWindowModeChanged(boolean isInMultiWindowMode) {
         onMultiWindowModeChanged(isInMultiWindowMode);
         if (mChildFragmentManager != null) {
@@ -2506,6 +2552,7 @@
     void performDetach() {
         mCalled = false;
         onDetach();
+        mLayoutInflater = null;
         if (!mCalled) {
             throw new SuperNotCalledException("Fragment " + this
                     + " did not call through to super.onDetach()");
diff --git a/fragment/java/android/support/v4/app/FragmentActivity.java b/fragment/java/android/support/v4/app/FragmentActivity.java
index 7135c40..3c89a8d 100644
--- a/fragment/java/android/support/v4/app/FragmentActivity.java
+++ b/fragment/java/android/support/v4/app/FragmentActivity.java
@@ -18,7 +18,6 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -61,19 +60,9 @@
  * <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
+public class FragmentActivity extends BaseFragmentActivityApi16 implements
         ActivityCompat.OnRequestPermissionsResultCallback,
         ActivityCompat.RequestPermissionsRequestCodeValidator {
     private static final String TAG = "FragmentActivity";
@@ -873,7 +862,6 @@
             super(FragmentActivity.this /*fragmentActivity*/);
         }
 
-        @SuppressLint("NewApi")
         @Override
         public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
             FragmentActivity.this.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
index af26747..1cf0170 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -60,7 +60,6 @@
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -327,14 +326,17 @@
     public abstract Fragment getFragment(Bundle bundle, String key);
 
     /**
-     * Get a collection of all fragments that are currently added to the FragmentManager.
+     * Get a list of all fragments that are currently added to the FragmentManager.
      * This may include those that are hidden as well as those that are shown.
      * This will not include any fragments only in the back stack, or fragments that
      * are detached or removed.
+     * <p>
+     * The order of the fragments in the list is the order in which they were
+     * added or attached.
      *
-     * @return A collection of all fragments that are added to the FragmentManager.
+     * @return A list of all fragments that are added to the FragmentManager.
      */
-    public abstract Collection<Fragment> getFragments();
+    public abstract List<Fragment> getFragments();
 
     /**
      * Save the current instance state of the given Fragment.  This can be
@@ -735,6 +737,9 @@
     // Postponed transactions.
     ArrayList<StartEnterTransitionListener> mPostponedTransactions;
 
+    // Saved FragmentManagerNonConfig during saveAllState() and cleared in noteStateNotSaved()
+    FragmentManagerNonConfig mSavedNonConfig;
+
     Runnable mExecCommit = new Runnable() {
         @Override
         public void run() {
@@ -921,12 +926,12 @@
     }
 
     @Override
-    public Collection<Fragment> getFragments() {
+    public List<Fragment> getFragments() {
         if (mAdded == null) {
             return Collections.EMPTY_LIST;
         }
         synchronized (mAdded) {
-            return (Collection<Fragment>) mAdded.clone();
+            return (List<Fragment>) mAdded.clone();
         }
     }
 
@@ -1246,8 +1251,13 @@
             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;
+            if (f.mState == Fragment.INITIALIZING && f.isInBackStack()) {
+                // Allow the fragment to be created so that it can be saved later.
+                newState = Fragment.CREATED;
+            } else {
+                // 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.
@@ -1369,7 +1379,7 @@
                                 }
                             }
                             f.mContainer = container;
-                            f.mView = f.performCreateView(f.onGetLayoutInflater(
+                            f.mView = f.performCreateView(f.performGetLayoutInflater(
                                     f.mSavedFragmentState), container, f.mSavedFragmentState);
                             if (f.mView != null) {
                                 f.mInnerView = f.mView;
@@ -1544,7 +1554,7 @@
 
     void ensureInflatedFragmentView(Fragment f) {
         if (f.mFromLayout && !f.mPerformedCreateView) {
-            f.mView = f.performCreateView(f.onGetLayoutInflater(
+            f.mView = f.performCreateView(f.performGetLayoutInflater(
                     f.mSavedFragmentState), null, f.mSavedFragmentState);
             if (f.mView != null) {
                 f.mInnerView = f.mView;
@@ -2514,6 +2524,9 @@
                 Animation animation = animatingAway.getAnimation();
                 if (animation != null) {
                     animation.cancel();
+                    // force-clear the animation, as Animation#cancel() doesn't work prior to N,
+                    // and will instead cause the animation to infinitely loop
+                    animatingAway.clearAnimation();
                 }
                 moveToState(fragment, stateAfterAnimating, 0, 0, false);
             }
@@ -2638,6 +2651,35 @@
     }
 
     FragmentManagerNonConfig retainNonConfig() {
+        setRetaining(mSavedNonConfig);
+        return mSavedNonConfig;
+    }
+
+    /**
+     * Recurse the FragmentManagerNonConfig fragments and set the mRetaining to true. This
+     * was previously done while saving the non-config state, but that has been moved to
+     * {@link #saveNonConfig()} called from {@link #saveAllState()}. If mRetaining is set too
+     * early, the fragment won't be destroyed when the FragmentManager is destroyed.
+     */
+    private static void setRetaining(FragmentManagerNonConfig nonConfig) {
+        if (nonConfig == null) {
+            return;
+        }
+        List<Fragment> fragments = nonConfig.getFragments();
+        if (fragments != null) {
+            for (Fragment fragment : fragments) {
+                fragment.mRetaining = true;
+            }
+        }
+        List<FragmentManagerNonConfig> children = nonConfig.getChildNonConfigs();
+        if (children != null) {
+            for (FragmentManagerNonConfig child : children) {
+                setRetaining(child);
+            }
+        }
+    }
+
+    void saveNonConfig() {
         ArrayList<Fragment> fragments = null;
         ArrayList<FragmentManagerNonConfig> childFragments = null;
         if (mActive != null) {
@@ -2649,13 +2691,13 @@
                             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();
+                        f.mChildFragmentManager.saveNonConfig();
+                        FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig;
                         if (child != null) {
                             if (childFragments == null) {
                                 childFragments = new ArrayList<FragmentManagerNonConfig>();
@@ -2674,9 +2716,10 @@
             }
         }
         if (fragments == null && childFragments == null) {
-            return null;
+            mSavedNonConfig = null;
+        } else {
+            mSavedNonConfig = new FragmentManagerNonConfig(fragments, childFragments);
         }
-        return new FragmentManagerNonConfig(fragments, childFragments);
     }
 
     void saveFragmentViewState(Fragment f) {
@@ -2737,6 +2780,7 @@
         execPendingActions();
 
         mStateSaved = true;
+        mSavedNonConfig = null;
 
         if (mActive == null || mActive.size() <= 0) {
             return null;
@@ -2837,6 +2881,7 @@
             fms.mPrimaryNavActiveIndex = mPrimaryNav.mIndex;
         }
         fms.mNextFragmentIndex = mNextFragmentIndex;
+        saveNonConfig();
         return fms;
     }
 
@@ -2992,41 +3037,39 @@
     }
 
     public void noteStateNotSaved() {
+        mSavedNonConfig = null;
         mStateSaved = false;
+        final int addedCount = mAdded == null ? 0 : mAdded.size();
+        for (int i = 0; i < addedCount; i++) {
+            Fragment fragment = mAdded.get(i);
+            if (fragment != null) {
+                fragment.noteStateNotSaved();
+            }
+        }
     }
 
     public void dispatchCreate() {
         mStateSaved = false;
-        mExecutingActions = true;
-        moveToState(Fragment.CREATED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.CREATED);
     }
 
     public void dispatchActivityCreated() {
         mStateSaved = false;
-        mExecutingActions = true;
-        moveToState(Fragment.ACTIVITY_CREATED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.ACTIVITY_CREATED);
     }
 
     public void dispatchStart() {
         mStateSaved = false;
-        mExecutingActions = true;
-        moveToState(Fragment.STARTED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.STARTED);
     }
 
     public void dispatchResume() {
         mStateSaved = false;
-        mExecutingActions = true;
-        moveToState(Fragment.RESUMED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.RESUMED);
     }
 
     public void dispatchPause() {
-        mExecutingActions = true;
-        moveToState(Fragment.STARTED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.STARTED);
     }
 
     public void dispatchStop() {
@@ -3035,34 +3078,36 @@
         // them.
         mStateSaved = true;
 
-        mExecutingActions = true;
-        moveToState(Fragment.STOPPED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.STOPPED);
     }
 
     public void dispatchReallyStop() {
-        mExecutingActions = true;
-        moveToState(Fragment.ACTIVITY_CREATED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.ACTIVITY_CREATED);
     }
 
     public void dispatchDestroyView() {
-        mExecutingActions = true;
-        moveToState(Fragment.CREATED, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.CREATED);
     }
 
     public void dispatchDestroy() {
         mDestroyed = true;
         execPendingActions();
-        mExecutingActions = true;
-        moveToState(Fragment.INITIALIZING, false);
-        mExecutingActions = false;
+        dispatchStateChange(Fragment.INITIALIZING);
         mHost = null;
         mContainer = null;
         mParent = null;
     }
 
+    private void dispatchStateChange(int nextState) {
+        try {
+            mExecutingActions = true;
+            moveToState(nextState, false);
+        } finally {
+            mExecutingActions = false;
+        }
+        execPendingActions();
+    }
+
     public void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode) {
         if (mAdded == null) {
             return;
diff --git a/fragment/api21/android/support/v4/app/FragmentTransitionCompat21.java b/fragment/java/android/support/v4/app/FragmentTransitionCompat21.java
similarity index 100%
rename from fragment/api21/android/support/v4/app/FragmentTransitionCompat21.java
rename to fragment/java/android/support/v4/app/FragmentTransitionCompat21.java
diff --git a/fragment/api21/android/support/v4/app/OneShotPreDrawListener.java b/fragment/java/android/support/v4/app/OneShotPreDrawListener.java
similarity index 100%
rename from fragment/api21/android/support/v4/app/OneShotPreDrawListener.java
rename to fragment/java/android/support/v4/app/OneShotPreDrawListener.java
diff --git a/fragment/tests/AndroidManifest.xml b/fragment/tests/AndroidManifest.xml
index fb45ecf..bd0a433 100644
--- a/fragment/tests/AndroidManifest.xml
+++ b/fragment/tests/AndroidManifest.xml
@@ -38,6 +38,11 @@
         <activity android:name="android.support.v4.app.test.FragmentResultActivity" />
 
         <activity android:name="android.support.v4.app.test.LoaderActivity" />
+
+        <activity android:name="android.support.v4.app.test.NewIntentActivity"
+                  android:launchMode="singleInstance" />
+
+        <activity android:name="android.support.v4.app.test.NonConfigOnStopActivity" />
     </application>
 
 </manifest>
diff --git a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
index dbcf6e5..f784d12 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -963,6 +963,104 @@
         assertTrue(foundFragment2);
     }
 
+    /**
+     * When a fragment has been optimized out, it state should still be saved during
+     * save and restore instance state.
+     */
+    @Test
+    @UiThreadTest
+    public void saveRemovedFragment() throws Throwable {
+        FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+        FragmentTestUtil.resume(mActivityRule, fc, null);
+        FragmentManager fm = fc.getSupportFragmentManager();
+
+        SaveStateFragment fragment1 = SaveStateFragment.create(1);
+        fm.beginTransaction()
+                .add(android.R.id.content, fragment1, "1")
+                .addToBackStack(null)
+                .commit();
+        SaveStateFragment fragment2 = SaveStateFragment.create(2);
+        fm.beginTransaction()
+                .replace(android.R.id.content, fragment2, "2")
+                .addToBackStack(null)
+                .commit();
+        fm.executePendingTransactions();
+
+        Pair<Parcelable, FragmentManagerNonConfig> savedState =
+                FragmentTestUtil.destroy(mActivityRule, fc);
+
+        fc = FragmentTestUtil.createController(mActivityRule);
+        FragmentTestUtil.resume(mActivityRule, fc, savedState);
+        fm = fc.getSupportFragmentManager();
+        fragment2 = (SaveStateFragment) fm.findFragmentByTag("2");
+        assertNotNull(fragment2);
+        assertEquals(2, fragment2.getValue());
+        fm.popBackStackImmediate();
+        fragment1 = (SaveStateFragment) fm.findFragmentByTag("1");
+        assertNotNull(fragment1);
+        assertEquals(1, fragment1.getValue());
+    }
+
+    /**
+     * When there are no retained instance fragments, the FragmentManagerNonConfig should be
+     * null
+     */
+    @Test
+    @UiThreadTest
+    public void nullNonConfig() throws Throwable {
+        FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+        FragmentTestUtil.resume(mActivityRule, fc, null);
+        FragmentManager fm = fc.getSupportFragmentManager();
+
+        Fragment fragment1 = new StrictFragment();
+        fm.beginTransaction()
+                .add(fragment1, "1")
+                .addToBackStack(null)
+                .commit();
+        fm.executePendingTransactions();
+        Pair<Parcelable, FragmentManagerNonConfig> savedState =
+                FragmentTestUtil.destroy(mActivityRule, fc);
+        assertNull(savedState.second);
+    }
+
+    /**
+     * When the FragmentManager state changes, the pending transactions should execute.
+     */
+    @Test
+    @UiThreadTest
+    public void runTransactionsOnChange() throws Throwable {
+        FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+        FragmentTestUtil.resume(mActivityRule, fc, null);
+        FragmentManager fm = fc.getSupportFragmentManager();
+
+        RemoveHelloInOnResume fragment1 = new RemoveHelloInOnResume();
+        StrictFragment fragment2 = new StrictFragment();
+        fm.beginTransaction()
+                .add(fragment1, "1")
+                .setAllowOptimization(false)
+                .commit();
+        fm.beginTransaction()
+                .add(fragment2, "Hello")
+                .setAllowOptimization(false)
+                .commit();
+        fm.executePendingTransactions();
+
+        assertEquals(2, fm.getFragments().size());
+        assertTrue(fm.getFragments().contains(fragment1));
+        assertTrue(fm.getFragments().contains(fragment2));
+
+        Pair<Parcelable, FragmentManagerNonConfig> savedState =
+                FragmentTestUtil.destroy(mActivityRule, fc);
+        fc = FragmentTestUtil.createController(mActivityRule);
+        FragmentTestUtil.resume(mActivityRule, fc, savedState);
+        fm = fc.getSupportFragmentManager();
+
+        assertEquals(1, fm.getFragments().size());
+        for (Fragment fragment : fm.getFragments()) {
+            assertTrue(fragment instanceof RemoveHelloInOnResume);
+        }
+    }
+
     private void assertAnimationsMatch(FragmentManager fm, int enter, int exit, int popEnter,
             int popExit) {
         FragmentManagerImpl fmImpl = (FragmentManagerImpl) fm;
@@ -1256,4 +1354,44 @@
                     ((TargetFragment) target).calledCreate);
         }
     }
+
+    public static class SaveStateFragment extends Fragment {
+        private static final String VALUE_KEY = "SaveStateFragment.mValue";
+        private int mValue;
+
+        public static SaveStateFragment create(int value) {
+            SaveStateFragment saveStateFragment = new SaveStateFragment();
+            saveStateFragment.mValue = value;
+            return saveStateFragment;
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putInt(VALUE_KEY, mValue);
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (savedInstanceState != null) {
+                mValue = savedInstanceState.getInt(VALUE_KEY, mValue);
+            }
+        }
+
+        public int getValue() {
+            return mValue;
+        }
+    }
+
+    public static class RemoveHelloInOnResume extends Fragment {
+        @Override
+        public void onResume() {
+            super.onResume();
+            Fragment fragment = getFragmentManager().findFragmentByTag("Hello");
+            if (fragment != null) {
+                getFragmentManager().beginTransaction().remove(fragment).commit();
+            }
+        }
+    }
 }
diff --git a/fragment/tests/java/android/support/v4/app/FragmentManagerNonConfigTest.java b/fragment/tests/java/android/support/v4/app/FragmentManagerNonConfigTest.java
new file mode 100644
index 0000000..eeae2b4
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentManagerNonConfigTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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 static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.test.NonConfigOnStopActivity;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class FragmentManagerNonConfigTest {
+
+    @Rule
+    public ActivityTestRule<NonConfigOnStopActivity> mActivityRule =
+            new ActivityTestRule<>(NonConfigOnStopActivity.class);
+
+    /**
+     * When a fragment is added during onStop(), it shouldn't show up in non-config
+     * state when restored.
+     */
+    @Test
+    public void nonConfigStop() throws Throwable {
+        FragmentActivity activity = FragmentTestUtil.recreateActivity(mActivityRule,
+                mActivityRule.getActivity());
+
+        // A fragment was added in onStop(), but we shouldn't see it here...
+        assertTrue(activity.getSupportFragmentManager().getFragments().isEmpty());
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java b/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
index 13901c4..c2fb8bc 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
@@ -190,7 +190,7 @@
         assertEquals(1, fragment1.onHideCount);
         assertEquals(0, fragment1.onShowCount);
         assertEquals(0, fragment1.onDetachCount);
-        assertEquals(0, fragment1.onAttachCount);
+        assertEquals(1, fragment1.onAttachCount);
 
         FragmentTestUtil.popBackStackImmediate(mActivityRule, id[0],
                 FragmentManager.POP_BACK_STACK_INCLUSIVE);
@@ -198,8 +198,8 @@
         assertEquals(0, fragment1.onCreateViewCount);
         assertEquals(1, fragment1.onHideCount);
         assertEquals(1, fragment1.onShowCount);
-        assertEquals(0, fragment1.onDetachCount);
-        assertEquals(0, fragment1.onAttachCount);
+        assertEquals(1, fragment1.onDetachCount);
+        assertEquals(1, fragment1.onAttachCount);
     }
 
     // Ensure that removing and adding the same view results in no operation
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTestUtil.java b/fragment/tests/java/android/support/v4/app/FragmentTestUtil.java
index 604701f..1da1af6 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentTestUtil.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentTestUtil.java
@@ -16,6 +16,7 @@
 package android.support.v4.app;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -27,12 +28,15 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
 import android.support.v4.app.test.FragmentTestActivity;
+import android.support.v4.app.test.RecreatedActivity;
 import android.util.Pair;
 import android.view.ViewGroup;
 import android.view.animation.Animation;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 public class FragmentTestUtil {
     private static final Runnable DO_NOTHING = new Runnable() {
@@ -243,4 +247,32 @@
             }
         }
     }
+
+    /**
+     * Restarts the RecreatedActivity and waits for the new activity to be resumed.
+     *
+     * @return The newly-restarted Activity
+     */
+    public static <T extends RecreatedActivity> T recreateActivity(
+            ActivityTestRule<? extends RecreatedActivity> rule, final T activity)
+            throws InterruptedException {
+        // Now switch the orientation
+        RecreatedActivity.sResumed = new CountDownLatch(1);
+        RecreatedActivity.sDestroyed = new CountDownLatch(1);
+
+        runOnUiThreadRethrow(rule, new Runnable() {
+            @Override
+            public void run() {
+                activity.recreate();
+            }
+        });
+        assertTrue(RecreatedActivity.sResumed.await(1, TimeUnit.SECONDS));
+        assertTrue(RecreatedActivity.sDestroyed.await(1, TimeUnit.SECONDS));
+        T newActivity = (T) RecreatedActivity.sActivity;
+
+        waitForExecution(rule);
+
+        RecreatedActivity.clearState();
+        return newActivity;
+    }
 }
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
index 6a4fb91..13130b7 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
@@ -15,13 +15,20 @@
  */
 package android.support.v4.app;
 
+import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertFalse;
 import static junit.framework.TestCase.assertTrue;
-import static junit.framework.TestCase.assertEquals;
 
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import android.app.Activity;
 import android.app.Instrumentation;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.SystemClock;
+import android.support.annotation.Nullable;
 import android.support.fragment.test.R;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.annotation.UiThreadTest;
@@ -29,6 +36,10 @@
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v4.app.test.FragmentTestActivity;
+import android.support.v4.app.test.NewIntentActivity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -36,6 +47,7 @@
 import org.junit.runner.RunWith;
 
 import java.util.Collection;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Tests usage of the {@link FragmentTransaction} class.
@@ -145,6 +157,54 @@
     }
 
     @Test
+    public void testGetLayoutInflater() throws Throwable {
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final OnGetLayoutInflaterFragment fragment1 = new OnGetLayoutInflaterFragment();
+                assertEquals(0, fragment1.onGetLayoutInflaterCalls);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .add(R.id.content, fragment1)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+                assertEquals(1, fragment1.onGetLayoutInflaterCalls);
+                assertEquals(fragment1.layoutInflater, fragment1.getLayoutInflater());
+                // getLayoutInflater() didn't force onGetLayoutInflater()
+                assertEquals(1, fragment1.onGetLayoutInflaterCalls);
+
+                LayoutInflater layoutInflater = fragment1.layoutInflater;
+                // Replacing fragment1 won't detach it, so the value won't be cleared
+                final OnGetLayoutInflaterFragment fragment2 = new OnGetLayoutInflaterFragment();
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, fragment2)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+
+                assertSame(layoutInflater, fragment1.getLayoutInflater());
+                assertEquals(1, fragment1.onGetLayoutInflaterCalls);
+
+                // Popping it should cause onCreateView again, so a new LayoutInflater...
+                mActivity.getSupportFragmentManager().popBackStackImmediate();
+                assertNotSame(layoutInflater, fragment1.getLayoutInflater());
+                assertEquals(2, fragment1.onGetLayoutInflaterCalls);
+                layoutInflater = fragment1.layoutInflater;
+                assertSame(layoutInflater, fragment1.getLayoutInflater());
+
+                // Popping it should detach it, clearing the cached value again
+                mActivity.getSupportFragmentManager().popBackStackImmediate();
+
+                // once it is detached, the getLayoutInflater() will default to throw
+                // an exception, but we've made it return null instead.
+                assertEquals(2, fragment1.onGetLayoutInflaterCalls);
+                assertNull(fragment1.getLayoutInflater());
+                assertEquals(3, fragment1.onGetLayoutInflaterCalls);
+            }
+        });
+    }
+
+    @Test
     public void testAddTransactionWithNonStaticFragment() throws Throwable {
         final Fragment fragment = new NonStaticFragment();
         mActivityRule.runOnUiThread(new Runnable() {
@@ -333,6 +393,36 @@
         });
     }
 
+    /**
+     * onNewIntent() should note that the state is not saved so that child fragment
+     * managers can execute transactions.
+     */
+    @Test
+    public void newIntentUnlocks() throws Throwable {
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        Intent intent1 = new Intent(mActivity, NewIntentActivity.class)
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        NewIntentActivity newIntentActivity =
+                (NewIntentActivity) instrumentation.startActivitySync(intent1);
+        FragmentTestUtil.waitForExecution(mActivityRule);
+
+        Intent intent2 = new Intent(mActivity, FragmentTestActivity.class);
+        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        Activity coveringActivity = instrumentation.startActivitySync(intent2);
+        FragmentTestUtil.waitForExecution(mActivityRule);
+
+        Intent intent3 = new Intent(mActivity, NewIntentActivity.class)
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mActivity.startActivity(intent3);
+        assertTrue(newIntentActivity.newIntent.await(1, TimeUnit.SECONDS));
+        FragmentTestUtil.waitForExecution(mActivityRule);
+
+        for (Fragment fragment : newIntentActivity.getSupportFragmentManager().getFragments()) {
+            // There really should only be one fragment in newIntentActivity.
+            assertEquals(1, fragment.getChildFragmentManager().getFragments().size());
+        }
+    }
+
     private void getFragmentsUntilSize(int expectedSize) {
         final long endTime = SystemClock.uptimeMillis() + 3000;
 
@@ -348,4 +438,27 @@
     static class PackagePrivateFragment extends Fragment {}
 
     private class NonStaticFragment extends Fragment {}
+
+    public static class OnGetLayoutInflaterFragment extends Fragment {
+        public int onGetLayoutInflaterCalls = 0;
+        public LayoutInflater layoutInflater;
+
+        @Override
+        public LayoutInflater onGetLayoutInflater(Bundle savedInstanceState) {
+            onGetLayoutInflaterCalls++;
+            try {
+                layoutInflater = super.onGetLayoutInflater(savedInstanceState);
+            } catch (Exception e) {
+                return null;
+            }
+            return layoutInflater;
+        }
+
+        @Nullable
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.fragment_a, container, false);
+        }
+    }
 }
diff --git a/fragment/tests/java/android/support/v4/app/LoaderTest.java b/fragment/tests/java/android/support/v4/app/LoaderTest.java
index 9ae0723..b581fe7 100644
--- a/fragment/tests/java/android/support/v4/app/LoaderTest.java
+++ b/fragment/tests/java/android/support/v4/app/LoaderTest.java
@@ -22,11 +22,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import android.app.Instrumentation;
 import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.support.annotation.Nullable;
@@ -38,9 +34,6 @@
 import android.support.v4.content.AsyncTaskLoader;
 import android.support.v4.content.Loader;
 
-import junit.framework.Assert;
-
-import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,37 +51,18 @@
     public ActivityTestRule<LoaderActivity> mActivityRule =
             new ActivityTestRule(LoaderActivity.class);
 
-    @After
-    public void resetActivity() {
-        final LoaderActivity activity = LoaderActivity.sActivity;
-        final int unspecifiedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-        if (activity != null && activity.getRequestedOrientation() != unspecifiedOrientation) {
-            LoaderActivity.sResumed = new CountDownLatch(1);
-            activity.setRequestedOrientation(unspecifiedOrientation);
-            // Wait for the orientation change to settle, if there was a change
-            try {
-                LoaderActivity.sResumed.await(1, TimeUnit.SECONDS);
-            } catch (InterruptedException e) {
-                // I guess there wasn't a change in orientation after all
-            }
-        }
-        LoaderActivity.clearState();
-    }
-
     /**
      * Test to ensure that there is no Activity leak due to Loader
      */
     @Test
     public void testLeak() throws Throwable {
-        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-        Intent intent = new Intent(mActivityRule.getActivity(), LoaderActivity.class);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        LoaderActivity.sResumed = new CountDownLatch(1);
-        instrumentation.startActivitySync(intent);
-        assertTrue(LoaderActivity.sResumed.await(1, TimeUnit.SECONDS));
+        // Restart the activity because mActivityRule keeps a strong reference to the
+        // old activity.
+        LoaderActivity activity = FragmentTestUtil.recreateActivity(mActivityRule,
+                mActivityRule.getActivity());
 
         LoaderFragment fragment = new LoaderFragment();
-        FragmentManager fm = LoaderActivity.sActivity.getSupportFragmentManager();
+        FragmentManager fm = activity.getSupportFragmentManager();
 
         fm.beginTransaction()
                 .add(fragment, "1")
@@ -102,12 +76,11 @@
                 .commit();
 
         FragmentTestUtil.executePendingTransactions(mActivityRule, fm);
+        fm = null; // clear it so that it can be released
 
         WeakReference<LoaderActivity> weakActivity = new WeakReference(LoaderActivity.sActivity);
 
-        if (!switchOrientation()) {
-            return; // can't switch orientation for square screens
-        }
+        activity = FragmentTestUtil.recreateActivity(mActivityRule, activity);
 
         // Wait for everything to settle. We have to make sure that the old Activity
         // is ready to be collected.
@@ -128,12 +101,11 @@
 
         assertEquals("Loaded!", activity.textView.getText().toString());
 
-        if (!switchOrientation()) {
-            return; // can't switch orientation for square screens
-        }
+        activity = FragmentTestUtil.recreateActivity(mActivityRule, activity);
+
+        FragmentTestUtil.waitForExecution(mActivityRule);
 
         // After orientation change, the text should still be loaded properly
-        activity = LoaderActivity.sActivity;
         assertEquals("Loaded!", activity.textView.getText().toString());
     }
 
@@ -220,37 +192,6 @@
         assertEquals("Second Value", activity.textViewB.getText().toString());
     }
 
-    private boolean switchOrientation() throws InterruptedException {
-        LoaderActivity activity = LoaderActivity.sActivity;
-
-        int currentOrientation = activity.getResources().getConfiguration().orientation;
-
-        int nextOrientation;
-        int expectedOrientation;
-        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
-            nextOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
-            expectedOrientation = Configuration.ORIENTATION_PORTRAIT;
-        } else if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
-            nextOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
-            expectedOrientation = Configuration.ORIENTATION_LANDSCAPE;
-        } else {
-            return false; // Don't know what to do with square or unknown orientations
-        }
-
-        // Now switch the orientation
-        LoaderActivity.sResumed = new CountDownLatch(1);
-        LoaderActivity.sDestroyed = new CountDownLatch(1);
-
-        activity.setRequestedOrientation(nextOrientation);
-        assertTrue(LoaderActivity.sResumed.await(1, TimeUnit.SECONDS));
-        assertTrue(LoaderActivity.sDestroyed.await(1, TimeUnit.SECONDS));
-
-        int switchedOrientation =
-                LoaderActivity.sActivity.getResources().getConfiguration().orientation;
-        Assert.assertEquals(expectedOrientation, switchedOrientation);
-        return true;
-    }
-
 
     public static class LoaderFragment extends Fragment {
         private static final int LOADER_ID = 1;
diff --git a/fragment/tests/java/android/support/v4/app/test/LoaderActivity.java b/fragment/tests/java/android/support/v4/app/test/LoaderActivity.java
index 77a71f7..8a051f4 100644
--- a/fragment/tests/java/android/support/v4/app/test/LoaderActivity.java
+++ b/fragment/tests/java/android/support/v4/app/test/LoaderActivity.java
@@ -20,37 +20,22 @@
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.fragment.test.R;
-import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.AsyncTaskLoader;
 import android.support.v4.content.Loader;
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import java.util.concurrent.CountDownLatch;
-
-public class LoaderActivity extends FragmentActivity {
-    // These must be cleared after each test using clearState()
-    public static LoaderActivity sActivity;
-    public static CountDownLatch sResumed;
-    public static CountDownLatch sDestroyed;
-
+public class LoaderActivity extends RecreatedActivity {
     public TextView textView;
     public TextView textViewB;
 
-    public static void clearState() {
-        sActivity = null;
-        sResumed = null;
-        sDestroyed = null;
-    }
-
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        sActivity = this;
 
         setContentView(R.layout.fragment_a);
-        textView = (TextView) findViewById(R.id.textA);
+        textView = findViewById(R.id.textA);
         ViewGroup container = (ViewGroup) textView.getParent();
         textViewB = new TextView(this);
         textViewB.setId(R.id.textB);
@@ -61,17 +46,6 @@
     protected void onResume() {
         super.onResume();
         getSupportLoaderManager().initLoader(0, null, new TextLoaderCallback());
-        if (sResumed != null) {
-            sResumed.countDown();
-        }
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (sDestroyed != null) {
-            sDestroyed.countDown();
-        }
     }
 
     class TextLoaderCallback implements LoaderManager.LoaderCallbacks<String> {
diff --git a/fragment/tests/java/android/support/v4/app/test/NewIntentActivity.java b/fragment/tests/java/android/support/v4/app/test/NewIntentActivity.java
new file mode 100644
index 0000000..371af21
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/test/NewIntentActivity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+
+import java.util.concurrent.CountDownLatch;
+
+public class NewIntentActivity extends FragmentActivity {
+    public final CountDownLatch newIntent = new CountDownLatch(1);
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState == null) {
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .add(new FooFragment(), "derp")
+                    .commitNow();
+        }
+    }
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        // Test a child fragment transaction -
+        getSupportFragmentManager()
+                .findFragmentByTag("derp")
+                .getChildFragmentManager()
+                .beginTransaction()
+                .add(new FooFragment(), "derp4")
+                .commitNow();
+        newIntent.countDown();
+    }
+
+    public static class FooFragment extends Fragment {
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/test/NonConfigOnStopActivity.java b/fragment/tests/java/android/support/v4/app/test/NonConfigOnStopActivity.java
new file mode 100644
index 0000000..fc03b50
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/test/NonConfigOnStopActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.support.v4.app.Fragment;
+
+public class NonConfigOnStopActivity extends RecreatedActivity {
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+        getSupportFragmentManager()
+                .beginTransaction()
+                .add(new RetainedFragment(), "1")
+                .commitNowAllowingStateLoss();
+    }
+
+    public static class RetainedFragment extends Fragment {
+        public RetainedFragment() {
+            setRetainInstance(true);
+        }
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/test/RecreatedActivity.java b/fragment/tests/java/android/support/v4/app/test/RecreatedActivity.java
new file mode 100644
index 0000000..c298a88
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/test/RecreatedActivity.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+
+import java.util.concurrent.CountDownLatch;
+
+public class RecreatedActivity extends FragmentActivity {
+    // These must be cleared after each test using clearState()
+    public static RecreatedActivity sActivity;
+    public static CountDownLatch sResumed;
+    public static CountDownLatch sDestroyed;
+
+    public static void clearState() {
+        sActivity = null;
+        sResumed = null;
+        sDestroyed = null;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        sActivity = this;
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (sResumed != null) {
+            sResumed.countDown();
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (sDestroyed != null) {
+            sDestroyed.countDown();
+        }
+    }
+}
diff --git a/gradle.properties b/gradle.properties
index fb870a9..e4443ce 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -2,3 +2,4 @@
 org.gradle.daemon=true
 org.gradle.configureondemand=true
 org.gradle.parallel=true
+android.enableNewResourceProcessing=false
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f4eafe0..ea0d01f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-3.4.1-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-3.5-bin.zip
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 dbeb0ec..cff61bc 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -19,7 +19,6 @@
 import android.animation.AnimatorSet;
 import android.animation.ArgbEvaluator;
 import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
@@ -36,6 +35,7 @@
 import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
 import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v4.graphics.drawable.DrawableCompat;
@@ -131,16 +131,11 @@
  * <li>Path Morphing (PathType evaluator). This is used for morphing one path into another.</li>
  * <li>Path Interpolation. This is used to defined a flexible interpolator (represented as a path)
  * instead of the system defined ones like LinearInterpolator.</li>
- * </ul>
- * <p/>
- * But not support this one feature yet:
- * <ul>
  * <li>Animating 2 values in one ObjectAnimator according to one path's X value and Y value. One
- * usage is moving one object in both X and Y dimensions along an path.</li> *
+ * usage is moving one object in both X and Y dimensions along an path.</li>
  * </ul>
  */
 
-@SuppressLint("NewApi")
 public class AnimatedVectorDrawableCompat extends VectorDrawableCommon
         implements Animatable2Compat {
     private static final String LOGTAG = "AnimatedVDCompat";
@@ -221,6 +216,7 @@
         }
         Resources resources = context.getResources();
         try {
+            //noinspection AndroidLintResourceType - Parse drawable as XML.
             final XmlPullParser parser = resources.getXml(resId);
             final AttributeSet attrs = Xml.asAttributeSet(parser);
             int type;
@@ -262,7 +258,7 @@
      */
     @Override
     public ConstantState getConstantState() {
-        if (mDelegateDrawable != null) {
+        if (mDelegateDrawable != null && Build.VERSION.SDK_INT >= 24) {
             return new AnimatedVectorDrawableDelegateState(mDelegateDrawable.getConstantState());
         }
         // We can't support constant state in older platform.
@@ -424,7 +420,7 @@
     @Override
     public void setAutoMirrored(boolean mirrored) {
         if (mDelegateDrawable != null) {
-            mDelegateDrawable.setAutoMirrored(mirrored);
+            DrawableCompat.setAutoMirrored(mDelegateDrawable, mirrored);
             return;
         }
         mAnimatedVectorState.mVectorDrawable.setAutoMirrored(mirrored);
@@ -531,6 +527,7 @@
      * Instead of creating a VectorDrawable, create a VectorDrawableCompat instance which contains
      * a delegated VectorDrawable instance.
      */
+    @RequiresApi(24)
     private static class AnimatedVectorDrawableDelegateState extends ConstantState {
         private final ConstantState mDelegateState;
 
@@ -687,6 +684,7 @@
     @Override
     public boolean isRunning() {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             return ((AnimatedVectorDrawable) mDelegateDrawable).isRunning();
         }
         return mAnimatedVectorState.mAnimatorSet.isRunning();
@@ -695,6 +693,7 @@
     @Override
     public void start() {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             ((AnimatedVectorDrawable) mDelegateDrawable).start();
             return;
         }
@@ -710,6 +709,7 @@
     @Override
     public void stop() {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             ((AnimatedVectorDrawable) mDelegateDrawable).stop();
             return;
         }
@@ -737,6 +737,7 @@
      * A helper function to unregister the Animatable2Compat callback from the platform's
      * Animatable2 callback, while keeping the internal array of callback up to date.
      */
+    @RequiresApi(23)
     private static boolean unregisterPlatformCallback(AnimatedVectorDrawable dr,
             Animatable2Compat.AnimationCallback callback) {
         return dr.unregisterAnimationCallback(callback.getPlatformCallback());
@@ -746,6 +747,7 @@
     public void registerAnimationCallback(@NonNull Animatable2Compat.AnimationCallback
             callback) {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             registerPlatformCallback((AnimatedVectorDrawable) mDelegateDrawable, callback);
             return;
         }
@@ -798,6 +800,7 @@
      * A helper function to register the Animatable2Compat callback on the platform's Animatable2
      * callback.
      */
+    @RequiresApi(23)
     private static void registerPlatformCallback(@NonNull AnimatedVectorDrawable avd,
             @NonNull final Animatable2Compat.AnimationCallback callback) {
         avd.registerAnimationCallback(callback.getPlatformCallback());
@@ -817,6 +820,7 @@
     public boolean unregisterAnimationCallback(
             @NonNull Animatable2Compat.AnimationCallback callback) {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             unregisterPlatformCallback((AnimatedVectorDrawable) mDelegateDrawable, callback);
         }
 
@@ -836,6 +840,7 @@
     @Override
     public void clearAnimationCallbacks() {
         if (mDelegateDrawable != null) {
+            //noinspection AndroidLintNewApi - Implicit when delegate is non-null.
             ((AnimatedVectorDrawable) mDelegateDrawable).clearAnimationCallbacks();
             return;
         }
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java
index 55aa996..cfededb 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java
@@ -18,6 +18,8 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import static java.lang.Math.min;
+
 import android.animation.Animator;
 import android.animation.AnimatorInflater;
 import android.animation.AnimatorSet;
@@ -32,6 +34,8 @@
 import android.content.res.Resources.Theme;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
+import android.graphics.Path;
+import android.graphics.PathMeasure;
 import android.os.Build;
 import android.support.annotation.AnimatorRes;
 import android.support.annotation.RestrictTo;
@@ -67,8 +71,7 @@
      * These flags are used when parsing AnimatorSet objects
      */
     private static final int TOGETHER = 0;
-    private static final int SEQUENTIALLY = 1;
-
+    private static final int MAX_NUM_POINTS = 100;
     /**
      * Enum values used in XML attributes to indicate the value for mValueType
      */
@@ -80,9 +83,6 @@
 
     private static final boolean DBG_ANIMATOR_INFLATER = false;
 
-    // used to calculate changing configs for resource references
-    private static final TypedValue sTmpTypedValue = new TypedValue();
-
     /**
      * Loads an {@link Animator} object from a context
      *
@@ -362,8 +362,6 @@
             if (pvh != null) {
                 anim.setValues(pvh);
             }
-        } else {
-            throw new IllegalArgumentException("no valueFrom or no valueTo");
         }
         anim.setDuration(duration);
         anim.setStartDelay(startDelay);
@@ -382,7 +380,6 @@
     /**
      * Setup ObjectAnimator's property or values from pathData.
      *
-     * @param getFloats           True if the value type is float.
      * @param anim                The target Animator which will be updated.
      * @param arrayObjectAnimator TypedArray for the ObjectAnimator.
      * @param pixelSize           The relative pixel size, used to calculate the
@@ -402,7 +399,24 @@
         // 3) PathInterpolator can also define a path (in pathData) for its interpolation curve.
         // Here we are dealing with case 2:
         if (pathData != null) {
-            Log.e(TAG, "We don't support moving along path yet");
+            String propertyXName = TypedArrayUtils.getNamedString(arrayObjectAnimator, parser,
+                    "propertyXName", AndroidResources.STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_X_NAME);
+            String propertyYName = TypedArrayUtils.getNamedString(arrayObjectAnimator, parser,
+                    "propertyYName", AndroidResources.STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_Y_NAME);
+
+
+            if (valueType == VALUE_TYPE_PATH || valueType == VALUE_TYPE_UNDEFINED) {
+                // When pathData is defined, we are in case #2 mentioned above. ValueType can only
+                // be float type, or int type. Otherwise we fallback to default type.
+                valueType = VALUE_TYPE_FLOAT;
+            }
+            if (propertyXName == null && propertyYName == null) {
+                throw new InflateException(arrayObjectAnimator.getPositionDescription()
+                        + " propertyXName or propertyYName is needed for PathData");
+            } else {
+                Path path = PathParser.createPathFromPathData(pathData);
+                setupPathMotion(path, oa,  0.5f * pixelSize, propertyXName, propertyYName);
+            }
         } else {
             String propertyName =
                     TypedArrayUtils.getNamedString(arrayObjectAnimator, parser, "propertyName",
@@ -415,6 +429,71 @@
 
     }
 
+    private static void setupPathMotion(Path path, ObjectAnimator oa, float precision,
+            String propertyXName, String propertyYName) {
+        // Measure the total length the whole path.
+        final PathMeasure measureForTotalLength = new PathMeasure(path, false);
+        float totalLength = 0;
+        // The sum of the previous contour plus the current one. Using the sum here b/c we want to
+        // directly substract from it later.
+        ArrayList<Float> contourLengths = new ArrayList<>();
+        contourLengths.add(0f);
+        do {
+            final float pathLength = measureForTotalLength.getLength();
+            totalLength += pathLength;
+            contourLengths.add(totalLength);
+
+        } while (measureForTotalLength.nextContour());
+
+        // Now determine how many sample points we need, and the step for next sample.
+        final PathMeasure pathMeasure = new PathMeasure(path, false);
+
+        final int numPoints = min(MAX_NUM_POINTS, (int) (totalLength / precision) + 1);
+
+        float[] mX = new float[numPoints];
+        float[] mY = new float[numPoints];
+        final float[] position = new float[2];
+
+        int contourIndex = 0;
+        float step = totalLength / (numPoints - 1);
+        float currentDistance = 0;
+
+        // For each sample point, determine whether we need to move on to next contour.
+        // After we find the right contour, then sample it using the current distance value minus
+        // the previously sampled contours' total length.
+        for (int i = 0; i < numPoints; ++i) {
+            pathMeasure.getPosTan(currentDistance, position, null);
+            pathMeasure.getPosTan(currentDistance, position, null);
+
+            mX[i] = position[0];
+            mY[i] = position[1];
+            currentDistance += step;
+            if ((contourIndex + 1) < contourLengths.size()
+                    && currentDistance > contourLengths.get(contourIndex + 1)) {
+                currentDistance -= contourLengths.get(contourIndex + 1);
+                contourIndex++;
+                pathMeasure.nextContour();
+            }
+        }
+
+        // Given the x and y value of the sample points, setup the ObjectAnimator properly.
+        PropertyValuesHolder x = null;
+        PropertyValuesHolder y = null;
+        if (propertyXName != null) {
+            x = PropertyValuesHolder.ofFloat(propertyXName, mX);
+        }
+        if (propertyYName != null) {
+            y = PropertyValuesHolder.ofFloat(propertyYName, mY);
+        }
+        if (x == null) {
+            oa.setValues(y);
+        } else if (y == null) {
+            oa.setValues(x);
+        } else {
+            oa.setValues(x, y);
+        }
+    }
+
     private static Animator createAnimatorFromXml(Context context, Resources res, Theme theme,
             XmlPullParser parser,
             float pixelSize)
diff --git a/graphics/drawable/animated/tests/res/anim/path_motion_object.xml b/graphics/drawable/animated/tests/res/anim/path_motion_object.xml
new file mode 100644
index 0000000..43305af
--- /dev/null
+++ b/graphics/drawable/animated/tests/res/anim/path_motion_object.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="300"
+    android:propertyXName="translateX"
+    android:propertyYName="translateY"
+    android:pathData="M0 0 M 18 18 M 0 0 m -35, 0  a 35,35 0 1,0 70,0  a 35,35 0 1,0 -70,0  m 70, 0 a 35,35 0 1,0 -70,0  a 35,35 0 1,0 70,0"/>
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml b/graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml
new file mode 100644
index 0000000..4ebd613
--- /dev/null
+++ b/graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml
@@ -0,0 +1,23 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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/rect">
+
+    <target
+            android:name="rectGroup"
+            android:animation="@anim/path_motion_object"/>
+</animated-vector>
\ No newline at end of file
diff --git a/graphics/drawable/animated/tests/res/drawable/rect.xml b/graphics/drawable/animated/tests/res/drawable/rect.xml
index 5b162f5..e7998be 100644
--- a/graphics/drawable/animated/tests/res/drawable/rect.xml
+++ b/graphics/drawable/animated/tests/res/drawable/rect.xml
@@ -19,16 +19,11 @@
         android:viewportHeight="24.0"
         android:viewportWidth="24.0">
     <group
-            android:name="rectGroup"
-            android:pivotX="12"
-            android:pivotY="12"
-            android:rotation="0">
+        android:name="rectGroup">
         <path
-                android:name="rectBody"
-                android:fillColor="#ff0000"
-                android:pathData="M0,0L24,0L24,24L0,24z" />
+            android:name="rectBody"
+            android:fillColor="#ff0000"
+            android:pathData="M0,0L24,0L24,24L0,24z"/>
 
     </group>
-
-
 </vector>
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
new file mode 100644
index 0000000..6bae146
--- /dev/null
+++ b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.graphics.drawable.tests;
+
+import static android.support.graphics.drawable.tests.DrawableUtils.saveVectorDrawableIntoPNG;
+
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.support.graphics.drawable.Animatable2Compat.AnimationCallback;
+import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
+import android.support.graphics.drawable.animated.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+@MediumTest
+@RunWith(Parameterized.class)
+public class AnimatedVectorDrawableParameterizedTest {
+    @Rule public final ActivityTestRule<DrawableStubActivity> mActivityTestRule =
+            new ActivityTestRule<>(DrawableStubActivity.class);;
+
+    private static final int IMAGE_WIDTH = 64;
+    private static final int IMAGE_HEIGHT = 64;
+    private static final boolean DBG_DUMP_PNG = false;
+
+    private Context mContext;
+    private Resources mResources;
+    private int mResId;
+    private int mStartExpected;
+    private int mEndExpected;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][]{
+                { R.drawable.animation_path_morphing_rect, 0xffff0000, 0x0},
+                { R.drawable.animation_path_motion_rect, 0xffff0000, 0x0},
+        });
+    }
+
+    public AnimatedVectorDrawableParameterizedTest(final int resId, int startExpected,
+            int endExpected) throws Throwable {
+        mResId = resId;
+        mStartExpected = startExpected;
+        mEndExpected = endExpected;
+    }
+
+    /**
+     * Render AVD with path morphing, make sure the bitmap is different when it render at the start
+     * and the end.
+     *
+     * @throws Exception for time out or I/O problem while dumping debug images.
+     */
+    @Test
+    public void testPathMorphing() throws Exception {
+        final Object lock = new Object();
+        final Bitmap bitmap = Bitmap.createBitmap(IMAGE_WIDTH, IMAGE_WIDTH,
+                Bitmap.Config.ARGB_8888);
+        final Canvas c = new Canvas(bitmap);
+
+        final AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mContext,
+                mResId);
+        avd.setBounds(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+
+        bitmap.eraseColor(0);
+        avd.draw(c);
+        int centerColor = bitmap.getPixel(IMAGE_WIDTH / 2 , IMAGE_WIDTH / 2);
+        assertTrue(centerColor == mStartExpected);
+
+        if (DBG_DUMP_PNG) {
+            saveVectorDrawableIntoPNG(mResources, bitmap, -1, "start");
+        }
+
+        avd.registerAnimationCallback(new AnimationCallback() {
+            @Override
+            public void onAnimationStart(Drawable drawable) {
+                // Nothing to do.
+            }
+
+            @Override
+            public void onAnimationEnd(Drawable drawable) {
+                bitmap.eraseColor(0);
+                drawable.draw(c);
+                int centerColor = bitmap.getPixel(IMAGE_WIDTH / 2 , IMAGE_WIDTH / 2);
+                assertTrue(centerColor == mEndExpected);
+
+                synchronized (lock) {
+                    lock.notify();
+                }
+            }
+        });
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                avd.start();
+            }
+        });
+
+        synchronized (lock) {
+            lock.wait(1000);
+        }
+
+        if (DBG_DUMP_PNG) {
+            saveVectorDrawableIntoPNG(mResources, bitmap, -1, "ended");
+        }
+    }
+
+    @Before
+    public void setup() throws Exception {
+        mContext = mActivityTestRule.getActivity();
+        mResources = mContext.getResources();
+    }
+}
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
index b598f23..7c13759 100644
--- a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
+++ b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
@@ -51,6 +51,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -515,22 +516,17 @@
         }
     }
 
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
     /**
      * Make sure when path didn't match, we got an exception.
      */
     @Test
     @UiThreadTest
     public void testPathMorphingException() throws Exception {
-        boolean hasException = false;
-        try {
-            final AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mContext,
+        thrown.expect(RuntimeException.class);
+        final AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mContext,
                     R.drawable.animation_path_morphing_rect_exception);
-        } catch (Exception e) {
-            // Expected to come in here, so nothing happen.
-            hasException = true;
-        }
-
-        assertTrue(hasException);
-
     }
 }
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
new file mode 100644
index 0000000..1bab232
--- /dev/null
+++ b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.graphics.drawable.tests;
+
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.support.graphics.drawable.AnimationUtilsCompat;
+import android.support.graphics.drawable.animated.test.R;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.view.animation.Interpolator;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+@MediumTest
+@RunWith(Parameterized.class)
+public class PathInterpolatorValueParameterizedTest {
+    private static final float EPSILON = 1e-3f;
+    @Rule
+    public ActivityTestRule<DrawableStubActivity> mActivityRule =
+            new ActivityTestRule<>(DrawableStubActivity.class);
+
+    private Activity mActivity = null;
+    private int mResId;
+    private float mExpected;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][]{
+                {R.interpolator.control_points_interpolator, 0.89f},
+                {R.interpolator.single_control_point_interpolator, 0.086f},
+                {R.interpolator.path_interpolator, 0.85f}
+        });
+    }
+
+    public PathInterpolatorValueParameterizedTest(final int resId, float expected)
+            throws Throwable {
+        mResId = resId;
+        mExpected = expected;
+    }
+
+    @Before
+    public void setup() {
+        mActivity = mActivityRule.getActivity();
+    }
+
+    @Test
+    public void testPathInterpolator() throws Exception {
+        Interpolator interpolator = AnimationUtilsCompat.loadInterpolator(mActivity, mResId);
+        float value = interpolator.getInterpolation(0.5f);
+        float delta = Math.abs(value - mExpected);
+        assertTrue("value " + value + " is different than expected " + mExpected, delta < EPSILON);
+    }
+}
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java b/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
index fd3e6af..31370a2 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
@@ -14,6 +14,8 @@
 
 package android.support.graphics.drawable;
 
+import android.support.annotation.StyleableRes;
+
 class AndroidResources {
 
     // Resources ID generated in the latest R.java for framework.
@@ -49,7 +51,7 @@
             android.R.attr.strokeColor, android.R.attr.strokeWidth, android.R.attr.trimPathStart,
             android.R.attr.trimPathEnd, android.R.attr.trimPathOffset, android.R.attr.strokeLineCap,
             android.R.attr.strokeLineJoin, android.R.attr.strokeMiterLimit,
-            android.R.attr.strokeAlpha, android.R.attr.fillAlpha
+            android.R.attr.strokeAlpha, android.R.attr.fillAlpha, android.R.attr.fillType
     };
     static final int STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_ALPHA = 12;
     static final int STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_COLOR = 1;
@@ -64,6 +66,7 @@
     static final int STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_END = 6;
     static final int STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_OFFSET = 7;
     static final int STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_START = 5;
+    static final int STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_FILLTYPE = 13;
     static final int[] STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH = {
             android.R.attr.name, android.R.attr.pathData
     };
@@ -77,7 +80,9 @@
     static final int[] STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET = {
             android.R.attr.name, android.R.attr.animation
     };
+    @StyleableRes
     static final int STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_ANIMATION = 1;
+    @StyleableRes
     static final int STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_NAME = 0;
 
     /////////////////////////////////////////////////////////////////////
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
index fb13e92..57d9b2b 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
@@ -28,7 +28,7 @@
  */
 abstract class VectorDrawableCommon extends Drawable implements TintAwareDrawable {
 
-    // Drawable delegation for Lollipop and above.
+    // Drawable delegation for supported API levels.
     Drawable mDelegateDrawable;
 
     @Override
@@ -67,7 +67,6 @@
 
     @Override
     public void setHotspot(float x, float y) {
-        // API >= 21 only.
         if (mDelegateDrawable != null) {
             DrawableCompat.setHotspot(mDelegateDrawable, x, y);
         }
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 013a06e..0dc2cda 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -16,7 +16,6 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import android.annotation.SuppressLint;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.Resources.Theme;
@@ -393,7 +392,6 @@
         return new PorterDuffColorFilter(color, tintMode);
     }
 
-    @SuppressLint("NewApi")
     @Override
     public void setTint(int tint) {
         if (mDelegateDrawable != null) {
@@ -544,7 +542,6 @@
      * @param theme the theme of this vector drawable, it can be null.
      * @return a new VectorDrawableCompat or null if parsing error is found.
      */
-    @SuppressLint("NewApi")
     @Nullable
     public static VectorDrawableCompat create(@NonNull Resources res, @DrawableRes int resId,
                                               @Nullable Theme theme) {
@@ -582,7 +579,6 @@
      * document, tries to create a Drawable from that tag. Returns {@code null}
      * if the tag is not a valid drawable.
      */
-    @SuppressLint("NewApi")
     public static VectorDrawableCompat createFromXmlInner(Resources r, XmlPullParser parser,
             AttributeSet attrs, Theme theme) throws XmlPullParserException, IOException {
         final VectorDrawableCompat drawable = new VectorDrawableCompat();
@@ -597,7 +593,6 @@
         return color;
     }
 
-    @SuppressLint("NewApi")
     @Override
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs)
             throws XmlPullParserException, IOException {
@@ -821,12 +816,11 @@
     }
 
     // We don't support RTL auto mirroring since the getLayoutDirection() is for API 17+.
-    @SuppressLint("NewApi")
     private boolean needMirroring() {
-        if (Build.VERSION.SDK_INT < 17) {
-            return false;
-        } else {
+        if (Build.VERSION.SDK_INT >= 17) {
             return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL;
+        } else {
+            return false;
         }
     }
 
@@ -1227,6 +1221,8 @@
                     final Paint fillPaint = mFillPaint;
                     fillPaint.setColor(applyAlpha(fullPath.mFillColor, fullPath.mFillAlpha));
                     fillPaint.setColorFilter(filter);
+                    mRenderPath.setFillType(fullPath.mFillRule == 0 ? Path.FillType.WINDING
+                            : Path.FillType.EVEN_ODD);
                     canvas.drawPath(mRenderPath, fillPaint);
                 }
 
@@ -1650,7 +1646,7 @@
 
         int mFillColor = Color.TRANSPARENT;
         float mStrokeAlpha = 1.0f;
-        int mFillRule;
+        int mFillRule = 0; // 0 is default value as "non-zero" fill type.
         float mFillAlpha = 1.0f;
         float mTrimPathStart = 0;
         float mTrimPathEnd = 1;
@@ -1778,6 +1774,9 @@
             mTrimPathStart = TypedArrayUtils.getNamedFloat(a, parser, "trimPathStart",
                     AndroidResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_START,
                     mTrimPathStart);
+            mFillRule = TypedArrayUtils.getNamedInt(a, parser, "fillType",
+                    AndroidResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_FILLTYPE,
+                    mFillRule);
         }
 
         @Override
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
new file mode 100644
index 0000000..28e9236
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
new file mode 100644
index 0000000..b27bdbd
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml
new file mode 100644
index 0000000..08fdd05
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * 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 android:height="24dp" android:viewportHeight="400.0"
+        android:viewportWidth="1200.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillType="evenOdd"
+          android:fillColor="#f00"
+          android:pathData="M250,75L323,301 131,161 369,161 177,301z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+    <path android:fillType="evenOdd"
+          android:fillColor="#f00"
+          android:pathData="M600,81A107,107 0,0 1,600 295A107,107 0,0 1,600 81zM600,139A49,49 0,0 1,600 237A49,49 0,0 1,600 139z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+    <path android:fillType="evenOdd"
+          android:fillColor="#f00"
+          android:pathData="M950,81A107,107 0,0 1,950 295A107,107 0,0 1,950 81zM950,139A49,49 0,0 0,950 237A49,49 0,0 0,950 139z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml
new file mode 100644
index 0000000..9200d44
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * 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 android:height="24dp" android:viewportHeight="400.0"
+        android:viewportWidth="1200.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillType="nonZero"
+          android:fillColor="#f00"
+          android:pathData="M250,75L323,301 131,161 369,161 177,301z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+    <path android:fillType="nonZero"
+          android:fillColor="#f00"
+          android:pathData="M600,81A107,107 0,0 1,600 295A107,107 0,0 1,600 81zM600,139A49,49 0,0 1,600 237A49,49 0,0 1,600 139z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+    <path android:fillType="nonZero"
+          android:fillColor="#f00"
+          android:pathData="M950,81A107,107 0,0 1,950 295A107,107 0,0 1,950 81zM950,139A49,49 0,0 0,950 237A49,49 0,0 0,950 139z"
+          android:strokeColor="#000" android:strokeWidth="3"/>
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java b/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
index 97b19e7..8be9aab 100644
--- a/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
+++ b/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
@@ -78,6 +78,8 @@
             R.drawable.vector_icon_share,
             R.drawable.vector_icon_wishlist,
             R.drawable.vector_icon_five_bars,
+            R.drawable.vector_icon_filltype_evenodd,
+            R.drawable.vector_icon_filltype_nonzero,
     };
 
     private static final int[] GOLDEN_IMAGES = new int[]{
@@ -107,6 +109,8 @@
             R.drawable.vector_icon_share_golden,
             R.drawable.vector_icon_wishlist_golden,
             R.drawable.vector_icon_five_bars_golden,
+            R.drawable.vector_icon_filltype_evenodd_golden,
+            R.drawable.vector_icon_filltype_nonzero_golden,
     };
 
     private static final int TEST_ICON = R.drawable.vector_icon_create;
@@ -117,7 +121,7 @@
     // exactly with the golden image.
     // We can increase the threshold if the Skia is drawing with some variance
     // on different devices. So far, the tests show they are matching correctly.
-    private static final float PIXEL_ERROR_THRESHOLD = 0.3f;
+    private static final float PIXEL_ERROR_THRESHOLD = 0.33f;
     private static final float PIXEL_DIFF_COUNT_THRESHOLD = 0.1f;
     private static final float PIXEL_DIFF_THRESHOLD = 0.025f;
 
diff --git a/instantvideo/Android.mk b/instantvideo/Android.mk
deleted file mode 100644
index 2de711e..0000000
--- a/instantvideo/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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 include it with
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := android-support-instantvideo
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-instantvideo
-LOCAL_SDK_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-annotations \
-    android-support-compat
-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/instantvideo/AndroidManifest.xml b/instantvideo/AndroidManifest.xml
deleted file mode 100644
index 26b46c0..0000000
--- a/instantvideo/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT 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.media.instantvideo">
-    <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
-    </application>
-</manifest>
diff --git a/instantvideo/build.gradle b/instantvideo/build.gradle
deleted file mode 100644
index fde2b22..0000000
--- a/instantvideo/build.gradle
+++ /dev/null
@@ -1,30 +0,0 @@
-apply plugin: android.support.SupportLibraryPlugin
-archivesBaseName = 'instantvideo'
-
-dependencies {
-    compile project(':support-annotations')
-    compile project(':support-compat')
-    androidTestCompile (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestCompile libs.mockito_core
-    androidTestCompile libs.dexmaker
-    androidTestCompile libs.dexmaker_mockito
-}
-
-android {
-    defaultConfig {
-        minSdkVersion 14
-    }
-
-    sourceSets {
-        main.java.srcDirs = ['src']
-        main.res.srcDir 'res'
-    }
-}
-
-supportLibrary {
-    name 'Android Support Instant Video'
-    inceptionYear '2017'
-    description 'Android Support Library for Instant Video'
-}
\ No newline at end of file
diff --git a/instantvideo/src/android/support/media/instantvideo/preload/InstantVideoPreloadManager.java b/instantvideo/src/android/support/media/instantvideo/preload/InstantVideoPreloadManager.java
deleted file mode 100644
index 2d3ca61..0000000
--- a/instantvideo/src/android/support/media/instantvideo/preload/InstantVideoPreloadManager.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.support.media.instantvideo.preload;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.util.LruCache;
-import android.util.Log;
-
-/**
- * A singleton to present a simple interface for preloading videos.
- *
- * <p>This class is used in {@link android.support.media.instantvideo.widget.InstantVideoView}
- * internally to play the preloaded video.
- *
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class InstantVideoPreloadManager {
-    private static final String TAG = "InstantVideoPreloadMgr";
-    private static final boolean DEBUG = false;
-
-    private static final int DEFAULT_MAX_VIDEO_COUNT = 20;
-
-    private static InstantVideoPreloadManager sInstance;
-
-    /**
-     * Returns the singleton instance of this class.
-     */
-    public static synchronized InstantVideoPreloadManager getInstance(Context context) {
-        if (sInstance == null) {
-            sInstance =
-                    new InstantVideoPreloadManager(context, new InternalVideoPreloaderFactory());
-        }
-        return sInstance;
-    }
-
-    private final LruCache<Uri, VideoPreloader> mVideoCache =
-            new LruCache<Uri, VideoPreloader>(DEFAULT_MAX_VIDEO_COUNT) {
-                @Override
-                protected void entryRemoved(boolean evicted, Uri key, VideoPreloader oldValue,
-                        VideoPreloader newValue) {
-                    if (newValue != null) {
-                        onEntryRemovedFromCache(key, oldValue);
-                    }
-                }
-            };
-
-    private final Context mAppContext;
-    private final VideoPreloaderFactory mVideoPreloaderFactory;
-
-    private int mMaxVideoCount = DEFAULT_MAX_VIDEO_COUNT;
-
-    @VisibleForTesting
-    InstantVideoPreloadManager(Context context, VideoPreloaderFactory factory) {
-        mAppContext = context.getApplicationContext();
-        mVideoPreloaderFactory = factory;
-    }
-
-    /**
-     * Starts to preload the video with the given URI.
-     *
-     * @param videoUri The URI of the video to preload.
-     */
-    public void preload(@NonNull Uri videoUri) {
-        if (videoUri == null) {
-            throw new IllegalArgumentException("The video URI shouldn't be null.");
-        }
-        if (DEBUG) Log.d(TAG, "Preload " + videoUri);
-        VideoPreloader preloader = mVideoCache.get(videoUri);
-        if (preloader == null) {
-            mVideoCache.put(videoUri, startVideoPreloading(videoUri));
-        } else {
-            mVideoCache.put(videoUri, preloader);
-        }
-        if (mVideoCache.size() > mMaxVideoCount) {
-            if (DEBUG) {
-                Log.d(TAG, "Reached the limit of the video count. Resizing to " + mMaxVideoCount);
-            }
-            mVideoCache.resize(mMaxVideoCount);
-        }
-    }
-
-    @VisibleForTesting
-    int getCacheSize() {
-        return mVideoCache.size();
-    }
-
-    private void onEntryRemovedFromCache(Uri videoUri, VideoPreloader preloader) {
-        preloader.stop();
-    }
-
-    /**
-     * Clears the cache and evict all the videos.
-     */
-    public void clearCache() {
-        mVideoCache.evictAll();
-    }
-
-    /**
-     * Sets the limit of the total size of the preloaded video contents in bytes.
-     *
-     * @param size The maximum cache size in bytes.
-     */
-    public void setMaxCacheSize(int size) {
-        if (size <= 0) {
-            throw new IllegalArgumentException("The maximum cache size should be greater than 0.");
-        }
-        // TODO: Implement.
-    }
-
-    /**
-     * Sets the maximum count of videos to preload.
-     *
-     * @param count The maximum count of the videos to be preloaded.
-     */
-    public void setMaxPreloadVideoCount(int count) {
-        if (count <= 0) {
-            throw new IllegalArgumentException("The maximum video count should be greater than 0.");
-        }
-        mMaxVideoCount = count;
-        mVideoCache.resize(count);
-    }
-
-    private VideoPreloader startVideoPreloading(Uri videoUri) {
-        VideoPreloader preloader = mVideoPreloaderFactory.createVideoPreloader(videoUri);
-        preloader.start();
-        return preloader;
-    }
-
-    @VisibleForTesting
-    interface VideoPreloaderFactory {
-        VideoPreloader createVideoPreloader(Uri videoUri);
-    }
-
-    @VisibleForTesting
-    interface VideoPreloader {
-        void start();
-        void stop();
-    }
-
-    private static class InternalVideoPreloaderFactory implements VideoPreloaderFactory {
-        @Override
-        public VideoPreloader createVideoPreloader(Uri videoUri) {
-            return new AsyncTaskVideoPreloader(videoUri);
-        }
-    }
-
-    private static class AsyncTaskVideoPreloader extends AsyncTask<Void, Void, Void>
-            implements VideoPreloader {
-        private Uri mVideoUri;
-
-        private AsyncTaskVideoPreloader(Uri videoUri) {
-            mVideoUri = videoUri;
-        }
-
-        @Override
-        public void start() {
-            executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-        }
-
-        @Override
-        public void stop() {
-            cancel(true);
-        }
-
-        @Override
-        protected Void doInBackground(Void... params) {
-            // TODO: Implement.
-            return null;
-        }
-    }
-}
diff --git a/instantvideo/src/android/support/media/instantvideo/widget/InstantVideoView.java b/instantvideo/src/android/support/media/instantvideo/widget/InstantVideoView.java
deleted file mode 100644
index 7bd9ccf..0000000
--- a/instantvideo/src/android/support/media/instantvideo/widget/InstantVideoView.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.support.media.instantvideo.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.media.MediaPlayer;
-import android.net.Uri;
-import android.support.annotation.RestrictTo;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.VideoView;
-
-/**
- * Displays a video or an image. This class provides a high level interface for applications to play
- * a video. When the video isn't playing, it displays an image instead if set.
- *
- * <p>A developer can preload a video by calling
- * {@link android.support.media.instantvideo.preload.InstantVideoPreloadManager#preload}, so that
- * the video can play right after {@link #start} is called.
- *
- * @see android.support.media.instantvideo.preload.InstantVideoPreloadManager
- *
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class InstantVideoView extends FrameLayout {
-    private static final String TAG = "InstantVideoView";
-
-    private final VideoView mVideoView;
-    private final ImageView mImageView;
-
-    public InstantVideoView(Context context) {
-        this(context, null, 0);
-    }
-
-    public InstantVideoView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public InstantVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        mVideoView = new VideoView(context, attrs, defStyleAttr);
-        mImageView = new ImageView(context, attrs, defStyleAttr);
-        addView(mVideoView, new FrameLayout.LayoutParams(
-                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER));
-        addView(mImageView, new FrameLayout.LayoutParams(
-                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER));
-        mVideoView.setVisibility(GONE);
-    }
-
-    /**
-     * Sets a video URI.
-     *
-     * <p>This method is used to set the video URI to play in this view.
-     *
-     * @param uri the URI of the video.
-     */
-    public void setVideoUri(Uri uri) {
-        mVideoView.setVideoURI(uri);
-    }
-
-    /**
-     * Sets a drawable as the default image of this view.
-     *
-     * @param drawable the Drawable to set, or {@code null} to clear the content.
-     *
-     * @see ImageView#setImageDrawable
-     */
-    public void setImageDrawable(Drawable drawable) {
-        mImageView.setImageDrawable(drawable);
-    }
-
-    /**
-     * Starts the video playback.
-     */
-    public void start() {
-        reset();
-        mVideoView.setVisibility(VISIBLE);
-        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
-            @Override
-            public void onPrepared(MediaPlayer mp) {
-                mVideoView.start();
-                mImageView.setVisibility(GONE);
-            }
-        });
-        mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
-            @Override
-            public boolean onError(MediaPlayer mp, int what, int extra) {
-                mVideoView.setVisibility(GONE);
-                return false;
-            }
-        });
-    }
-
-    /**
-     * Stops the video playback.
-     */
-    public void stop() {
-        mVideoView.stopPlayback();
-        mVideoView.setVisibility(GONE);
-        mImageView.setVisibility(VISIBLE);
-    }
-
-    /**
-     * Seeks to the given position.
-     *
-     * @param position The position of the video to seek to. It's the offset from the start of the
-     * video.
-     */
-    public void seekTo(int position) {
-        mVideoView.seekTo(position);
-    }
-
-    /**
-     * Returns the current playback position which is the offset from the start of the video.
-     */
-    public int getCurrentPosition() {
-        return mVideoView.getCurrentPosition();
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        // In case the view is recycled, reset the view when it's detached.
-        reset();
-        super.onDetachedFromWindow();
-    }
-
-    private void reset() {
-        mVideoView.setOnPreparedListener(null);
-        stop();
-    }
-}
diff --git a/instantvideo/tests/AndroidManifest.xml b/instantvideo/tests/AndroidManifest.xml
deleted file mode 100644
index 23a337d..0000000
--- a/instantvideo/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright (C) 2017 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT 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.media.instantvideo.test">
-
-    <uses-sdk
-            android:minSdkVersion="14"
-            tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
-                      android.support.test.espresso, android.support.test.espresso.idling"/>
-
-</manifest>
diff --git a/instantvideo/tests/NO_DOCS b/instantvideo/tests/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/instantvideo/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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/instantvideo/tests/src/android/support/media/instantvideo/preload/InstantVideoPreloadManagerTest.java b/instantvideo/tests/src/android/support/media/instantvideo/preload/InstantVideoPreloadManagerTest.java
deleted file mode 100644
index 7b59d1d..0000000
--- a/instantvideo/tests/src/android/support/media/instantvideo/preload/InstantVideoPreloadManagerTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.support.media.instantvideo.preload;
-
-import static android.support.test.InstrumentationRegistry.getContext;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.when;
-
-import android.net.Uri;
-import android.support.media.instantvideo.preload.InstantVideoPreloadManager.VideoPreloader;
-import android.support.media.instantvideo.preload.InstantVideoPreloadManager.VideoPreloaderFactory;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-/**
- * Tests for IntentVideoPreloadManager.
- */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class InstantVideoPreloadManagerTest {
-    private static final Uri PRELOAD_VIDEO_URI_1 = Uri.parse("http://test/test1.mp4");
-    private static final Uri PRELOAD_VIDEO_URI_2 = Uri.parse("http://test/test2.mp4");
-
-    private InstantVideoPreloadManager mPreloadManager;
-    @Mock
-    private VideoPreloaderFactory mMockVideoPreloaderFactory;
-    @Mock
-    private VideoPreloader mMockVideoPreloader;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mMockVideoPreloaderFactory.createVideoPreloader(any(Uri.class)))
-                .thenReturn(mMockVideoPreloader);
-        mPreloadManager = new InstantVideoPreloadManager(getContext(), mMockVideoPreloaderFactory);
-    }
-
-    @After
-    public void tearDown() {
-        mPreloadManager.clearCache();
-    }
-
-    @Test
-    public void preload() {
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_1);
-        assertCacheSize(1);
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_2);
-        assertCacheSize(2);
-    }
-
-    @Test
-    public void preload_duplicate() {
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_1);
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_1);
-        assertCacheSize(1);
-    }
-
-    @Test
-    public void setMaxPreloadVideoCount() {
-        mPreloadManager.setMaxPreloadVideoCount(1);
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_1);
-        assertCacheSize(1);
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_2);
-        assertCacheSize(1);
-    }
-
-    @Test
-    public void clearCache() {
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_1);
-        mPreloadManager.preload(PRELOAD_VIDEO_URI_2);
-        mPreloadManager.clearCache();
-        assertCacheSize(0);
-    }
-
-    private void assertCacheSize(int expected) {
-        int cacheSize = mPreloadManager.getCacheSize();
-        assertEquals("The cache size should be " + expected + ", but was " + cacheSize, expected,
-                cacheSize);
-    }
-}
diff --git a/media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java b/media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
index 60b5d63..cff846d 100644
--- a/media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
+++ b/media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
@@ -118,7 +118,7 @@
         public MediaBrowserService.BrowserRoot onGetRoot(String clientPackageName, int clientUid,
                 Bundle rootHints) {
             MediaBrowserServiceCompatApi21.BrowserRoot browserRoot = mServiceProxy.onGetRoot(
-                    clientPackageName, clientUid, rootHints);
+                    clientPackageName, clientUid, rootHints == null ? null : new Bundle(rootHints));
             return browserRoot == null ? null : new MediaBrowserService.BrowserRoot(
                     browserRoot.mRootId, browserRoot.mExtras);
         }
diff --git a/media-compat/api26/android/support/v4/media/MediaBrowserCompatApi26.java b/media-compat/api26/android/support/v4/media/MediaBrowserCompatApi26.java
deleted file mode 100644
index 9c3b99d..0000000
--- a/media-compat/api26/android/support/v4/media/MediaBrowserCompatApi26.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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.media.browse.MediaBrowser;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-
-import java.util.List;
-
-@RequiresApi(26)
-class MediaBrowserCompatApi26 {
-    public static Object createSearchCallback(SearchCallback callback) {
-        return new SearchCallbackProxy<>(callback);
-    }
-
-    public static void search(Object browserObj, String query, Bundle extras, Object callback) {
-        ((MediaBrowser) browserObj).search(query, extras,
-                (MediaBrowser.SearchCallback) callback);
-    }
-
-    interface SearchCallback {
-        void onSearchResult(@NonNull String query, Bundle extras, @NonNull List<?> items);
-        void onError(@NonNull String query, Bundle extras);
-    }
-
-    static class SearchCallbackProxy<T extends SearchCallback> extends MediaBrowser.SearchCallback {
-        protected final T mSearchCallback;
-
-        SearchCallbackProxy(T callback) {
-            mSearchCallback = callback;
-        }
-
-        @Override
-        public void onSearchResult(String query, Bundle extras,
-                List<MediaBrowser.MediaItem> items) {
-            mSearchCallback.onSearchResult(query, extras, items);
-        }
-
-        @Override
-        public void onError(String query, Bundle extras) {
-            mSearchCallback.onError(query, extras);
-        }
-    }
-}
diff --git a/media-compat/api26/android/support/v4/media/MediaBrowserServiceCompatApi26.java b/media-compat/api26/android/support/v4/media/MediaBrowserServiceCompatApi26.java
deleted file mode 100644
index d427531..0000000
--- a/media-compat/api26/android/support/v4/media/MediaBrowserServiceCompatApi26.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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.content.Context;
-import android.media.browse.MediaBrowser;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-
-import java.util.List;
-
-@RequiresApi(26)
-class MediaBrowserServiceCompatApi26 {
-
-    public static Object createService(Context context, ServiceCompatProxy serviceProxy) {
-        return new MediaBrowserServiceAdaptor(context, serviceProxy);
-    }
-
-    public interface ServiceCompatProxy extends MediaBrowserServiceCompatApi24.ServiceCompatProxy {
-        void onSearch(@NonNull String query, Bundle extras,
-                MediaBrowserServiceCompatApi24.ResultWrapper result);
-    }
-
-    static class MediaBrowserServiceAdaptor extends
-            MediaBrowserServiceCompatApi24.MediaBrowserServiceAdaptor {
-        MediaBrowserServiceAdaptor(Context context, ServiceCompatProxy serviceWrapper) {
-            super(context, serviceWrapper);
-        }
-
-        @Override
-        public void onSearch(@NonNull String query, Bundle extras,
-                @NonNull Result<List<MediaBrowser.MediaItem>> result) {
-            ((ServiceCompatProxy) mServiceProxy).onSearch(query, extras,
-                    new MediaBrowserServiceCompatApi24.ResultWrapper(result));
-        }
-    }
-}
diff --git a/media-compat/api26/android/support/v4/media/session/MediaControllerCompatApi26.java b/media-compat/api26/android/support/v4/media/session/MediaControllerCompatApi26.java
deleted file mode 100644
index 34ed628..0000000
--- a/media-compat/api26/android/support/v4/media/session/MediaControllerCompatApi26.java
+++ /dev/null
@@ -1,84 +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.media.session;
-
-import android.media.MediaDescription;
-import android.media.session.MediaController;
-import android.support.annotation.RequiresApi;
-
-@RequiresApi(26)
-class MediaControllerCompatApi26 {
-    public static Object createCallback(Callback callback) {
-        return new CallbackProxy<>(callback);
-    }
-
-    public static int getRepeatMode(Object controllerObj) {
-        return ((MediaController) controllerObj).getRepeatMode();
-    }
-
-    public static boolean isShuffleModeEnabled(Object controllerObj) {
-        return ((MediaController) controllerObj).isShuffleModeEnabled();
-    }
-
-    public static void addQueueItem(Object controllerObj, Object descriptionObj) {
-        ((MediaController) controllerObj).addQueueItem((MediaDescription) descriptionObj);
-    }
-
-    public static void addQueueItem(Object controllerObj, Object descriptionObj, int index) {
-        ((MediaController) controllerObj).addQueueItem((MediaDescription) descriptionObj, index);
-    }
-
-    public static void removeQueueItem(Object controllerObj, Object descriptionObj) {
-        ((MediaController) controllerObj).removeQueueItem((MediaDescription) descriptionObj);
-    }
-
-    public static void removeQueueItemAt(Object controllerObj, int index) {
-        ((MediaController) controllerObj).removeQueueItemAt(index);
-    }
-
-    public static class TransportControls extends MediaControllerCompatApi23.TransportControls {
-        public static void setRepeatMode(Object controlsObj, int repeatMode) {
-            ((MediaController.TransportControls) controlsObj).setRepeatMode(repeatMode);
-        }
-
-        public static void setShuffleModeEnabled(Object controlsObj, boolean enabled) {
-            ((MediaController.TransportControls) controlsObj).setShuffleModeEnabled(enabled);
-        }
-    }
-
-    public interface Callback extends MediaControllerCompatApi21.Callback {
-        void onRepeatModeChanged(int repeatMode);
-        void onShuffleModeChanged(boolean enabled);
-    }
-
-    static class CallbackProxy<T extends Callback> extends MediaControllerCompatApi21
-            .CallbackProxy<T> {
-        CallbackProxy(T callback) {
-            super(callback);
-        }
-
-        @Override
-        public void onRepeatModeChanged(int repeatMode) {
-            mCallback.onRepeatModeChanged(repeatMode);
-        }
-
-        @Override
-        public void onShuffleModeChanged(boolean enabled) {
-            mCallback.onShuffleModeChanged(enabled);
-        }
-    }
-}
diff --git a/media-compat/api26/android/support/v4/media/session/MediaSessionCompatApi26.java b/media-compat/api26/android/support/v4/media/session/MediaSessionCompatApi26.java
deleted file mode 100644
index 8289702..0000000
--- a/media-compat/api26/android/support/v4/media/session/MediaSessionCompatApi26.java
+++ /dev/null
@@ -1,83 +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.media.session;
-
-import android.media.MediaDescription;
-import android.media.session.MediaSession;
-import android.support.annotation.RequiresApi;
-
-@RequiresApi(26)
-class MediaSessionCompatApi26 {
-
-    public static Object createCallback(Callback callback) {
-        return new CallbackProxy<Callback>(callback);
-    }
-
-    public static void setRepeatMode(Object sessionObj, int repeatMode) {
-        ((MediaSession) sessionObj).setRepeatMode(repeatMode);
-    }
-
-    public static void setShuffleModeEnabled(Object sessionObj, boolean enabled) {
-        ((MediaSession) sessionObj).setShuffleModeEnabled(enabled);
-    }
-
-    public interface Callback extends MediaSessionCompatApi24.Callback {
-        void onSetRepeatMode(int repeatMode);
-        void onSetShuffleModeEnabled(boolean enabled);
-        void onAddQueueItem(Object descriptionObject);
-        void onAddQueueItem(Object descriptionObject, int index);
-        void onRemoveQueueItem(Object descriptionObject);
-        void onRemoveQueueItemAt(int index);
-    }
-
-    static class CallbackProxy<T extends Callback>
-            extends MediaSessionCompatApi24.CallbackProxy<T> {
-        CallbackProxy(T callback) {
-            super(callback);
-        }
-
-        @Override
-        public void onSetRepeatMode(int repeatMode) {
-            mCallback.onSetRepeatMode(repeatMode);
-        }
-
-        @Override
-        public void onSetShuffleModeEnabled(boolean enabled) {
-            mCallback.onSetShuffleModeEnabled(enabled);
-        }
-
-        @Override
-        public void onAddQueueItem(MediaDescription description) {
-            mCallback.onAddQueueItem(description);
-        }
-
-        @Override
-        public void onAddQueueItem(MediaDescription description, int index) {
-            mCallback.onAddQueueItem(description, index);
-        }
-
-        @Override
-        public void onRemoveQueueItem(MediaDescription description) {
-            mCallback.onRemoveQueueItem(description);
-        }
-
-        @Override
-        public void onRemoveQueueItemAt(int index) {
-            mCallback.onRemoveQueueItemAt(index);
-        }
-    }
-}
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
index 8369d08..1b44a58 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
@@ -23,10 +23,12 @@
 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_SEARCH;
-import static android.support.v4.media.MediaBrowserProtocol
-        .CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_SEND_CUSTOM_ACTION;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER;
 import static android.support.v4.media.MediaBrowserProtocol.CLIENT_VERSION_CURRENT;
 import static android.support.v4.media.MediaBrowserProtocol.DATA_CALLBACK_TOKEN;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_CUSTOM_ACTION;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_CUSTOM_ACTION_EXTRAS;
 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;
@@ -43,7 +45,6 @@
 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 android.annotation.SuppressLint;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -86,6 +87,8 @@
  * <p>
  * This object is not thread-safe. All calls should happen on the thread on which the browser
  * was constructed.
+ * </p><p>
+ * All callback methods will be called from the thread on which the browser was constructed.
  * </p>
  */
 public final class MediaBrowserCompat {
@@ -126,13 +129,11 @@
      * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_OFFLINE
      * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_SUGGESTED
      */
-    @SuppressLint("NewApi")
     public MediaBrowserCompat(Context context, ComponentName serviceComponent,
             ConnectionCallback callback, Bundle rootHints) {
         // To workaround an issue of {@link #unsubscribe(String, SubscriptionCallback)} on API 24
         // and 25 devices, use the support library version of implementation on those devices.
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             mImpl = new MediaBrowserImplApi24(context, serviceComponent, callback, rootHints);
         } else if (Build.VERSION.SDK_INT >= 23) {
             mImpl = new MediaBrowserImplApi23(context, serviceComponent, callback, rootHints);
@@ -356,6 +357,23 @@
     }
 
     /**
+     * Sends a custom action to the connected service. If the service doesn't support the given
+     * action, {@link CustomActionCallback#onError} will be called.
+     *
+     * @param action The custom action that will be sent to the connected service. Should not be an
+     *            empty string.
+     * @param extras The bundle of service-specific arguments to send to the media browser service.
+     * @param callback The callback to receive the result of the custom action.
+     */
+    public void sendCustomAction(@NonNull String action, Bundle extras,
+            @Nullable CustomActionCallback callback) {
+        if (TextUtils.isEmpty(action)) {
+            throw new IllegalArgumentException("action cannot be empty");
+        }
+        mImpl.sendCustomAction(action, extras, callback);
+    }
+
+    /**
      * A class with information on a single media item for use in browsing/searching media.
      * MediaItems are application dependent so we cannot guarantee that they contain the
      * right values.
@@ -607,10 +625,8 @@
         private final IBinder mToken;
         WeakReference<Subscription> mSubscriptionRef;
 
-        @SuppressLint("NewApi")
         public SubscriptionCallback() {
             if (BuildCompat.isAtLeastO()) {
-                //noinspection AndroidLintNewApi
                 mSubscriptionCallbackObj =
                         MediaBrowserCompatApi24.createSubscriptionCallback(new StubApi24());
                 mToken = null;
@@ -809,18 +825,6 @@
      * Callback for receiving the result of {@link #search}.
      */
     public abstract static class SearchCallback {
-        final Object mSearchCallbackObj;
-
-        @SuppressLint("NewApi")
-        public SearchCallback() {
-            if (BuildCompat.isAtLeastO()) {
-                //noinspection AndroidLintNewApi
-                mSearchCallbackObj = MediaBrowserCompatApi26.createSearchCallback(new StubApi26());
-            } else {
-                mSearchCallbackObj = null;
-            }
-        }
-
         /**
          * Called when the {@link #search} finished successfully.
          *
@@ -841,22 +845,42 @@
          */
         public void onError(@NonNull String query, Bundle extras) {
         }
+    }
 
-        private class StubApi26 implements MediaBrowserCompatApi26.SearchCallback {
-            StubApi26() {
-            }
+    /**
+     * Callback for receiving the result of {@link #sendCustomAction}.
+     */
+    public abstract static class CustomActionCallback {
+        /**
+         * Called when an interim update was delivered from the connected service while performing
+         * the custom action.
+         *
+         * @param action The custom action sent to the connected service.
+         * @param extras The bundle of service-specific arguments sent to the connected service.
+         * @param data The additional data delivered from the connected service.
+         */
+        public void onProgressUpdate(String action, Bundle extras, Bundle data) {
+        }
 
-            @Override
-            public void onSearchResult(@NonNull String query, Bundle extras,
-                    @NonNull List<?> items) {
-                SearchCallback.this.onSearchResult(
-                        query, extras, MediaItem.fromMediaItemList(items));
-            }
+        /**
+         * Called when the custom action finished successfully.
+         *
+         * @param action The custom action sent to the connected service.
+         * @param extras The bundle of service-specific arguments sent to the connected service.
+         * @param resultData The additional data delivered from the connected service.
+         */
+        public void onResult(String action, Bundle extras, Bundle resultData) {
+        }
 
-            @Override
-            public void onError(@NonNull String query, Bundle extras) {
-                SearchCallback.this.onError(query, extras);
-            }
+        /**
+         * Called when an error happens while performing the custom action or the connected service
+         * doesn't support the requested custom action.
+         *
+         * @param action The custom action sent to the connected service.
+         * @param extras The bundle of service-specific arguments sent to the connected service.
+         * @param data The additional data delivered from the connected service.
+         */
+        public void onError(String action, Bundle extras, Bundle data) {
         }
     }
 
@@ -873,6 +897,7 @@
         void unsubscribe(@NonNull String parentId, SubscriptionCallback callback);
         void getItem(final @NonNull String mediaId, @NonNull final ItemCallback cb);
         void search(@NonNull String query, Bundle extras, @NonNull SearchCallback callback);
+        void sendCustomAction(String action, Bundle extras, final CustomActionCallback callback);
     }
 
     interface MediaBrowserServiceCallbackImpl {
@@ -1194,6 +1219,32 @@
         }
 
         @Override
+        public void sendCustomAction(@NonNull final String action, final Bundle extras,
+                @Nullable final CustomActionCallback callback) {
+            if (!isConnected()) {
+                throw new IllegalStateException("Cannot send a custom action (" + action + ") with "
+                        + "extras " + extras + " because the browser is not connected to the "
+                        + "service.");
+            }
+
+            ResultReceiver receiver = new CustomActionResultReceiver(action, extras, callback,
+                    mHandler);
+            try {
+                mServiceBinderWrapper.sendCustomAction(action, extras, receiver,
+                        mCallbacksMessenger);
+            } catch (RemoteException e) {
+                Log.i(TAG, "Remote error sending a custom action: action=" + action + ", extras="
+                        + extras, e);
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        callback.onError(action, extras, null);
+                    }
+                });
+            }
+        }
+
+        @Override
         public void onServiceConnected(final Messenger callback, final String root,
                 final MediaSessionCompat.Token session, final Bundle extra) {
             // Check to make sure there hasn't been a disconnect or a different ServiceConnection.
@@ -1700,6 +1751,41 @@
         }
 
         @Override
+        public void sendCustomAction(final String action, final Bundle extras,
+                final CustomActionCallback callback) {
+            if (!isConnected()) {
+                throw new IllegalStateException("Cannot send a custom action (" + action + ") with "
+                        + "extras " + extras + " because the browser is not connected to the "
+                        + "service.");
+            }
+            if (mServiceBinderWrapper == null) {
+                Log.i(TAG, "The connected service doesn't support sendCustomAction.");
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        callback.onError(action, extras, null);
+                    }
+                });
+            }
+
+            ResultReceiver receiver = new CustomActionResultReceiver(action, extras, callback,
+                    mHandler);
+            try {
+                mServiceBinderWrapper.sendCustomAction(action, extras, receiver,
+                        mCallbacksMessenger);
+            } catch (RemoteException e) {
+                Log.i(TAG, "Remote error sending a custom action: action=" + action + ", extras="
+                        + extras, e);
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        callback.onError(action, extras, null);
+                    }
+                });
+            }
+        }
+
+        @Override
         public void onConnected() {
             Bundle extras = MediaBrowserCompatApi21.getExtras(mBrowserObj);
             if (extras == null) {
@@ -1829,12 +1915,6 @@
                         callback.mSubscriptionCallbackObj);
             }
         }
-
-        @Override
-        public void search(@NonNull final String query, final Bundle extras,
-                @NonNull final SearchCallback callback) {
-            MediaBrowserCompatApi26.search(mBrowserObj, query, extras, callback.mSearchCallbackObj);
-        }
     }
 
     private static class Subscription {
@@ -1991,6 +2071,15 @@
             sendRequest(CLIENT_MSG_SEARCH, data, callbacksMessenger);
         }
 
+        void sendCustomAction(String action, Bundle extras, ResultReceiver receiver,
+                Messenger callbacksMessenger) throws RemoteException {
+            Bundle data = new Bundle();
+            data.putString(DATA_CUSTOM_ACTION, action);
+            data.putBundle(DATA_CUSTOM_ACTION_EXTRAS, extras);
+            data.putParcelable(DATA_RESULT_RECEIVER, receiver);
+            sendRequest(CLIENT_MSG_SEND_CUSTOM_ACTION, data, callbacksMessenger);
+        }
+
         private void sendRequest(int what, Bundle data, Messenger cbMessenger)
                 throws RemoteException {
             Message msg = Message.obtain();
@@ -2046,6 +2135,9 @@
 
         @Override
         protected void onReceiveResult(int resultCode, Bundle resultData) {
+            if (resultData != null) {
+                resultData.setClassLoader(MediaBrowserCompat.class.getClassLoader());
+            }
             if (resultCode != MediaBrowserServiceCompat.RESULT_OK || resultData == null
                     || !resultData.containsKey(MediaBrowserServiceCompat.KEY_SEARCH_RESULTS)) {
                 mCallback.onError(mQuery, mExtras);
@@ -2063,4 +2155,40 @@
             mCallback.onSearchResult(mQuery, mExtras, results);
         }
     }
+
+    private static class CustomActionResultReceiver extends ResultReceiver {
+        private final String mAction;
+        private final Bundle mExtras;
+        private final CustomActionCallback mCallback;
+
+        CustomActionResultReceiver(String action, Bundle extras, CustomActionCallback callback,
+                Handler handler) {
+            super(handler);
+            mAction = action;
+            mExtras = extras;
+            mCallback = callback;
+        }
+
+        @Override
+        protected void onReceiveResult(int resultCode, Bundle resultData) {
+            if (mCallback == null) {
+                return;
+            }
+            switch (resultCode) {
+                case MediaBrowserServiceCompat.RESULT_PROGRESS_UPDATE:
+                    mCallback.onProgressUpdate(mAction, mExtras, resultData);
+                    break;
+                case MediaBrowserServiceCompat.RESULT_OK:
+                    mCallback.onResult(mAction, mExtras, resultData);
+                    break;
+                case MediaBrowserServiceCompat.RESULT_ERROR:
+                    mCallback.onError(mAction, mExtras, resultData);
+                    break;
+                default:
+                    Log.w(TAG, "Unknown result code: " + resultCode + " (extras=" + mExtras
+                            + ", resultData=" + resultData + ")");
+                    break;
+            }
+        }
+    }
 }
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserProtocol.java b/media-compat/java/android/support/v4/media/MediaBrowserProtocol.java
index b90dc05..7c23d26 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserProtocol.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserProtocol.java
@@ -31,6 +31,8 @@
     public static final String DATA_ROOT_HINTS = "data_root_hints";
     public static final String DATA_SEARCH_EXTRAS = "data_search_extras";
     public static final String DATA_SEARCH_QUERY = "data_search_query";
+    public static final String DATA_CUSTOM_ACTION = "data_custom_action";
+    public static final String DATA_CUSTOM_ACTION_EXTRAS = "data_custom_action_extras";
 
     public static final String EXTRA_CLIENT_VERSION = "extra_client_version";
     public static final String EXTRA_SERVICE_VERSION = "extra_service_version";
@@ -167,8 +169,20 @@
      *     DATA_SEARCH_QUERY : A string for search query that contains keywords separated by space.
      *     DATA_SEARCH_EXTRAS : A bundle of service-specific arguments to send to the media browser
      *                          service.
-     *     DATA_RESULT_RECEIVER : Result receiver to get the result
+     *     DATA_RESULT_RECEIVER : Result receiver to get the result.
      * - replyTo : Callback messenger
      */
     public static final int CLIENT_MSG_SEARCH = 8;
+
+    /** (client v1)
+     * Sent to request a custom action from the media browser.
+     * - arg1 : The client version
+     * - data
+     *     DATA_CUSTOM_ACTION : A string for the custom action.
+     *     DATA_CUSTOM_ACTION_EXTRAS : A bundle of service-specific arguments to send to the media
+     *                                 browser service.
+     *     DATA_RESULT_RECEIVER : Result receiver to get the result.
+     * - replyTo : Callback messenger
+     */
+    public static final int CLIENT_MSG_SEND_CUSTOM_ACTION = 9;
 }
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java
index dbbabc3..9cee703 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java
@@ -24,9 +24,12 @@
 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_SEARCH;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_SEND_CUSTOM_ACTION;
 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_CUSTOM_ACTION;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_CUSTOM_ACTION_EXTRAS;
 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;
@@ -45,7 +48,6 @@
 import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_LOAD_CHILDREN;
 import static android.support.v4.media.MediaBrowserProtocol.SERVICE_VERSION_CURRENT;
 
-import android.annotation.SuppressLint;
 import android.app.Service;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -137,6 +139,7 @@
 
     static final int RESULT_ERROR = -1;
     static final int RESULT_OK = 0;
+    static final int RESULT_PROGRESS_UPDATE = 1;
 
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
@@ -322,7 +325,7 @@
             final Result<List<MediaBrowserCompat.MediaItem>> result
                     = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
                 @Override
-                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+                void onResultSent(List<MediaBrowserCompat.MediaItem> list) {
                     List<Parcel> parcelList = null;
                     if (list != null) {
                         parcelList = new ArrayList<>();
@@ -360,7 +363,7 @@
             final Result<MediaBrowserCompat.MediaItem> result
                     = new Result<MediaBrowserCompat.MediaItem>(itemId) {
                 @Override
-                void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
+                void onResultSent(MediaBrowserCompat.MediaItem item) {
                     if (item == null) {
                         resultWrapper.sendResult(null);
                     } else {
@@ -382,10 +385,10 @@
     // TODO: Rename to MediaBrowserServiceImplApi26 once O is released
     @RequiresApi(26)
     class MediaBrowserServiceImplApi24 extends MediaBrowserServiceImplApi23 implements
-            MediaBrowserServiceCompatApi26.ServiceCompatProxy {
+            MediaBrowserServiceCompatApi24.ServiceCompatProxy {
         @Override
         public void onCreate() {
-            mServiceObj = MediaBrowserServiceCompatApi26.createService(
+            mServiceObj = MediaBrowserServiceCompatApi24.createService(
                     MediaBrowserServiceCompat.this, this);
             MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
         }
@@ -406,7 +409,7 @@
             final Result<List<MediaBrowserCompat.MediaItem>> result
                     = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
                 @Override
-                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+                void onResultSent(List<MediaBrowserCompat.MediaItem> list) {
                     List<Parcel> parcelList = null;
                     if (list != null) {
                         parcelList = new ArrayList<>();
@@ -416,7 +419,7 @@
                             parcelList.add(parcel);
                         }
                     }
-                    resultWrapper.sendResult(parcelList, flags);
+                    resultWrapper.sendResult(parcelList, getFlags());
                 }
 
                 @Override
@@ -436,29 +439,6 @@
             }
             return MediaBrowserServiceCompatApi24.getBrowserRootHints(mServiceObj);
         }
-
-        @Override
-        public void onSearch(@NonNull String query, Bundle extras,
-                final MediaBrowserServiceCompatApi24.ResultWrapper resultWrapper) {
-            final Result<List<MediaBrowserCompat.MediaItem>> result =
-                    new Result<List<MediaBrowserCompat.MediaItem>>(query) {
-                        @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);
-                        }
-            };
-            MediaBrowserServiceCompat.this.onSearch(query, extras, result);
-        }
     }
 
     private final class ServiceHandler extends Handler {
@@ -508,6 +488,12 @@
                             (ResultReceiver) data.getParcelable(DATA_RESULT_RECEIVER),
                             new ServiceCallbacksCompat(msg.replyTo));
                     break;
+                case CLIENT_MSG_SEND_CUSTOM_ACTION:
+                    mServiceBinderImpl.sendCustomAction(data.getString(DATA_CUSTOM_ACTION),
+                            data.getBundle(DATA_CUSTOM_ACTION_EXTRAS),
+                            (ResultReceiver) data.getParcelable(DATA_RESULT_RECEIVER),
+                            new ServiceCallbacksCompat(msg.replyTo));
+                    break;
                 default:
                     Log.w(TAG, "Unhandled message: " + msg
                             + "\n  Service version: " + SERVICE_VERSION_CURRENT
@@ -551,21 +537,29 @@
     /**
      * 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.
+     * Each of the methods that takes one of these to send the result must call either
+     * {@link #sendResult} or {@link #sendError} to respond to the caller with the given results or
+     * errors. If those functions return without calling {@link #sendResult} or {@link #sendError},
+     * they must instead call {@link #detach} before returning, and then may call
+     * {@link #sendResult} or {@link #sendError} when they are done. If {@link #sendResult},
+     * {@link #sendError}, or {@link #detach} is called twice, an exception will be thrown.
+     * </p><p>
+     * Those functions might also want to call {@link #sendProgressUpdate} to send interim updates
+     * to the caller. If it is called after calling {@link #sendResult} or {@link #sendError}, an
+     * exception will be thrown.
+     * </p>
      *
      * @see MediaBrowserServiceCompat#onLoadChildren
      * @see MediaBrowserServiceCompat#onLoadItem
      * @see MediaBrowserServiceCompat#onSearch
+     * @see MediaBrowserServiceCompat#onCustomAction
      */
     public static class Result<T> {
-        private Object mDebug;
+        private final Object mDebug;
         private boolean mDetachCalled;
         private boolean mSendResultCalled;
+        private boolean mSendProgressUpdateCalled;
+        private boolean mSendErrorCalled;
         private int mFlags;
 
         Result(Object debug) {
@@ -576,11 +570,42 @@
          * Send the result back to the caller.
          */
         public void sendResult(T result) {
-            if (mSendResultCalled) {
-                throw new IllegalStateException("sendResult() called twice for: " + mDebug);
+            if (mSendResultCalled || mSendErrorCalled) {
+                throw new IllegalStateException("sendResult() called when either sendResult() or "
+                        + "sendError() had already been called for: " + mDebug);
             }
             mSendResultCalled = true;
-            onResultSent(result, mFlags);
+            onResultSent(result);
+        }
+
+        /**
+         * Send an interim update to the caller. This method is supported only when it is used in
+         * {@link #onCustomAction}.
+         *
+         * @param extras A bundle that contains extra data.
+         */
+        public void sendProgressUpdate(Bundle extras) {
+            if (mSendResultCalled || mSendErrorCalled) {
+                throw new IllegalStateException("sendProgressUpdate() called when either "
+                        + "sendResult() or sendError() had already been called for: " + mDebug);
+            }
+            mSendProgressUpdateCalled = true;
+            onProgressUpdateSent(extras);
+        }
+
+        /**
+         * Notify the caller of a failure. This is supported only when it is used in
+         * {@link #onCustomAction}.
+         *
+         * @param extras A bundle that contains extra data.
+         */
+        public void sendError(Bundle extras) {
+            if (mSendResultCalled || mSendErrorCalled) {
+                throw new IllegalStateException("sendError() called when either sendResult() or "
+                        + "sendError() had already been called for: " + mDebug);
+            }
+            mSendErrorCalled = true;
+            onErrorSent(extras);
         }
 
         /**
@@ -596,22 +621,47 @@
                 throw new IllegalStateException("detach() called when sendResult() had already"
                         + " been called for: " + mDebug);
             }
+            if (mSendErrorCalled) {
+                throw new IllegalStateException("detach() called when sendError() had already"
+                        + " been called for: " + mDebug);
+            }
             mDetachCalled = true;
         }
 
         boolean isDone() {
-            return mDetachCalled || mSendResultCalled;
+            return mDetachCalled || mSendResultCalled || mSendErrorCalled;
         }
 
         void setFlags(@ResultFlags int flags) {
             mFlags = flags;
         }
 
+        int getFlags() {
+            return mFlags;
+        }
+
         /**
-         * Called when the result is sent, after assertions about not being called twice
-         * have happened.
+         * Called when the result is sent, after assertions about not being called twice have
+         * happened.
          */
-        void onResultSent(T result, @ResultFlags int flags) {
+        void onResultSent(T result) {
+        }
+
+        /**
+         * Called when an interim update is sent.
+         */
+        void onProgressUpdateSent(Bundle extras) {
+            throw new UnsupportedOperationException("It is not supported to send an interim update "
+                    + "for " + mDebug);
+        }
+
+        /**
+         * Called when an error is sent, after assertions about not being called twice have
+         * happened.
+         */
+        void onErrorSent(Bundle extras) {
+            throw new UnsupportedOperationException("It is not supported to send an error for "
+                    + mDebug);
         }
     }
 
@@ -796,6 +846,28 @@
                 }
             });
         }
+
+        public void sendCustomAction(final String action, final Bundle extras,
+                final ResultReceiver receiver, final ServiceCallbacks callbacks) {
+            if (TextUtils.isEmpty(action) || 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, "sendCustomAction for callback that isn't registered action="
+                                + action + ", extras=" + extras);
+                        return;
+                    }
+                    performCustomAction(action, extras, connection, receiver);
+                }
+            });
+        }
     }
 
     private interface ServiceCallbacks {
@@ -861,11 +933,9 @@
     }
 
     @Override
-    @SuppressLint("NewApi")
     public void onCreate() {
         super.onCreate();
         if (BuildCompat.isAtLeastO()) {
-            //noinspection AndroidLintNewApi
             mImpl = new MediaBrowserServiceImplApi24();
         } else if (Build.VERSION.SDK_INT >= 23) {
             mImpl = new MediaBrowserServiceImplApi23();
@@ -1017,6 +1087,28 @@
     }
 
     /**
+     * Called to request a custom action to this service.
+     * <p>
+     * Implementations must call either {@link Result#sendResult} or {@link Result#sendError}. If
+     * the requested custom action will be an expensive operation {@link Result#detach} may be
+     * called before returning from this function, and then the service can send the result later
+     * when the custom action is completed. Implementation can also call
+     * {@link Result#sendProgressUpdate} to send an interim update to the requester.
+     * </p><p>
+     * If the requested custom action is not supported by this service, call
+     * {@link Result#sendError}. The default implementation will invoke {@link Result#sendError}.
+     * </p>
+     *
+     * @param action The custom action sent from the media browser.
+     * @param extras The bundle of service-specific arguments sent from the media browser.
+     * @param result The {@link Result} to send the result of the requested custom action.
+     */
+    public void onCustomAction(@NonNull String action, Bundle extras,
+            @NonNull Result<Bundle> result) {
+        result.sendError(null);
+    }
+
+    /**
      * Call to set the media session.
      * <p>
      * This should be called as soon as possible during the service's startup.
@@ -1172,7 +1264,7 @@
         final Result<List<MediaBrowserCompat.MediaItem>> result
                 = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
             @Override
-            void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+            void onResultSent(List<MediaBrowserCompat.MediaItem> list) {
                 if (mConnections.get(connection.callbacks.asBinder()) != connection) {
                     if (DEBUG) {
                         Log.d(TAG, "Not sending onLoadChildren result for connection that has"
@@ -1182,7 +1274,7 @@
                 }
 
                 List<MediaBrowserCompat.MediaItem> filteredList =
-                        (flags & RESULT_FLAG_OPTION_NOT_HANDLED) != 0
+                        (getFlags() & RESULT_FLAG_OPTION_NOT_HANDLED) != 0
                                 ? applyOptions(list, options) : list;
                 try {
                     connection.callbacks.onLoadChildren(parentId, filteredList, options);
@@ -1234,8 +1326,8 @@
         final Result<MediaBrowserCompat.MediaItem> result =
                 new Result<MediaBrowserCompat.MediaItem>(itemId) {
                     @Override
-                    void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
-                        if ((flags & RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED) != 0) {
+                    void onResultSent(MediaBrowserCompat.MediaItem item) {
+                        if ((getFlags() & RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED) != 0) {
                             receiver.send(RESULT_ERROR, null);
                             return;
                         }
@@ -1260,8 +1352,8 @@
         final Result<List<MediaBrowserCompat.MediaItem>> result =
                 new Result<List<MediaBrowserCompat.MediaItem>>(query) {
             @Override
-            void onResultSent(List<MediaBrowserCompat.MediaItem> items, @ResultFlags int flag) {
-                if ((flag & RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED) != 0
+            void onResultSent(List<MediaBrowserCompat.MediaItem> items) {
+                if ((getFlags() & RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED) != 0
                         || items == null) {
                     receiver.send(RESULT_ERROR, null);
                     return;
@@ -1283,6 +1375,36 @@
         }
     }
 
+    void performCustomAction(final String action, Bundle extras, ConnectionRecord connection,
+            final ResultReceiver receiver) {
+        final Result<Bundle> result = new Result<Bundle>(action) {
+                @Override
+                void onResultSent(Bundle result) {
+                    receiver.send(RESULT_OK, result);
+                }
+
+                @Override
+                void onProgressUpdateSent(Bundle data) {
+                    receiver.send(RESULT_PROGRESS_UPDATE, data);
+                }
+
+                @Override
+                void onErrorSent(Bundle data) {
+                    receiver.send(RESULT_ERROR, data);
+                }
+            };
+
+        mCurConnection = connection;
+        onCustomAction(action, extras, result);
+        mCurConnection = null;
+
+        if (!result.isDone()) {
+            throw new IllegalStateException("onCustomAction must call detach() or sendResult() or "
+                    + "sendError() before returning for action=" + action + " extras="
+                    + extras);
+        }
+    }
+
     /**
      * Contains information that the browser service needs to send to the client
      * when first connected.
diff --git a/media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java b/media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java
index 0cd8ff9..afb72945 100644
--- a/media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java
+++ b/media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java
@@ -17,6 +17,7 @@
 package android.support.v4.media.session;
 
 import android.app.PendingIntent;
+import android.app.Service;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -27,15 +28,15 @@
 import android.support.v4.media.MediaBrowserCompat;
 import android.support.v4.media.MediaBrowserServiceCompat;
 import android.support.v4.media.session.PlaybackStateCompat.MediaKeyAction;
+import android.support.v4.os.BuildCompat;
 import android.util.Log;
 import android.view.KeyEvent;
 
 import java.util.List;
 
 /**
- * A media button receiver receives and helps translate hardware media playback buttons,
- * such as those found on wired and wireless headsets, into the appropriate callbacks
- * in your app.
+ * A media button receiver receives and helps translate hardware media playback buttons, such as
+ * those found on wired and wireless headsets, into the appropriate callbacks in your app.
  * <p />
  * You can add this MediaButtonReceiver to your app by adding it directly to your
  * AndroidManifest.xml:
@@ -46,13 +47,48 @@
  *   &lt;/intent-filter&gt;
  * &lt;/receiver&gt;
  * </pre>
- * This class assumes you have a media browser service implementation in your app that controls
- * media playback via a {@link MediaSessionCompat} - all {@link Intent}s received by
- * the MediaButtonReceiver will be forwarded to the {@link MediaSessionCompat}
- * associated with the token set via {@link MediaBrowserServiceCompat#setSessionToken}.
+ *
+ * This class assumes you have a {@link Service} in your app that controls media playback via a
+ * {@link MediaSessionCompat}. Once a key event is received by MediaButtonReceiver, this class tries
+ * to find a {@link Service} that can handle {@link Intent#ACTION_MEDIA_BUTTON}, and a
+ * {@link MediaBrowserServiceCompat} in turn. If an appropriate service is found, this class
+ * forwards the key event to the service. If neither is available or more than one valid
+ * service/media browser service is found, an {@link IllegalStateException} will be thrown. Thus,
+ * your app should have one of the following services to get a key event properly.
  * <p />
- * If more than one valid media browser service is found, an
- * {@link IllegalStateException} will be thrown.
+ *
+ * <h4>Service Handling ACTION_MEDIA_BUTTON</h4>
+ * A service can receive a key event by including an intent filter that handles
+ * {@link Intent#ACTION_MEDIA_BUTTON}:
+ * <pre>
+ * &lt;service android:name="com.example.android.MediaPlaybackService" &gt;
+ *   &lt;intent-filter&gt;
+ *     &lt;action android:name="android.intent.action.MEDIA_BUTTON" /&gt;
+ *   &lt;/intent-filter&gt;
+ * &lt;/service&gt;
+ * </pre>
+ *
+ * Events can then be handled in {@link Service#onStartCommand(Intent, int, int)} by calling
+ * {@link MediaButtonReceiver#handleIntent(MediaSessionCompat, Intent)}, passing in your current
+ * {@link MediaSessionCompat}:
+ * <pre>
+ * private MediaSessionCompat mMediaSessionCompat = ...;
+ *
+ * public int onStartCommand(Intent intent, int flags, int startId) {
+ *   MediaButtonReceiver.handleIntent(mMediaSessionCompat, intent);
+ *   return super.onStartCommand(intent, flags, startId);
+ * }
+ * </pre>
+ *
+ * This ensures that the correct callbacks to {@link MediaSessionCompat.Callback} will be triggered
+ * based on the incoming {@link KeyEvent}.
+ * <p class="note"><strong>Note:</strong> Once the service is started, it must start to run in the
+ * foreground.</p>
+ *
+ * <h4>MediaBrowserService</h4>
+ * If you already have a {@link MediaBrowserServiceCompat} in your app, MediaButtonReceiver will
+ * deliver the received key events to the {@link MediaBrowserServiceCompat} by default. You can
+ * handle them in your {@link MediaSessionCompat.Callback}.
  */
 public class MediaButtonReceiver extends BroadcastReceiver {
     private static final String TAG = "MediaButtonReceiver";
@@ -65,28 +101,28 @@
             Log.d(TAG, "Ignore unsupported intent: " + intent);
             return;
         }
-        Intent queryIntent = new Intent(MediaBrowserServiceCompat.SERVICE_INTERFACE);
-        queryIntent.setPackage(context.getPackageName());
-        PackageManager pm = context.getPackageManager();
-        List<ResolveInfo> resolveInfos = pm.queryIntentServices(queryIntent, 0);
-        if (resolveInfos.isEmpty()) {
-            throw new IllegalStateException("Could not find any "
-                    + "media browser service implementation");
-        } else if (resolveInfos.size() != 1) {
-            throw new IllegalStateException("Expected 1 media browser service implementation"
-                    + ", found " + resolveInfos.size());
+        ComponentName mediaButtonServiceComponentName =
+                getServiceComponentByAction(context, Intent.ACTION_MEDIA_BUTTON);
+        if (mediaButtonServiceComponentName != null) {
+            intent.setComponent(mediaButtonServiceComponentName);
+            startForegroundService(context, intent);
+            return;
         }
-        ResolveInfo resolveInfo = resolveInfos.get(0);
-        ComponentName componentName = new ComponentName(resolveInfo.serviceInfo.packageName,
-                resolveInfo.serviceInfo.name);
-        PendingResult pendingResult = goAsync();
-        Context applicationContext = context.getApplicationContext();
-        MediaButtonConnectionCallback connectionCallback =
-                new MediaButtonConnectionCallback(applicationContext, intent, pendingResult);
-        MediaBrowserCompat mediaBrowser = new MediaBrowserCompat(applicationContext,
-                componentName, connectionCallback, null);
-        connectionCallback.setMediaBrowser(mediaBrowser);
-        mediaBrowser.connect();
+        ComponentName mediaBrowserServiceComponentName = getServiceComponentByAction(context,
+                MediaBrowserServiceCompat.SERVICE_INTERFACE);
+        if (mediaBrowserServiceComponentName != null) {
+            PendingResult pendingResult = goAsync();
+            Context applicationContext = context.getApplicationContext();
+            MediaButtonConnectionCallback connectionCallback =
+                    new MediaButtonConnectionCallback(applicationContext, intent, pendingResult);
+            MediaBrowserCompat mediaBrowser = new MediaBrowserCompat(applicationContext,
+                    mediaBrowserServiceComponentName, connectionCallback, null);
+            connectionCallback.setMediaBrowser(mediaBrowser);
+            mediaBrowser.connect();
+            return;
+        }
+        throw new IllegalStateException("Could not find any Service that handles "
+                + Intent.ACTION_MEDIA_BUTTON + " or implements a media browser service.");
     }
 
     private static class MediaButtonConnectionCallback extends
@@ -146,11 +182,7 @@
      *            {@link MediaSessionCompat.Callback} set.
      * @param intent The intent to parse.
      * @return The extracted {@link KeyEvent} if found, or null.
-     * @deprecated This call is no longer required. MediaButtonReceiver automatically
-     *            forwards the {@link KeyEvent} to the {@link MediaSessionCompat} associated with
-     *            the token set via {@link MediaBrowserServiceCompat#setSessionToken}.
      */
-    @Deprecated
     public static KeyEvent handleIntent(MediaSessionCompat mediaSessionCompat, Intent intent) {
         if (mediaSessionCompat == null || intent == null
                 || !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())
@@ -250,4 +282,29 @@
         }
         return null;
     }
+
+    private static void startForegroundService(Context context, Intent intent) {
+        if (BuildCompat.isAtLeastO()) {
+            context.startForegroundService(intent);
+        } else {
+            context.startService(intent);
+        }
+    }
+
+    private static ComponentName getServiceComponentByAction(Context context, String action) {
+        PackageManager pm = context.getPackageManager();
+        Intent queryIntent = new Intent(action);
+        queryIntent.setPackage(context.getPackageName());
+        List<ResolveInfo> resolveInfos = pm.queryIntentServices(queryIntent, 0 /* flags */);
+        if (resolveInfos.size() == 1) {
+            ResolveInfo resolveInfo = resolveInfos.get(0);
+            return new ComponentName(resolveInfo.serviceInfo.packageName,
+                    resolveInfo.serviceInfo.name);
+        } else if (resolveInfos.isEmpty()) {
+            return null;
+        } else {
+            throw new IllegalStateException("Expected 1 service that handles " + action + ", found "
+                    + resolveInfos.size());
+        }
+    }
 }
diff --git a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
index a5f3ab6..fbe0934 100644
--- a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -16,7 +16,6 @@
 
 package android.support.v4.media.session;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -59,6 +58,17 @@
  * <p>
  * This is a helper for accessing features in {@link android.media.session.MediaSession}
  * introduced after API level 4 in a backwards compatible fashion.
+ * <p class="note">
+ * If MediaControllerCompat is created with a {@link MediaSessionCompat.Token session token}
+ * from another process, following methods will not work directly after the creation if the
+ * {@link MediaSessionCompat.Token session token} is not passed through a
+ * {@link android.support.v4.media.MediaBrowserCompat}:
+ * <ul>
+ * <li>{@link #getPlaybackState()}.{@link PlaybackStateCompat#getExtras() getExtras()}</li>
+ * <li>{@link #isCaptioningEnabled()}</li>
+ * <li>{@link #getRepeatMode()}</li>
+ * <li>{@link #isShuffleModeEnabled()}</li>
+ * </ul></p>
  */
 public final class MediaControllerCompat {
     static final String TAG = "MediaControllerCompat";
@@ -159,16 +169,13 @@
      *
      * @param session The session to be controlled.
      */
-    @SuppressLint("NewApi")
     public MediaControllerCompat(Context context, MediaSessionCompat session) {
         if (session == null) {
             throw new IllegalArgumentException("session must not be null");
         }
         mToken = session.getSessionToken();
 
-        if (MediaSessionCompat.isAtLeastO()) {
-            mImpl = new MediaControllerImplApi26(context, session);
-        } else if (android.os.Build.VERSION.SDK_INT >= 24) {
+        if (android.os.Build.VERSION.SDK_INT >= 24) {
             mImpl = new MediaControllerImplApi24(context, session);
         } else if (android.os.Build.VERSION.SDK_INT >= 23) {
             mImpl = new MediaControllerImplApi23(context, session);
@@ -186,7 +193,6 @@
      * @param sessionToken The token of the session to be controlled.
      * @throws RemoteException if the session is not accessible.
      */
-    @SuppressLint("NewApi")
     public MediaControllerCompat(Context context, MediaSessionCompat.Token sessionToken)
             throws RemoteException {
         if (sessionToken == null) {
@@ -194,9 +200,7 @@
         }
         mToken = sessionToken;
 
-        if (MediaSessionCompat.isAtLeastO()) {
-            mImpl = new MediaControllerImplApi26(context, sessionToken);
-        } else if (android.os.Build.VERSION.SDK_INT >= 24) {
+        if (android.os.Build.VERSION.SDK_INT >= 24) {
             mImpl = new MediaControllerImplApi24(context, sessionToken);
         } else if (android.os.Build.VERSION.SDK_INT >= 23) {
             mImpl = new MediaControllerImplApi23(context, sessionToken);
@@ -547,11 +551,8 @@
 
         boolean mRegistered = false;
 
-        @SuppressLint("NewApi")
         public Callback() {
-            if (MediaSessionCompat.isAtLeastO()) {
-                mCallbackObj = MediaControllerCompatApi26.createCallback(new StubApi26());
-            } else if (android.os.Build.VERSION.SDK_INT >= 21) {
+            if (android.os.Build.VERSION.SDK_INT >= 21) {
                 mCallbackObj = MediaControllerCompatApi21.createCallback(new StubApi21());
             } else {
                 mCallbackObj = new StubCompat();
@@ -726,18 +727,6 @@
             }
         }
 
-        private class StubApi26 extends StubApi21 implements MediaControllerCompatApi26.Callback {
-            @Override
-            public void onRepeatModeChanged(@PlaybackStateCompat.RepeatMode int repeatMode) {
-                Callback.this.onRepeatModeChanged(repeatMode);
-            }
-
-            @Override
-            public void onShuffleModeChanged(boolean enabled) {
-                Callback.this.onShuffleModeChanged(enabled);
-            }
-        }
-
         private class StubCompat extends IMediaControllerCallback.Stub {
 
             StubCompat() {
@@ -2310,80 +2299,4 @@
             MediaControllerCompatApi24.TransportControls.prepareFromUri(mControlsObj, uri, extras);
         }
     }
-
-    @RequiresApi(26)
-    static class MediaControllerImplApi26 extends MediaControllerImplApi24 {
-
-        MediaControllerImplApi26(Context context, MediaSessionCompat session) {
-            super(context, session);
-        }
-
-        MediaControllerImplApi26(Context context, MediaSessionCompat.Token sessionToken)
-                throws RemoteException {
-            super(context, sessionToken);
-        }
-
-        @Override
-        public TransportControls getTransportControls() {
-            Object controlsObj = MediaControllerCompatApi21.getTransportControls(mControllerObj);
-            return controlsObj != null ? new TransportControlsApi26(controlsObj) : null;
-        }
-
-        @Override
-        public int getRepeatMode() {
-            return MediaControllerCompatApi26.getRepeatMode(mControllerObj);
-        }
-
-        @Override
-        public boolean isShuffleModeEnabled() {
-            return MediaControllerCompatApi26.isShuffleModeEnabled(mControllerObj);
-        }
-
-        @Override
-        public void addQueueItem(MediaDescriptionCompat description) {
-            MediaControllerCompatApi26.addQueueItem(
-                    mControllerObj,
-                    description == null ? null : description.getMediaDescription());
-        }
-
-        @Override
-        public void addQueueItem(MediaDescriptionCompat description, int index) {
-            MediaControllerCompatApi26.addQueueItem(
-                    mControllerObj,
-                    description == null ? null : description.getMediaDescription(),
-                    index);
-        }
-
-        @Override
-        public void removeQueueItem(MediaDescriptionCompat description) {
-            MediaControllerCompatApi26.removeQueueItem(
-                    mControllerObj,
-                    description == null ? null : description.getMediaDescription());
-        }
-
-        @Override
-        public void removeQueueItemAt(int index) {
-            MediaControllerCompatApi26.removeQueueItemAt(mControllerObj, index);
-        }
-    }
-
-    @RequiresApi(26)
-    static class TransportControlsApi26 extends TransportControlsApi24 {
-
-        TransportControlsApi26(Object controlsObj) {
-            super(controlsObj);
-        }
-
-        @Override
-        public void setRepeatMode(@PlaybackStateCompat.RepeatMode int repeatMode) {
-            MediaControllerCompatApi26.TransportControls.setRepeatMode(mControlsObj, repeatMode);
-        }
-
-        @Override
-        public void setShuffleModeEnabled(boolean enabled) {
-            MediaControllerCompatApi26.TransportControls.setShuffleModeEnabled(mControlsObj,
-                    enabled);
-        }
-    }
-
 }
diff --git a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
index 88b0948..f0bceca 100644
--- a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -19,7 +19,6 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -308,7 +307,7 @@
         }
         if (android.os.Build.VERSION.SDK_INT >= 21) {
             mImpl = new MediaSessionImplApi21(context, tag);
-            if (!isAtLeastO()) {
+            if (!BuildCompat.isAtLeastO()) {
                 // Set default callback to respond to controllers' extra binder requests.
                 setCallback(new Callback() {});
             }
@@ -330,7 +329,7 @@
 
     private MediaSessionCompat(Context context, MediaSessionImpl impl) {
         mImpl = impl;
-        if (android.os.Build.VERSION.SDK_INT >= 21 && !isAtLeastO()) {
+        if (android.os.Build.VERSION.SDK_INT >= 21 && !BuildCompat.isAtLeastO()) {
             // Set default callback to respond to controllers' extra binder requests.
             setCallback(new Callback() {});
         }
@@ -711,10 +710,6 @@
         return null;
     }
 
-    static boolean isAtLeastO() {
-        return BuildCompat.isAtLeastO() || android.os.Build.VERSION.SDK_INT >= 26;
-    }
-
     /**
      * Receives transport controls, media buttons, and commands from controllers
      * and the system. The callback may be set using {@link #setCallback}.
@@ -723,11 +718,8 @@
         final Object mCallbackObj;
         WeakReference<MediaSessionImpl> mSessionImpl;
 
-        @SuppressLint("NewApi")
         public Callback() {
-            if (isAtLeastO()) {
-                mCallbackObj = MediaSessionCompatApi26.createCallback(new StubApi26());
-            } else if (android.os.Build.VERSION.SDK_INT >= 24) {
+            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());
@@ -1162,42 +1154,6 @@
                 Callback.this.onPrepareFromUri(uri, extras);
             }
         }
-
-        @RequiresApi(26)
-        private class StubApi26 extends StubApi24 implements MediaSessionCompatApi26.Callback {
-            @Override
-            public void onSetRepeatMode(int repeatMode) {
-                Callback.this.onSetRepeatMode(repeatMode);
-            }
-
-            @Override
-            public void onSetShuffleModeEnabled(boolean enabled) {
-                Callback.this.onSetShuffleModeEnabled(enabled);
-            }
-
-            @Override
-            public void onAddQueueItem(Object descriptionObject) {
-                Callback.this.onAddQueueItem(
-                        MediaDescriptionCompat.fromMediaDescription(descriptionObject));
-            }
-
-            @Override
-            public void onAddQueueItem(Object descriptionObject, int index) {
-                Callback.this.onAddQueueItem(
-                        MediaDescriptionCompat.fromMediaDescription(descriptionObject), index);
-            }
-
-            @Override
-            public void onRemoveQueueItem(Object descriptionObject) {
-                Callback.this.onRemoveQueueItem(
-                        MediaDescriptionCompat.fromMediaDescription(descriptionObject));
-            }
-
-            @Override
-            public void onRemoveQueueItemAt(int index) {
-                Callback.this.onRemoveQueueItemAt(index);
-            }
-        }
     }
 
     /**
@@ -2946,7 +2902,7 @@
         public void setCallback(Callback callback, Handler handler) {
             MediaSessionCompatApi21.setCallback(mSessionObj,
                     callback == null ? null : callback.mCallbackObj, handler);
-            if (!isAtLeastO() && callback != null) {
+            if (!BuildCompat.isAtLeastO() && callback != null) {
                 callback.mSessionImpl = new WeakReference<MediaSessionImpl>(this);
             }
         }
@@ -3078,45 +3034,35 @@
             }
         }
 
-        @SuppressLint("NewApi")
         @Override
         public void setRepeatMode(@PlaybackStateCompat.RepeatMode int repeatMode) {
-            if (!isAtLeastO()) {
-                if (mRepeatMode != repeatMode) {
-                    mRepeatMode = repeatMode;
-                    int size = mExtraControllerCallbacks.beginBroadcast();
-                    for (int i = size - 1; i >= 0; i--) {
-                        IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
-                        try {
-                            cb.onRepeatModeChanged(repeatMode);
-                        } catch (RemoteException e) {
-                        }
+            if (mRepeatMode != repeatMode) {
+                mRepeatMode = repeatMode;
+                int size = mExtraControllerCallbacks.beginBroadcast();
+                for (int i = size - 1; i >= 0; i--) {
+                    IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
+                    try {
+                        cb.onRepeatModeChanged(repeatMode);
+                    } catch (RemoteException e) {
                     }
-                    mExtraControllerCallbacks.finishBroadcast();
                 }
-            } else {
-                MediaSessionCompatApi26.setRepeatMode(mSessionObj, repeatMode);
+                mExtraControllerCallbacks.finishBroadcast();
             }
         }
 
-        @SuppressLint("NewApi")
         @Override
         public void setShuffleModeEnabled(boolean enabled) {
-            if (!isAtLeastO()) {
-                if (mShuffleModeEnabled != enabled) {
-                    mShuffleModeEnabled = enabled;
-                    int size = mExtraControllerCallbacks.beginBroadcast();
-                    for (int i = size - 1; i >= 0; i--) {
-                        IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
-                        try {
-                            cb.onShuffleModeChanged(enabled);
-                        } catch (RemoteException e) {
-                        }
+            if (mShuffleModeEnabled != enabled) {
+                mShuffleModeEnabled = enabled;
+                int size = mExtraControllerCallbacks.beginBroadcast();
+                for (int i = size - 1; i >= 0; i--) {
+                    IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
+                    try {
+                        cb.onShuffleModeChanged(enabled);
+                    } catch (RemoteException e) {
                     }
-                    mExtraControllerCallbacks.finishBroadcast();
                 }
-            } else {
-                MediaSessionCompatApi26.setShuffleModeEnabled(mSessionObj, enabled);
+                mExtraControllerCallbacks.finishBroadcast();
             }
         }
 
diff --git a/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
index 5d9f84e..f99b435 100644
--- a/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
+++ b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
@@ -777,11 +777,10 @@
                         mBufferedPosition,
                         mSpeed, mActions, mErrorMessage, mUpdateTime,
                         customActions, mActiveItemId, mExtras);
-            } else if (Build.VERSION.SDK_INT >= 21) {
-                // The extra conditional is necessary to pass the NewApi Lint inspection.
+            } else {
+                //noinspection AndroidLintNewApi - NewApi lint fails to handle nested checks.
                 mStateObj = PlaybackStateCompatApi21.newInstance(mState, mPosition,
-                        mBufferedPosition,
-                        mSpeed, mActions, mErrorMessage, mUpdateTime,
+                        mBufferedPosition, mSpeed, mActions, mErrorMessage, mUpdateTime,
                         customActions, mActiveItemId);
             }
         }
diff --git a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
index 5227c30..d3d6d20 100644
--- a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
@@ -159,6 +159,46 @@
 
     @Test
     @SmallTest
+    public void testSecondConnection() {
+        resetCallbacks();
+        createMediaBrowser(TEST_BROWSER_SERVICE);
+        connectMediaBrowserService();
+
+        mMediaBrowser.disconnect();
+        // We need to sleep some time here, because the browser may not be ready to connect yet.
+        try {
+            Thread.sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            fail("Unexpected InterruptedException occurred.");
+        }
+
+        // Connect to the service again.
+        resetCallbacks();
+        connectMediaBrowserService();
+
+        // Test subscribe.
+        resetCallbacks();
+        mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, mSubscriptionCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mSubscriptionCallback.mChildrenLoadedCount > 0;
+            }
+        }.run();
+
+        // Test getItem.
+        resetCallbacks();
+        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], mItemCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mItemCallback.mLastMediaItem != null;
+            }
+        }.run();
+    }
+
+    @Test
+    @SmallTest
     public void testGetServiceComponentBeforeConnection() {
         resetCallbacks();
         createMediaBrowser(TEST_BROWSER_SERVICE);
diff --git a/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java b/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
index 4db73af..abd4214 100644
--- a/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
@@ -28,6 +28,7 @@
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.testutils.PollingCheck;
 import android.support.v4.media.MediaBrowserCompat.MediaItem;
 
 import org.junit.Before;
@@ -47,6 +48,14 @@
     private static final ComponentName TEST_BROWSER_SERVICE = new ComponentName(
             "android.support.mediacompat.test",
             "android.support.v4.media.StubMediaBrowserServiceCompat");
+    private static final String TEST_KEY_1 = "key_1";
+    private static final String TEST_VALUE_1 = "value_1";
+    private static final String TEST_KEY_2 = "key_2";
+    private static final String TEST_VALUE_2 = "value_2";
+    private static final String TEST_KEY_3 = "key_3";
+    private static final String TEST_VALUE_3 = "value_3";
+    private static final String TEST_KEY_4 = "key_4";
+    private static final String TEST_VALUE_4 = "value_4";
     private final Object mWaitLock = new Object();
 
     private final ConnectionCallback mConnectionCallback = new ConnectionCallback();
@@ -76,6 +85,8 @@
             mWaitLock.wait(TIME_OUT_MS);
         }
         assertNotNull(mMediaBrowserService);
+        mMediaBrowserService.mCustomActionExtras = null;
+        mMediaBrowserService.mCustomActionResult = null;
     }
 
     @Test
@@ -211,6 +222,142 @@
 
     @Test
     @SmallTest
+    public void testSendCustomAction() throws Exception {
+        synchronized (mWaitLock) {
+            CustomActionCallback callback = new CustomActionCallback();
+            Bundle extras = new Bundle();
+            extras.putString(TEST_KEY_1, TEST_VALUE_1);
+            mMediaBrowser.sendCustomAction(StubMediaBrowserServiceCompat.CUSTOM_ACTION, extras,
+                    callback);
+            new PollingCheck(TIME_OUT_MS) {
+                @Override
+                protected boolean check() {
+                    return mMediaBrowserService.mCustomActionResult != null;
+                }
+            }.run();
+            assertNotNull(mMediaBrowserService.mCustomActionResult);
+            assertNotNull(mMediaBrowserService.mCustomActionExtras);
+            assertEquals(TEST_VALUE_1,
+                    mMediaBrowserService.mCustomActionExtras.getString(TEST_KEY_1));
+
+            callback.reset();
+            Bundle bundle1 = new Bundle();
+            bundle1.putString(TEST_KEY_2, TEST_VALUE_2);
+            mMediaBrowserService.mCustomActionResult.sendProgressUpdate(bundle1);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnProgressUpdateCalled);
+            assertNotNull(callback.mExtras);
+            assertEquals(TEST_VALUE_1, callback.mExtras.getString(TEST_KEY_1));
+            assertNotNull(callback.mData);
+            assertEquals(TEST_VALUE_2, callback.mData.getString(TEST_KEY_2));
+
+            callback.reset();
+            Bundle bundle2 = new Bundle();
+            bundle2.putString(TEST_KEY_3, TEST_VALUE_3);
+            mMediaBrowserService.mCustomActionResult.sendProgressUpdate(bundle2);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnProgressUpdateCalled);
+            assertNotNull(callback.mExtras);
+            assertEquals(TEST_VALUE_1, callback.mExtras.getString(TEST_KEY_1));
+            assertNotNull(callback.mData);
+            assertEquals(TEST_VALUE_3, callback.mData.getString(TEST_KEY_3));
+
+            Bundle bundle3 = new Bundle();
+            bundle3.putString(TEST_KEY_4, TEST_VALUE_4);
+            callback.reset();
+            mMediaBrowserService.mCustomActionResult.sendResult(bundle3);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnResultCalled);
+            assertNotNull(callback.mExtras);
+            assertEquals(TEST_VALUE_1, callback.mExtras.getString(TEST_KEY_1));
+            assertNotNull(callback.mData);
+            assertEquals(TEST_VALUE_4, callback.mData.getString(TEST_KEY_4));
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testSendCustomActionWithDetachedError() throws Exception {
+        synchronized (mWaitLock) {
+            CustomActionCallback callback = new CustomActionCallback();
+            Bundle extras = new Bundle();
+            extras.putString(TEST_KEY_1, TEST_VALUE_1);
+            mMediaBrowser.sendCustomAction(StubMediaBrowserServiceCompat.CUSTOM_ACTION, extras,
+                    callback);
+            new PollingCheck(TIME_OUT_MS) {
+                @Override
+                protected boolean check() {
+                    return mMediaBrowserService.mCustomActionResult != null;
+                }
+            }.run();
+            assertNotNull(mMediaBrowserService.mCustomActionResult);
+            assertNotNull(mMediaBrowserService.mCustomActionExtras);
+            assertEquals(TEST_VALUE_1,
+                    mMediaBrowserService.mCustomActionExtras.getString(TEST_KEY_1));
+
+            callback.reset();
+            Bundle bundle1 = new Bundle();
+            bundle1.putString(TEST_KEY_2, TEST_VALUE_2);
+            mMediaBrowserService.mCustomActionResult.sendProgressUpdate(bundle1);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnProgressUpdateCalled);
+            assertNotNull(callback.mExtras);
+            assertEquals(TEST_VALUE_1, callback.mExtras.getString(TEST_KEY_1));
+            assertNotNull(callback.mData);
+            assertEquals(TEST_VALUE_2, callback.mData.getString(TEST_KEY_2));
+
+            callback.reset();
+            Bundle bundle2 = new Bundle();
+            bundle2.putString(TEST_KEY_3, TEST_VALUE_3);
+            mMediaBrowserService.mCustomActionResult.sendError(bundle2);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnErrorCalled);
+            assertNotNull(callback.mExtras);
+            assertEquals(TEST_VALUE_1, callback.mExtras.getString(TEST_KEY_1));
+            assertNotNull(callback.mData);
+            assertEquals(TEST_VALUE_3, callback.mData.getString(TEST_KEY_3));
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testSendCustomActionWithNullCallback() throws Exception {
+        Bundle extras = new Bundle();
+        extras.putString(TEST_KEY_1, TEST_VALUE_1);
+        mMediaBrowser.sendCustomAction(StubMediaBrowserServiceCompat.CUSTOM_ACTION, extras, null);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mMediaBrowserService.mCustomActionResult != null;
+            }
+        }.run();
+        assertNotNull(mMediaBrowserService.mCustomActionResult);
+        assertNotNull(mMediaBrowserService.mCustomActionExtras);
+        assertEquals(TEST_VALUE_1, mMediaBrowserService.mCustomActionExtras.getString(TEST_KEY_1));
+    }
+
+    @Test
+    @SmallTest
+    public void testSendCustomActionWithError() throws Exception {
+        synchronized (mWaitLock) {
+            CustomActionCallback callback = new CustomActionCallback();
+            mMediaBrowser.sendCustomAction(StubMediaBrowserServiceCompat.CUSTOM_ACTION_FOR_ERROR,
+                    null, callback);
+            new PollingCheck(TIME_OUT_MS) {
+                @Override
+                protected boolean check() {
+                    return mMediaBrowserService.mCustomActionResult != null;
+                }
+            }.run();
+            assertNotNull(mMediaBrowserService.mCustomActionResult);
+            assertNull(mMediaBrowserService.mCustomActionExtras);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertTrue(callback.mOnErrorCalled);
+        }
+    }
+
+    @Test
+    @SmallTest
     public void testBrowserRoot() {
         final String id = "test-id";
         final String key = "test-key";
@@ -329,4 +476,55 @@
             mSearchResults = null;
         }
     }
+
+    private class CustomActionCallback extends MediaBrowserCompat.CustomActionCallback {
+        String mAction;
+        Bundle mExtras;
+        Bundle mData;
+        boolean mOnProgressUpdateCalled;
+        boolean mOnResultCalled;
+        boolean mOnErrorCalled;
+
+        @Override
+        public void onProgressUpdate(String action, Bundle extras, Bundle data) {
+            synchronized (mWaitLock) {
+                mOnProgressUpdateCalled = true;
+                mAction = action;
+                mExtras = extras;
+                mData = data;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onResult(String action, Bundle extras, Bundle resultData) {
+            synchronized (mWaitLock) {
+                mOnResultCalled = true;
+                mAction = action;
+                mExtras = extras;
+                mData = resultData;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onError(String action, Bundle extras, Bundle data) {
+            synchronized (mWaitLock) {
+                mOnErrorCalled = true;
+                mAction = action;
+                mExtras = extras;
+                mData = data;
+                mWaitLock.notify();
+            }
+        }
+
+        public void reset() {
+            mOnResultCalled = false;
+            mOnProgressUpdateCalled = false;
+            mOnErrorCalled = false;
+            mAction = null;
+            mExtras = null;
+            mData = null;
+        }
+    }
 }
diff --git a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
index d93af38..c817dce 100644
--- a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
+++ b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
@@ -33,6 +33,7 @@
     static final String EXTRAS_KEY = "test_extras_key";
     static final String EXTRAS_VALUE = "test_extras_value";
 
+    static final String MEDIA_ID = "test_media_id";
     static final String MEDIA_ID_INVALID = "test_media_id_invalid";
     static final String MEDIA_ID_ROOT = "test_media_id_root";
     static final String MEDIA_ID_CHILDREN_DELAYED = "test_media_id_children_delayed";
@@ -49,6 +50,9 @@
     static final String SEARCH_QUERY_FOR_NO_RESULT = "query no result";
     static final String SEARCH_QUERY_FOR_ERROR = "query for error";
 
+    static final String CUSTOM_ACTION = "CUSTOM_ACTION";
+    static final String CUSTOM_ACTION_FOR_ERROR = "CUSTOM_ACTION_FOR_ERROR";
+
     static StubMediaBrowserServiceCompat sInstance;
 
     /* package private */ static MediaSessionCompat sSession;
@@ -57,6 +61,9 @@
     private Result<MediaItem> mPendingLoadItemResult;
     private Bundle mPendingRootHints;
 
+    /* package private */ Bundle mCustomActionExtras;
+    /* package private */ Result<Bundle> mCustomActionResult;
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -133,6 +140,18 @@
         }
     }
 
+    @Override
+    public void onCustomAction(String action, Bundle extras,
+            Result<Bundle> result) {
+        mCustomActionResult = result;
+        mCustomActionExtras = extras;
+        if (CUSTOM_ACTION_FOR_ERROR.equals(action)) {
+            result.sendError(null);
+        } else if (CUSTOM_ACTION.equals(action)) {
+            result.detach();
+        }
+    }
+
     public void sendDelayedNotifyChildrenChanged() {
         if (mPendingLoadChildrenResult != null) {
             mPendingLoadChildrenResult.sendResult(Collections.<MediaItem>emptyList());
diff --git a/pathmap.mk b/pathmap.mk
index a6f6a38..a389936 100644
--- a/pathmap.mk
+++ b/pathmap.mk
@@ -27,7 +27,6 @@
     dynamic-animation \
     exifinterface \
     fragment \
-    instantvideo \
     media-compat \
     percent \
     recommendation \
@@ -56,7 +55,7 @@
     frameworks/support/v7/recyclerview/src \
     frameworks/support/emoji/core/src \
     frameworks/support/emoji/appcompat/src \
-    frameworks/support/emoji/bundled-typeface/src
+    frameworks/support/emoji/bundled/src
 
 #
 # A list of support library modules.
diff --git a/recommendation/Android.mk b/recommendation/Android.mk
index 4c27532..99ba65f 100644
--- a/recommendation/Android.mk
+++ b/recommendation/Android.mk
@@ -24,7 +24,7 @@
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-recommendation
-LOCAL_SDK_VERSION := 21
+LOCAL_SDK_VERSION := current
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java b/samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
index 4a6181d..78d64cd 100644
--- a/samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
+++ b/samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
@@ -62,7 +62,7 @@
         setContentView(R.layout.commit_content);
 
         final LinearLayout layout =
-                (LinearLayout) findViewById(R.id.commit_content_sample_edit_boxes);
+                findViewById(R.id.commit_content_sample_edit_boxes);
 
         // This declares that the IME cannot commit any content with
         // InputConnectionCompat#commitContent().
@@ -90,12 +90,12 @@
         layout.addView(createEditTextWithContentMimeTypes(
                 new String[]{"image/png", "image/gif", "image/jpeg", "image/webp"}));
 
-        mWebView = (WebView) findViewById(R.id.commit_content_webview);
-        mMimeTypes = (TextView) findViewById(R.id.text_commit_content_mime_types);
-        mLabel = (TextView) findViewById(R.id.text_commit_content_label);
-        mContentUri = (TextView) findViewById(R.id.text_commit_content_content_uri);
-        mLinkUri = (TextView) findViewById(R.id.text_commit_content_link_uri);
-        mFlags = (TextView) findViewById(R.id.text_commit_content_link_flags);
+        mWebView = findViewById(R.id.commit_content_webview);
+        mMimeTypes = findViewById(R.id.text_commit_content_mime_types);
+        mLabel = findViewById(R.id.text_commit_content_label);
+        mContentUri = findViewById(R.id.text_commit_content_content_uri);
+        mLinkUri = findViewById(R.id.text_commit_content_link_uri);
+        mFlags = findViewById(R.id.text_commit_content_link_flags);
 
         if (savedInstanceState != null) {
             final InputContentInfoCompat previousInputContentInfo = InputContentInfoCompat.wrap(
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
index 18c3c3e..4ffc0ef 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
@@ -61,7 +61,7 @@
         setContentView(R.layout.accessibility_manager);
         mAccessibilityManager = (AccessibilityManager) getSystemService(
                 Service.ACCESSIBILITY_SERVICE);
-        mAccessibilityStateView = (TextView) findViewById(R.id.accessibility_state);
+        mAccessibilityStateView = findViewById(R.id.accessibility_state);
         registerAccessibilityStateChangeListener();
     }
 
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
index 5715ea4..512458b 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
@@ -42,29 +42,29 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.accessibility_roledescription);
 
-        TextView firstTextView = (TextView) findViewById(R.id.text_view_1);
+        TextView firstTextView = 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);
+        TextView heading1 = 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);
+        TextView heading2 = 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);
+        TextView heading3 = 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);
+        Button button = findViewById(R.id.button);
         String roleDescriptionButton =
             getString(R.string.accessibility_roledescription_button_role);
         ViewCompat.setAccessibilityDelegate(button,
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
index 917b614..871f430 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
@@ -40,7 +40,7 @@
         setContentView(R.layout.fragment_stack);
 
         // Watch for button clicks.
-        Button button = (Button) findViewById(R.id.new_fragment);
+        Button button = findViewById(R.id.new_fragment);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
index 751b0e1..786c53d 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
@@ -41,14 +41,14 @@
         setContentView(R.layout.fragment_stack);
 
         // Watch for button clicks.
-        Button button = (Button) findViewById(R.id.new_fragment);
+        Button button = findViewById(R.id.new_fragment);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 addFragmentToStack();
             }
         });
-        button = (Button) findViewById(R.id.home);
+        button = findViewById(R.id.home);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
index d1efa2d..e505868 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
@@ -51,13 +51,13 @@
         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);
+        TextView info = 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);
+        TextView tv = findViewById(R.id.text);
         StringBuilder txt = new StringBuilder("Received share!\nText was: ");
 
         txt.append(intentReader.getText());
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
index f679067..1a0934a 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
@@ -42,14 +42,14 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.drawable_compat);
 
-        mImageView = (ImageView) findViewById(R.id.image);
+        mImageView = 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);
+        RadioGroup rg = findViewById(R.id.drawable_compat_options);
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup radioGroup, int id) {
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
index d89d462..8f54a59 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
@@ -46,8 +46,8 @@
         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);
+        ToggleButton toggle = findViewById(R.id.toggle_round);
+        ImageView image = findViewById(R.id.image);
 
         // Set up initial view state and on checked change listener.
         image.setImageDrawable(mRoundedBitmapDrawable);
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
index 168a8b6..308be31 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
@@ -39,10 +39,10 @@
 
         String formattedText = String.format(text, phone);
 
-        TextView tv_sample = (TextView) findViewById(R.id.textview_without_bidiformatter);
+        TextView tv_sample = findViewById(R.id.textview_without_bidiformatter);
         tv_sample.setText(formattedText);
 
-        TextView tv_bidiformatter = (TextView) findViewById(R.id.textview_with_bidiformatter);
+        TextView tv_bidiformatter = 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/ViewPagerActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
index 487e8db..6b18846 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
@@ -46,10 +46,10 @@
         mAdapter.add("Green", Color.GREEN);
         mAdapter.add("Blue", Color.BLUE);
 
-        mPager = (ViewPager) findViewById(R.id.pager);
+        mPager = findViewById(R.id.pager);
         mPager.setAdapter(mAdapter);
 
-        mTitles = (PagerTitleStrip) findViewById(R.id.titles);
+        mTitles = findViewById(R.id.titles);
     }
 
     private static class ColorPagerAdapter extends PagerAdapter {
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
index c617507..86c7d70 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
@@ -89,7 +89,7 @@
         super.onCreate(bundle);
         setContentView(getLayoutId());
 
-        mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget);
+        mSwipeRefreshWidget = findViewById(R.id.swipe_refresh_widget);
         mSwipeRefreshWidget.setColorSchemeResources(R.color.color1, R.color.color2, R.color.color3,
                 R.color.color4);
         mSwipeRefreshWidget.setOnRefreshListener(this);
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
index 10db8f3..f85105f 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
@@ -73,7 +73,7 @@
 
         setContentView(R.layout.explore_by_touch_helper);
 
-        final CustomView customView = (CustomView) findViewById(R.id.custom_view);
+        final 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);
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
index 1621e6d..73798ed 100644
--- a/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
@@ -75,9 +75,9 @@
 
         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 = findViewById(R.id.sliding_pane_layout);
+        mList = findViewById(R.id.left_pane);
+        mContent = findViewById(R.id.content_text);
 
         mSlidingLayout.setPanelSlideListener(new SliderListener());
         mSlidingLayout.openPane();
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
index 0635231..25b2427 100644
--- a/samples/Support7Demos/AndroidManifest.xml
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -263,6 +263,15 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".app.MenuItemIconTinting"
+                  android:label="@string/menu_item_icon_tinting"
+                  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.ToolbarUsage"
                   android:label="@string/toolbar_usage"
                   android:theme="@style/Theme.Custom.NoActionBar">
diff --git a/samples/Support7Demos/res/menu/menu_with_tinted_icons.xml b/samples/Support7Demos/res/menu/menu_with_tinted_icons.xml
new file mode 100644
index 0000000..62522b8
--- /dev/null
+++ b/samples/Support7Demos/res/menu/menu_with_tinted_icons.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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_first"
+        android:icon="@drawable/ic_search"
+        android:title="@string/action_bar_search"
+        app:iconTint="@color/color_sky_night"
+        app:showAsAction="always"/>
+
+    <item
+        android:id="@+id/menu_second"
+        android:icon="@drawable/ic_media_play"
+        android:title="@string/action_bar_add"
+        app:iconTint="@color/color_sky_day"
+        app:iconTintMode="multiply"
+        app:showAsAction="always"/>
+
+    <item
+        android:id="@+id/menu_third"
+        android:icon="@drawable/ic_media_pause"
+        android:title="@string/action_bar_edit"
+        app:iconTint="@color/color_sky"
+        app:iconTintMode="screen"
+        app:showAsAction="always"/>
+
+    <item
+        android:id="@+id/menu_fourth"
+        android:icon="@android:drawable/ic_menu_share"
+        android:title="@string/action_bar_share"/>
+
+    <item
+        android:id="@+id/menu_fifth"
+        android:icon="@android:drawable/ic_menu_sort_by_size"
+        android:title="@string/action_bar_sort"/>
+
+</menu>
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
index c5ffe46..097807f 100644
--- a/samples/Support7Demos/res/values/strings.xml
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -243,5 +243,7 @@
     <string name="text_plain_disabled">Plain disabled</string>
     <string name="text_link_enabled">With <a href="http://www.google.com">link</a> enabled</string>
     <string name="text_link_disabled">With <a href="http://www.google.com">link</a> disabled</string>
+
+    <string name="menu_item_icon_tinting">AppCompat/Menu Item Icons</string>
 </resources>
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
index 560111b..4fdcabb 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
@@ -37,7 +37,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.alert_dialog_usage);
 
-        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+        mSpinner = findViewById(R.id.spinner_dialogs);
 
         // Add an OnClickListener to show our selected dialog
         findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
index 888bdc8..ecb6f58 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
@@ -31,7 +31,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.appcompat_animated_vector);
 
-        final ImageView imageView = (ImageView) findViewById(R.id.vector_image);
+        final ImageView imageView = findViewById(R.id.vector_image);
         if (imageView != null) {
             final Drawable src = imageView.getDrawable();
             if (src instanceof Animatable) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
index 2d22b99..572b373 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
@@ -34,11 +34,11 @@
         setContentView(R.layout.appcompat_widgets_text_spinners);
 
         // Fetch the Spinners and set an adapter
-        Spinner spinner = (Spinner) findViewById(R.id.widgets_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 = 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
index c94bd19..a8b0d6b 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
@@ -37,13 +37,13 @@
         setContentView(R.layout.appcompat_widgets_text_input);
 
         // Fetch the AutoCompleteTextView and set an adapter
-        AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(
+        AutoCompleteTextView actv = 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(
+        MultiAutoCompleteTextView mactv = findViewById(
                 R.id.widgets_multiautocompletetextview);
         mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
         mactv.setAdapter(new ArrayAdapter<>(this,
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
index 4661a06..e41ab6c 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
@@ -43,7 +43,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.dialog_usage);
 
-        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+        mSpinner = findViewById(R.id.spinner_dialogs);
 
         // Add an OnClickListener to show our selected dialog
         findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
index e2d770b..be5da4b 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
@@ -40,7 +40,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.dialog_usage);
 
-        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+        mSpinner = findViewById(R.id.spinner_dialogs);
 
         // Add an OnClickListener to show our selected dialog
         findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/MenuItemIconTinting.java b/samples/Support7Demos/src/com/example/android/supportv7/app/MenuItemIconTinting.java
new file mode 100644
index 0000000..e5f37f6
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/MenuItemIconTinting.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+import com.example.android.supportv7.R;
+
+/**
+ * This demonstrates icon tinting on menu items.
+ */
+public class MenuItemIconTinting 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.menu_with_tinted_icons, 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/ToolbarActionMode.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
index 3977048..6e11eba 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
@@ -37,7 +37,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.toolbar_action_mode);
 
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
         findViewById(R.id.btn_start_action_mode).setOnClickListener(new View.OnClickListener() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
index e6d179b..765ddef 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
@@ -42,7 +42,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.toolbar_display_options);
 
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
         findViewById(R.id.toggle_home_as_up).setOnClickListener(this);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
index 78e8224..bb6ba79 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
@@ -49,10 +49,10 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.toolbar_fragment_pager);
 
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
-        ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
+        ViewPager vp = findViewById(R.id.viewpager);
         PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(),
                 new MenuFragment(), new Menu2Fragment());
         vp.setAdapter(adapter);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
index 5acabea..0710e24 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
@@ -38,7 +38,7 @@
         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);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
     }
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
index 794863b..273a2ca 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
@@ -62,8 +62,8 @@
 
         mImageUri = getIntent().getData();
 
-        mImageView = (ImageView) findViewById(R.id.image);
-        mGridView = (GridView) findViewById(R.id.palette);
+        mImageView = findViewById(R.id.image);
+        mGridView = findViewById(R.id.palette);
         mSwatchesPalette = new SwatchesPalette();
         mGridView.setAdapter(mSwatchesPalette);
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
index 363245f..846c5e0 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
@@ -298,7 +298,7 @@
             }
         });
 
-        mLibraryView = (ListView) findViewById(R.id.media);
+        mLibraryView = findViewById(R.id.media);
         mLibraryView.setAdapter(mLibraryItems);
         mLibraryView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
         mLibraryView.setOnItemClickListener(new OnItemClickListener() {
@@ -308,7 +308,7 @@
             }
         });
 
-        mPlayListView = (ListView) findViewById(R.id.playlist);
+        mPlayListView = findViewById(R.id.playlist);
         mPlayListView.setAdapter(mPlayListItems);
         mPlayListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
         mPlayListView.setOnItemClickListener(new OnItemClickListener() {
@@ -318,9 +318,9 @@
             }
         });
 
-        mInfoTextView = (TextView) findViewById(R.id.info);
+        mInfoTextView = findViewById(R.id.info);
 
-        mUseDefaultControlCheckBox = (CheckBox) findViewById(R.id.custom_control_view_checkbox);
+        mUseDefaultControlCheckBox = findViewById(R.id.custom_control_view_checkbox);
         if (ENABLE_DEFAULT_CONTROL_CHECK_BOX) {
             mUseDefaultControlCheckBox.setVisibility(View.VISIBLE);
         }
@@ -344,7 +344,7 @@
             }
         });
 
-        mSeekBar = (SeekBar) findViewById(R.id.seekbar);
+        mSeekBar = findViewById(R.id.seekbar);
         mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
index b2e7094..87c6546 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
@@ -44,7 +44,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.sorted_list_activity);
-        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView = findViewById(R.id.recycler_view);
         mRecyclerView.setHasFixedSize(true);
         mLinearLayoutManager = new LinearLayoutManager(this);
         mRecyclerView.setLayoutManager(mLinearLayoutManager);
@@ -53,7 +53,7 @@
                 new Item("wash the dishes"));
         mRecyclerView.setAdapter(mAdapter);
         mRecyclerView.setHasFixedSize(true);
-        final EditText newItemTextView = (EditText) findViewById(R.id.new_item_text_view);
+        final EditText newItemTextView = findViewById(R.id.new_item_text_view);
         newItemTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
             @Override
             public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
index 82d0790..5649320 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
@@ -108,34 +108,34 @@
     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);
+        mInfoText = findViewById(R.id.info_text);
+        mCardView = findViewById(R.id.card_view);
+        mCornerRadiusSeekBar = findViewById(R.id.corner_radius_seek_bar);
         mCornerRadiusSeekBar.setProgress((int) mCardView.getRadius());
         mCornerRadiusSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        mWidthSeekBar = (SeekBar) findViewById(R.id.width_seek_bar);
+        mWidthSeekBar = findViewById(R.id.width_seek_bar);
         mWidthSeekBar.setProgress(mCardView.getLayoutParams().width);
 
         mWidthSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        mHeightSeekBar = (SeekBar) findViewById(R.id.height_seek_bar);
+        mHeightSeekBar = findViewById(R.id.height_seek_bar);
         mHeightSeekBar.setProgress(mCardView.getLayoutParams().height);
         mHeightSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        mElevationSeekBar = (SeekBar) findViewById(R.id.elevation_seek_bar);
+        mElevationSeekBar = findViewById(R.id.elevation_seek_bar);
         mElevationSeekBar.setProgress((int) mCardView.getCardElevation());
         mElevationSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        mMaxElevationSeekBar = (SeekBar) findViewById(R.id.max_elevation_seek_bar);
+        mMaxElevationSeekBar = findViewById(R.id.max_elevation_seek_bar);
         mMaxElevationSeekBar.setProgress((int) mCardView.getMaxCardElevation());
         mMaxElevationSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        mAlphaSeekBar = (SeekBar) findViewById(R.id.alpha_seek_bar);
+        mAlphaSeekBar = findViewById(R.id.alpha_seek_bar);
         mAlphaSeekBar.setProgress((int) (mCardView.getAlpha() * 255));
         mAlphaSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
 
-        RadioGroup rb = (RadioGroup) findViewById(R.id.select_target_radio);
+        RadioGroup rb = findViewById(R.id.select_target_radio);
         rb.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup group, int checkedId) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
index 6cc881b..cf2fac2 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
@@ -61,7 +61,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.animated_recycler_view);
 
-        ViewGroup container = (ViewGroup) findViewById(R.id.container);
+        ViewGroup container = findViewById(R.id.container);
         mRecyclerView = new RecyclerView(this);
         mCachedAnimator = createAnimator();
         mCachedAnimator.setChangeDuration(2000);
@@ -77,7 +77,7 @@
         mRecyclerView.setAdapter(mAdapter);
         container.addView(mRecyclerView);
 
-        CheckBox enableAnimations = (CheckBox) findViewById(R.id.enableAnimations);
+        CheckBox enableAnimations = findViewById(R.id.enableAnimations);
         enableAnimations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -91,7 +91,7 @@
         });
 
         CheckBox enablePredictiveAnimations =
-                (CheckBox) findViewById(R.id.enablePredictiveAnimations);
+                findViewById(R.id.enablePredictiveAnimations);
         enablePredictiveAnimations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -99,7 +99,7 @@
             }
         });
 
-        CheckBox enableInPlaceChange = (CheckBox) findViewById(R.id.enableInPlaceChange);
+        CheckBox enableInPlaceChange = findViewById(R.id.enableInPlaceChange);
         enableInPlaceChange.setChecked(mEnableInPlaceChange);
         enableInPlaceChange.setOnCheckedChangeListener(
                 new CompoundButton.OnCheckedChangeListener() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
index 28d7860..f74d91a 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
@@ -63,7 +63,7 @@
     abstract protected T createLayoutManager();
 
     private void initRecyclerView() {
-        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView = findViewById(R.id.recycler_view);
         mRecyclerView.setHasFixedSize(true);
         mLayoutManager = createLayoutManager();
         mRecyclerView.setLayoutManager(mLayoutManager);
@@ -99,7 +99,7 @@
 
     private void initToggles() {
         mConfigToggles = createConfigToggles();
-        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
+        RecyclerView configView = findViewById(R.id.config_recycler_view);
         configView.setAdapter(mConfigAdapter);
         configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
                 false));
@@ -107,9 +107,9 @@
     }
 
     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);
+        final EditText scrollOffset = findViewById(R.id.scroll_offset);
+        final CheckBox checkBox = findViewById(R.id.enable_smooth_scroll);
+        final Spinner spinner = findViewById(R.id.spinner);
 
         Integer offset = null;
         String offsetString = scrollOffset.getText().toString();
@@ -127,7 +127,7 @@
     }
 
     private void initSpinner() {
-        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
+        final Spinner spinner = findViewById(R.id.spinner);
         spinner.setAdapter(new BaseAdapter() {
             @Override
             public int getCount() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
index c53ec8f..3ef6293 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
@@ -91,10 +91,10 @@
 
         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 = findViewById(R.id.drawer_layout);
+        mStartDrawer = findViewById(R.id.start_drawer);
+        mEndDrawer = findViewById(R.id.end_drawer);
+        mContent = findViewById(R.id.content_text);
 
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow_end, GravityCompat.END);
@@ -110,7 +110,7 @@
 
         // 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 = findViewById(R.id.toolbar);
         mToolbar.setTitle(R.string.drawer_title);
         setSupportActionBar(mToolbar);
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
index 9e4628e..f01b825 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
@@ -56,7 +56,7 @@
 
         mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
 
-        mContainer = (ViewGroup) findViewById(R.id.container);
+        mContainer = 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);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java
index cb0c2e2..95d5c94 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java
@@ -36,7 +36,7 @@
         super.onCreate(savedInstanceState);
 
         setContentView(R.layout.list_view_activity);
-        ListView listView = (ListView) findViewById(R.id.list_view);
+        ListView listView = findViewById(R.id.list_view);
         listView.setAdapter(new BaseAdapter() {
             @Override
             public int getCount() {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
index 3adf840..fa59903 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
@@ -47,7 +47,7 @@
 
         mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
 
-        final ViewGroup container = (ViewGroup) findViewById(R.id.container);
+        final ViewGroup container = findViewById(R.id.container);
         mLog = (TextView) container.findViewById(R.id.log);
 
         final SwitchCompat elevationToggle = (SwitchCompat) container.findViewById(
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
index 54a0bb3..679af89 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
@@ -57,7 +57,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_item_touch);
-        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView = findViewById(R.id.recycler_view);
         mRecyclerView.setHasFixedSize(true);
         mAdapter = createAdapter();
         mRecyclerView.setAdapter(mAdapter);
@@ -69,7 +69,7 @@
 
     private void initToggles() {
         mConfigToggles = createConfigToggles();
-        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
+        RecyclerView configView = findViewById(R.id.config_recycler_view);
         configView.setAdapter(new RecyclerView.Adapter<ConfigViewHolder>() {
             @Override
             public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java b/samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java
index 1ded677..72a7edc 100644
--- a/samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java
+++ b/samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java
@@ -115,9 +115,9 @@
 
     // Setup seek bars so damping ratio and stiffness for the spring can be modified through the UI.
     void setupSeekBars() {
-        SeekBar dr = (SeekBar) findViewById(R.id.damping_ratio);
+        SeekBar dr = findViewById(R.id.damping_ratio);
         dr.setMax(130);
-        final TextView drTxt = (TextView) findViewById(R.id.damping_ratio_txt);
+        final TextView drTxt = findViewById(R.id.damping_ratio_txt);
         dr.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
@@ -142,9 +142,9 @@
             }
         });
 
-        SeekBar stiff = (SeekBar) findViewById(R.id.stiffness);
+        SeekBar stiff = findViewById(R.id.stiffness);
         stiff.setMax(110);
-        final TextView nfTxt = (TextView) findViewById(R.id.stiffness_txt);
+        final TextView nfTxt = findViewById(R.id.stiffness_txt);
         stiff.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java b/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java
index e9f2d62..26d4784 100644
--- a/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java
+++ b/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java
@@ -41,7 +41,7 @@
         setContentView(R.layout.activity_main);
 
         final View v = findViewById(R.id.container);
-        mSpringView = (SpringView) findViewById(R.id.actual_spring);
+        mSpringView = findViewById(R.id.actual_spring);
 
         final View img = findViewById(R.id.imageView);
         setupSeekBars();
@@ -100,9 +100,9 @@
 
     // Setup seek bars so damping ratio and stiffness for the spring can be modified through the UI.
     void setupSeekBars() {
-        SeekBar dr = (SeekBar) findViewById(R.id.damping_ratio);
+        SeekBar dr = findViewById(R.id.damping_ratio);
         dr.setMax(130);
-        final TextView drTxt = (TextView) findViewById(R.id.damping_ratio_txt);
+        final TextView drTxt = findViewById(R.id.damping_ratio_txt);
         dr.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
@@ -127,9 +127,9 @@
             }
         });
 
-        SeekBar stiff = (SeekBar) findViewById(R.id.stiffness);
+        SeekBar stiff = findViewById(R.id.stiffness);
         stiff.setMax(110);
-        final TextView nfTxt = (TextView) findViewById(R.id.stiffness_txt);
+        final TextView nfTxt = findViewById(R.id.stiffness_txt);
         stiff.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
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
index 42e25ea..a2b8f3c 100644
--- a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java
@@ -40,10 +40,10 @@
 
         Intent intent = getIntent();
         if (Intent.ACTION_VIEW.equals(intent.getAction())) {
-            TextView tv = (TextView) findViewById(R.id.status_text);
+            TextView tv = 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);
+            TextView tv = findViewById(R.id.status_text);
             tv.setText(intent.getStringExtra(EXTRA_TEXT));
         }
     }
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
index a6dbca4..5304acb 100644
--- a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java
@@ -41,7 +41,7 @@
         ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
 
         mPeerCount = getIntent().getIntExtra(EXTRA_PEER_COUNT, 0) + 1;
-        TextView tv = (TextView) findViewById(R.id.peer_counter);
+        TextView tv = findViewById(R.id.peer_counter);
         tv.setText(getResources().getText(R.string.peer_count).toString() + mPeerCount);
     }
 
diff --git a/samples/SupportDesignDemos/res/values/styles.xml b/samples/SupportDesignDemos/res/values/styles.xml
index ddbed52..121ffa6 100644
--- a/samples/SupportDesignDemos/res/values/styles.xml
+++ b/samples/SupportDesignDemos/res/values/styles.xml
@@ -47,6 +47,9 @@
     <style name="Theme.DesignDemos.Navigation" parent="Theme.DesignDemos.Navigation.Base"/>
 
     <style name="Theme.DesignDemos.BottomSheetModal" parent="Theme.Design">
+        <item name="colorPrimary">#607D8B</item>
+        <item name="colorPrimaryDark">#455A64</item>
+        <item name="colorAccent">#FFAB40</item>
         <item name="bottomSheetDialogTheme">@style/Theme.DesignDemos.BottomSheetModal.BottomSheetDialog</item>
     </style>
 
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
index edb7493..6a35e30 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
@@ -45,7 +45,7 @@
         setContentView(getLayoutId());
 
         // Retrieve the Toolbar from our content view, and set it as the action bar
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
         CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout)
@@ -57,22 +57,22 @@
             collapsingToolbarLayout.setContentScrimColor(0xFFFF00FF);
         }
 
-        TextView dialog = (TextView) findViewById(R.id.textview_dialogue);
+        TextView dialog = findViewById(R.id.textview_dialogue);
         if (dialog != null) {
             dialog.setText(TextUtils.concat(Shakespeare.DIALOGUE));
         }
 
-        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.appbar_recyclerview);
+        RecyclerView recyclerView = findViewById(R.id.appbar_recyclerview);
         if (recyclerView != null) {
             setupRecyclerView(recyclerView);
         }
 
-        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
+        TabLayout tabLayout = findViewById(R.id.tabs);
         if (tabLayout != null) {
             setupTabs(tabLayout);
         }
 
-        final SwipeRefreshLayout refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh);
+        final SwipeRefreshLayout refreshLayout = findViewById(R.id.swiperefresh);
         if (refreshLayout != null) {
             refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                 private final Handler mHandler = new Handler();
@@ -101,12 +101,12 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.action_toggle_expand: {
-                AppBarLayout abl = (AppBarLayout) findViewById(R.id.app_bar);
+                AppBarLayout abl = findViewById(R.id.app_bar);
                 abl.setExpanded(true);
                 return true;
             }
             case R.id.action_toggle_collapse: {
-                AppBarLayout abl = (AppBarLayout) findViewById(R.id.app_bar);
+                AppBarLayout abl = findViewById(R.id.app_bar);
                 abl.setExpanded(false);
                 return true;
             }
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java
index e19609a..0f86ba6 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java
@@ -38,9 +38,9 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.design_bottom_navigation_view);
-        Button buttonDisable = (Button) findViewById(R.id.button_disable);
+        Button buttonDisable = findViewById(R.id.button_disable);
         final BottomNavigationView bottom =
-                (BottomNavigationView) findViewById(R.id.bottom_navigation);
+                findViewById(R.id.bottom_navigation);
         mOriginalTint = bottom.getItemIconTintList();
         buttonDisable.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -48,7 +48,7 @@
                 bottom.getMenu().getItem(0).setEnabled(!bottom.getMenu().getItem(0).isEnabled());
             }
         });
-        Button buttonAdd = (Button) findViewById(R.id.button_add);
+        Button buttonAdd = findViewById(R.id.button_add);
         buttonAdd.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -58,7 +58,7 @@
                 }
             }
         });
-        Button buttonRemove = (Button) findViewById(R.id.button_remove);
+        Button buttonRemove = findViewById(R.id.button_remove);
         buttonRemove.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -67,7 +67,7 @@
                 }
             }
         });
-        Button buttonTint = (Button) findViewById(R.id.button_tint);
+        Button buttonTint = findViewById(R.id.button_tint);
         buttonTint.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -78,7 +78,7 @@
                 }
             }
         });
-        Button buttonNext = (Button) findViewById(R.id.button_select_next);
+        Button buttonNext = findViewById(R.id.button_select_next);
         buttonNext.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -97,7 +97,7 @@
                 bottom.setSelectedItemId(bottom.getMenu().getItem(next).getItemId());
             }
         });
-        final TextView selectedItem = (TextView) findViewById(R.id.selected_item);
+        final TextView selectedItem = findViewById(R.id.selected_item);
         bottom.setOnNavigationItemSelectedListener(
                 new BottomNavigationView.OnNavigationItemSelectedListener() {
                     @Override
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java
index 3ee3e17..20a29e0 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java
@@ -81,7 +81,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.design_bottom_sheet_dynamic);
 
-        RecyclerView list = (RecyclerView) findViewById(R.id.list);
+        RecyclerView list = findViewById(R.id.list);
         list.setLayoutManager(new LinearLayoutManager(this));
         mAdapter = new DynamicAdapter();
         for (int i = 0; i < 5; i++) {
@@ -90,19 +90,19 @@
         list.setAdapter(mAdapter);
         mBehavior = BottomSheetBehavior.from(list);
 
-        Button add = (Button) findViewById(R.id.add);
+        Button add = findViewById(R.id.add);
         if (add != null) {
             add.setOnClickListener(mOnClickListener);
         }
-        Button remove = (Button) findViewById(R.id.remove);
+        Button remove = findViewById(R.id.remove);
         if (remove != null) {
             remove.setOnClickListener(mOnClickListener);
         }
-        Button expand = (Button) findViewById(R.id.expand);
+        Button expand = findViewById(R.id.expand);
         if (expand != null) {
             expand.setOnClickListener(mOnClickListener);
         }
-        Button collapse = (Button) findViewById(R.id.collapse);
+        Button collapse = findViewById(R.id.collapse);
         if (collapse != null) {
             collapse.setOnClickListener(mOnClickListener);
         }
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
index b649463..f1d94ae 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java
@@ -44,8 +44,8 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mTextSlideOffset = (TextView) findViewById(R.id.slide_offset);
-        mToggle = (Button) findViewById(R.id.toggle);
+        mTextSlideOffset = findViewById(R.id.slide_offset);
+        mToggle = findViewById(R.id.toggle);
         mToggle.setOnClickListener(mOnClickListener);
         mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
             @Override
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
index f08cd32..af3021d 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java
@@ -56,7 +56,7 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mToggle = (Button) findViewById(R.id.toggle);
+        mToggle = findViewById(R.id.toggle);
         mToggle.setOnClickListener(mOnClickListener);
         mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
             @Override
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java
index 2d977b0..27bac85 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java
@@ -30,7 +30,7 @@
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.design_coordinatorlayout_inset);
-        TextView message = (TextView) findViewById(R.id.message);
+        TextView message = findViewById(R.id.message);
         message.setText(Shakespeare.DIALOGUE[0]);
     }
 
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java
index 595b485..4369d94 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java
@@ -37,7 +37,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.custom_snackbar_with_fab);
 
-        mContentView = (CoordinatorLayout) findViewById(R.id.content_view);
+        mContentView = findViewById(R.id.content_view);
     }
 
     /** Shows a custom snackbar with no action. */
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
index 9193037..e49a0e6 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
@@ -33,7 +33,7 @@
         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);
+        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
index 9404cc4..809a248 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java
@@ -38,7 +38,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mDrawerLayout = findViewById(R.id.drawer_layout);
 
         // Set the color of status bar
         TypedValue value = new TypedValue();
@@ -46,7 +46,7 @@
         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);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
         // Toggle icon
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
index fc3fefb..4dac9c1 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java
@@ -35,10 +35,10 @@
         super.onCreate(savedInstanceState);
         setContentView(getLayout());
 
-        mTextMessage = (TextView) findViewById(R.id.message);
+        mTextMessage = findViewById(R.id.message);
 
         // Menu
-        NavigationView navigation = (NavigationView) findViewById(R.id.navigation);
+        NavigationView navigation = findViewById(R.id.navigation);
         navigation.setNavigationItemSelectedListener(getNavigationItemSelectedListener());
         navigation.inflateHeaderView(R.layout.design_navigation_header);
     }
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
index 85f2152..7c5f7be 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java
@@ -37,7 +37,7 @@
         super.onCreate(savedInstanceState);
         setContentView(getLayoutId());
 
-        mContentView = (ViewGroup) findViewById(R.id.content_view);
+        mContentView = findViewById(R.id.content_view);
     }
 
     protected int getLayoutId() {
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
index 31239be..8271f1a 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
@@ -33,12 +33,12 @@
         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);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
         // Create three tabs with custom views
-        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
+        TabLayout tabLayout = findViewById(R.id.tabs);
         for (int i = 0; i < 3; i++) {
             TabLayout.Tab tab = tabLayout.newTab();
 
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
index ba38f3e..c75b44b 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
@@ -33,7 +33,7 @@
         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);
+        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
index b276305..a1e6414 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
@@ -50,12 +50,12 @@
         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);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
-        mTabLayout = (TabLayout) findViewById(R.id.tabs);
-        mViewPager = (ViewPager) findViewById(R.id.tabs_viewpager);
+        mTabLayout = findViewById(R.id.tabs);
+        mViewPager = findViewById(R.id.tabs_viewpager);
 
         findViewById(R.id.buttons).setVisibility(View.GONE);
 
@@ -82,7 +82,7 @@
                 break;
         }
 
-        RadioGroup rg = (RadioGroup) findViewById(R.id.radiogroup_tab_mode);
+        RadioGroup rg = findViewById(R.id.radiogroup_tab_mode);
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup radioGroup, int id) {
@@ -107,7 +107,7 @@
                 break;
         }
 
-        rg = (RadioGroup) findViewById(R.id.radiogroup_tab_gravity);
+        rg = findViewById(R.id.radiogroup_tab_gravity);
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup radioGroup, int id) {
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
index 387e1a0..274909a 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
@@ -53,12 +53,12 @@
         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);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
-        mTabLayout = (TabLayout) findViewById(R.id.tabs);
-        mViewPager = (ViewPager) findViewById(R.id.tabs_viewpager);
+        mTabLayout = findViewById(R.id.tabs);
+        mViewPager = findViewById(R.id.tabs_viewpager);
 
         mPagerAdapter = new CheesePagerAdapter();
         mViewPager.setAdapter(mPagerAdapter);
@@ -94,7 +94,7 @@
                 break;
         }
 
-        RadioGroup rg = (RadioGroup) findViewById(R.id.radiogroup_tab_mode);
+        RadioGroup rg = findViewById(R.id.radiogroup_tab_mode);
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup radioGroup, int id) {
@@ -119,7 +119,7 @@
                 break;
         }
 
-        rg = (RadioGroup) findViewById(R.id.radiogroup_tab_gravity);
+        rg = findViewById(R.id.radiogroup_tab_gravity);
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup radioGroup, int id) {
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
index 5fb61f5..3dd646a 100644
--- a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java
@@ -36,8 +36,8 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.design_text_input);
 
-        mUsernameInputLayout = (TextInputLayout) findViewById(R.id.input_username);
-        mPasswordInputLayout = (TextInputLayout) findViewById(R.id.input_password);
+        mUsernameInputLayout = findViewById(R.id.input_username);
+        mPasswordInputLayout = findViewById(R.id.input_password);
     }
 
     public void showError(View view) {
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
index 0565865..43179dd 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
@@ -38,7 +38,7 @@
     }
 
     private void setupTitleFragment() {
-        TitleView titleView = (TitleView) findViewById(R.id.title);
+        TitleView titleView = findViewById(R.id.title);
         titleView.setTitle("RowsFragment");
         titleView.setOnSearchClickedListener(new View.OnClickListener() {
             @Override
@@ -48,7 +48,7 @@
             }
         });
 
-        BrowseFrameLayout frameLayout = (BrowseFrameLayout) findViewById(R.id.rows_frame);
+        BrowseFrameLayout frameLayout = findViewById(R.id.rows_frame);
         TitleHelper titleHelper = new TitleHelper(frameLayout, titleView);
         frameLayout.setOnFocusSearchListener(titleHelper.getOnFocusSearchListener());
         mRowsFragment.setTitleHelper(titleHelper);
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
index dfdfad9..a77d2be 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
@@ -41,7 +41,7 @@
     }
 
     private void setupTitleFragment() {
-        TitleView titleView = (TitleView) findViewById(R.id.title);
+        TitleView titleView = findViewById(R.id.title);
         titleView.setTitle("RowsSupportFragment");
         titleView.setOnSearchClickedListener(new View.OnClickListener() {
             @Override
@@ -51,7 +51,7 @@
             }
         });
 
-        BrowseFrameLayout frameLayout = (BrowseFrameLayout) findViewById(R.id.rows_frame);
+        BrowseFrameLayout frameLayout = findViewById(R.id.rows_frame);
         TitleHelper titleHelper = new TitleHelper(frameLayout, titleView);
         frameLayout.setOnFocusSearchListener(titleHelper.getOnFocusSearchListener());
         mRowsSupportFragment.setTitleHelper(titleHelper);
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
index 962adb0..89117b5 100644
--- 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
@@ -35,7 +35,7 @@
         setOnFocusChangeListener(new View.OnFocusChangeListener() {
             @Override
             public void onFocusChange(View v, boolean hasFocus) {
-                ImageView mainImage = (ImageView) findViewById(R.id.main_image);
+                ImageView mainImage = findViewById(R.id.main_image);
                 View container = findViewById(R.id.container);
                 if (hasFocus) {
                     container.setBackgroundResource(R.drawable.character_focused);
@@ -50,8 +50,8 @@
     }
 
     public void updateUi(Card card) {
-        TextView primaryText = (TextView) findViewById(R.id.primary_text);
-        final ImageView imageView = (ImageView) findViewById(R.id.main_image);
+        TextView primaryText = findViewById(R.id.primary_text);
+        final ImageView imageView = findViewById(R.id.main_image);
 
         primaryText.setText(card.getTitle());
         if (card.getLocalImageResourceName() != null) {
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
index 830b474..8f94e2a 100644
--- 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
@@ -35,9 +35,9 @@
     }
 
     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);
+        TextView extraText = findViewById(R.id.extra_text);
+        TextView primaryText = findViewById(R.id.primary_text);
+        final ImageView imageView = findViewById(R.id.main_image);
 
         extraText.setText(card.getExtraText());
         primaryText.setText(card.getTitle());
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java
index 52b53f4..41be84a 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java
@@ -45,7 +45,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mRoot = (FrameLayout) findViewById(R.id.root);
+        mRoot = findViewById(R.id.root);
         mTarget = findViewById(R.id.target);
         mTransition = new ChangeBounds();
         mTransition.setPathMotion(new ArcMotion());
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java
index 9bce29d..1e86816 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java
@@ -37,8 +37,8 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mRoot = (LinearLayout) findViewById(R.id.root);
-        mMessage = (TextView) findViewById(R.id.message);
+        mRoot = findViewById(R.id.root);
+        mMessage = findViewById(R.id.message);
         findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
index 8455404..aa036fa 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
@@ -47,8 +47,8 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mRoot = (ViewGroup) findViewById(R.id.root);
-        mPhoto = (ImageView) findViewById(R.id.photo);
+        mRoot = findViewById(R.id.root);
+        mPhoto = findViewById(R.id.photo);
         findViewById(R.id.toggle).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
index a8d90f4..92fdf27 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
@@ -45,8 +45,8 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mRoot = (ViewGroup) findViewById(R.id.container);
-        mPhoto = (ImageView) findViewById(R.id.photo);
+        mRoot = findViewById(R.id.container);
+        mPhoto = findViewById(R.id.photo);
         final View.OnClickListener listener = new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java
index b84c341..67aa409 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java
@@ -45,9 +45,9 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mChangeTransform = new ChangeTransform();
-        mRoot = (LinearLayout) findViewById(R.id.root);
-        mContainer1 = (FrameLayout) findViewById(R.id.container_1);
-        mContainer2 = (FrameLayout) findViewById(R.id.container_2);
+        mRoot = findViewById(R.id.root);
+        mContainer1 = findViewById(R.id.container_1);
+        mContainer2 = findViewById(R.id.container_2);
         findViewById(R.id.toggle).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java
index c7a4fd1..a9096e0 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java
@@ -53,7 +53,7 @@
                 return mRect;
             }
         });
-        mRoot = (FrameLayout) findViewById(R.id.root);
+        mRoot = findViewById(R.id.root);
         if (mViews.isEmpty()) {
             mViews.add(findViewById(R.id.view_1));
             mViews.add(findViewById(R.id.view_2));
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java
index b1cb6ae..fd37360 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java
@@ -45,8 +45,8 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mOuterFrame = (FrameLayout) findViewById(R.id.outer_frame);
-        mInnerFrame = (FrameLayout) findViewById(R.id.inner_frame);
+        mOuterFrame = findViewById(R.id.outer_frame);
+        mInnerFrame = findViewById(R.id.inner_frame);
         mPhotoSize = getResources().getDimensionPixelSize(R.dimen.photo_size);
 
         mTransition = new TransitionSet();
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java
index f2fd38a..1bc1d81 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java
@@ -39,7 +39,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        FrameLayout root = (FrameLayout) findViewById(R.id.root);
+        FrameLayout root = findViewById(R.id.root);
         mScenes = setUpScenes(root);
         TransitionManager.go(mScenes[0]);
     }
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java
index f375e4d..aad075c 100644
--- a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java
@@ -37,7 +37,7 @@
         setContentView(getLayoutResId());
 
         // Retrieve the Toolbar from our content view, and set it as the action bar
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
     }
 
diff --git a/samples/SupportVectorDrawableDemos/res/anim/path_motion.xml b/samples/SupportVectorDrawableDemos/res/anim/path_motion.xml
new file mode 100644
index 0000000..d4ae7e3
--- /dev/null
+++ b/samples/SupportVectorDrawableDemos/res/anim/path_motion.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="3000"
+        android:propertyXName="translateX"
+        android:propertyYName="translateY"
+        android:pathData="m -35, 0  a 35,35 0 1,0 70,0  a 35,35 0 1,0 -70,0  m 70, 0 a 35,35 0 1,0 -70,0  a 35,35 0 1,0 70,0"/>
+</set>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawableDemos/res/anim/path_motion_object.xml b/samples/SupportVectorDrawableDemos/res/anim/path_motion_object.xml
new file mode 100644
index 0000000..0906cb1
--- /dev/null
+++ b/samples/SupportVectorDrawableDemos/res/anim/path_motion_object.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="3000"
+    android:propertyXName="translateX"
+    android:propertyYName="translateY"
+    android:pathData="M0 0 M 18 18 M 0 0 m -35, 0  a 35,35 0 1,0 70,0  a 35,35 0 1,0 -70,0  m 70, 0 a 35,35 0 1,0 -70,0  a 35,35 0 1,0 70,0"/>
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml b/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml
new file mode 100644
index 0000000..915dfa7
--- /dev/null
+++ b/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml
@@ -0,0 +1,23 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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/path_motion" />
+
+</animated-vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml b/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml
new file mode 100644
index 0000000..f251a07
--- /dev/null
+++ b/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml
@@ -0,0 +1,24 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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/path_motion_object" />
+
+</animated-vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java b/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
index f228a43..e68d145 100644
--- a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
+++ b/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
@@ -38,16 +38,16 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.avdc_listener);
-        final AppCompatImageView imageView1 = (AppCompatImageView) findViewById(R.id.imageView);
-        final AppCompatImageView imageView2 = (AppCompatImageView) findViewById(R.id.imageView2);
+        final AppCompatImageView imageView1 = findViewById(R.id.imageView);
+        final AppCompatImageView imageView2 = findViewById(R.id.imageView2);
 
-        final TextView textView1 = (TextView) findViewById(R.id.textView);
+        final TextView textView1 = findViewById(R.id.textView);
         textView1.setText("Should show start / end for first AVD");
-        final TextView textView2 = (TextView) findViewById(R.id.textView2);
+        final TextView textView2 = findViewById(R.id.textView2);
         textView2.setText("Not affected by AVD, b/c removed after register");
-        final TextView textView3 = (TextView) findViewById(R.id.textView3);
+        final TextView textView3 = findViewById(R.id.textView3);
         textView3.setText("Should show start / end for second AVD");
-        final TextView textView4 = (TextView) findViewById(R.id.textView4);
+        final TextView textView4 = findViewById(R.id.textView4);
         textView4.setText("Not affected by AVD, b/c unregistered after register");
 
         final Drawable drawable1 = imageView1.getDrawable();
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java b/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
index feb9d3c..0cc36de 100644
--- a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
+++ b/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
@@ -38,6 +38,8 @@
 
     private static final String LOGCAT = "VectorDrawable1";
     protected int[] mIcons = {
+            R.drawable.animation_vector_drawable_grouping_1_path_motion,
+            R.drawable.animation_vector_drawable_grouping_1_path_motion_object,
             R.drawable.animation_vector_drawable_grouping_1,
             R.drawable.animation_vector_drawable_grouping_decelerate,
             R.drawable.animation_vector_drawable_grouping_accelerate,
diff --git a/transition/api14/android/support/transition/AnimatorUtilsApi14.java b/transition/api14/android/support/transition/AnimatorUtilsApi14.java
index c3d47cc..d9f870b 100644
--- a/transition/api14/android/support/transition/AnimatorUtilsApi14.java
+++ b/transition/api14/android/support/transition/AnimatorUtilsApi14.java
@@ -21,6 +21,8 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 
+import java.util.ArrayList;
+
 @RequiresApi(14)
 class AnimatorUtilsApi14 implements AnimatorUtilsImpl {
 
@@ -30,4 +32,43 @@
         // Do nothing
     }
 
+    @Override
+    public void pause(@NonNull Animator animator) {
+        final ArrayList<Animator.AnimatorListener> listeners = animator.getListeners();
+        if (listeners != null) {
+            for (int i = 0, size = listeners.size(); i < size; i++) {
+                final Animator.AnimatorListener listener = listeners.get(i);
+                if (listener instanceof AnimatorPauseListenerCompat) {
+                    ((AnimatorPauseListenerCompat) listener).onAnimationPause(animator);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void resume(@NonNull Animator animator) {
+        final ArrayList<Animator.AnimatorListener> listeners = animator.getListeners();
+        if (listeners != null) {
+            for (int i = 0, size = listeners.size(); i < size; i++) {
+                final Animator.AnimatorListener listener = listeners.get(i);
+                if (listener instanceof AnimatorPauseListenerCompat) {
+                    ((AnimatorPauseListenerCompat) listener).onAnimationResume(animator);
+                }
+            }
+        }
+    }
+
+    /**
+     * Listeners can implement this interface in addition to the platform AnimatorPauseListener to
+     * make them compatible with API level 18 and below. Animators will not be paused or resumed,
+     * but the callbacks here are invoked.
+     */
+    interface AnimatorPauseListenerCompat {
+
+        void onAnimationPause(Animator animation);
+
+        void onAnimationResume(Animator animation);
+
+    }
+
 }
diff --git a/transition/api14/android/support/transition/GhostViewApi14.java b/transition/api14/android/support/transition/GhostViewApi14.java
index c164a4c..9c91c99 100644
--- a/transition/api14/android/support/transition/GhostViewApi14.java
+++ b/transition/api14/android/support/transition/GhostViewApi14.java
@@ -68,7 +68,9 @@
                 if (ghostView.mReferences <= 0) {
                     ViewParent parent = ghostView.getParent();
                     if (parent instanceof ViewGroup) {
-                        ((ViewGroup) parent).removeView(ghostView);
+                        ViewGroup group = (ViewGroup) parent;
+                        group.endViewTransition(ghostView);
+                        group.removeView(ghostView);
                     }
                 }
             }
diff --git a/transition/api14/android/support/transition/ViewUtilsApi14.java b/transition/api14/android/support/transition/ViewUtilsApi14.java
index c4de8a6..b5d9412 100644
--- a/transition/api14/android/support/transition/ViewUtilsApi14.java
+++ b/transition/api14/android/support/transition/ViewUtilsApi14.java
@@ -39,12 +39,38 @@
 
     @Override
     public void setTransitionAlpha(@NonNull View view, float alpha) {
-        view.setAlpha(alpha);
+        Float savedAlpha = (Float) view.getTag(R.id.save_non_transition_alpha);
+        if (savedAlpha != null) {
+            view.setAlpha(savedAlpha * alpha);
+        } else {
+            view.setAlpha(alpha);
+        }
     }
 
     @Override
     public float getTransitionAlpha(@NonNull View view) {
-        return view.getAlpha();
+        Float savedAlpha = (Float) view.getTag(R.id.save_non_transition_alpha);
+        if (savedAlpha != null) {
+            return view.getAlpha() / savedAlpha;
+        } else {
+            return view.getAlpha();
+        }
+    }
+
+    @Override
+    public void saveNonTransitionAlpha(@NonNull View view) {
+        if (view.getTag(R.id.save_non_transition_alpha) == null) {
+            view.setTag(R.id.save_non_transition_alpha, view.getAlpha());
+        }
+    }
+
+    @Override
+    public void clearNonTransitionAlpha(@NonNull View view) {
+        // We don't clear the saved value when the view is hidden; that's the situation we are
+        // saving this value for.
+        if (view.getVisibility() == View.VISIBLE) {
+            view.setTag(R.id.save_non_transition_alpha, null);
+        }
     }
 
     @Override
diff --git a/transition/api19/android/support/transition/AnimatorUtilsApi19.java b/transition/api19/android/support/transition/AnimatorUtilsApi19.java
index 38e3942..0f4ae6b 100644
--- a/transition/api19/android/support/transition/AnimatorUtilsApi19.java
+++ b/transition/api19/android/support/transition/AnimatorUtilsApi19.java
@@ -21,7 +21,7 @@
 import android.support.annotation.RequiresApi;
 
 @RequiresApi(19)
-class AnimatorUtilsApi19 extends AnimatorUtilsApi14 {
+class AnimatorUtilsApi19 implements AnimatorUtilsImpl {
 
     @Override
     public void addPauseListener(@NonNull Animator animator,
@@ -29,4 +29,14 @@
         animator.addPauseListener(listener);
     }
 
+    @Override
+    public void pause(@NonNull Animator animator) {
+        animator.pause();
+    }
+
+    @Override
+    public void resume(@NonNull Animator animator) {
+        animator.resume();
+    }
+
 }
diff --git a/transition/api19/android/support/transition/ViewUtilsApi19.java b/transition/api19/android/support/transition/ViewUtilsApi19.java
index 2773a41..58814b7 100644
--- a/transition/api19/android/support/transition/ViewUtilsApi19.java
+++ b/transition/api19/android/support/transition/ViewUtilsApi19.java
@@ -65,6 +65,16 @@
         return super.getTransitionAlpha(view);
     }
 
+    @Override
+    public void saveNonTransitionAlpha(@NonNull View view) {
+        // Do nothing
+    }
+
+    @Override
+    public void clearNonTransitionAlpha(@NonNull View view) {
+        // Do nothing
+    }
+
     private void fetchSetTransitionAlphaMethod() {
         if (!sSetTransitionAlphaMethodFetched) {
             try {
diff --git a/transition/base/android/support/transition/AnimatorUtilsImpl.java b/transition/base/android/support/transition/AnimatorUtilsImpl.java
index ce1c9cc..68f222d 100644
--- a/transition/base/android/support/transition/AnimatorUtilsImpl.java
+++ b/transition/base/android/support/transition/AnimatorUtilsImpl.java
@@ -24,4 +24,8 @@
 
     void addPauseListener(@NonNull Animator animator, @NonNull AnimatorListenerAdapter listener);
 
+    void pause(@NonNull Animator animator);
+
+    void resume(@NonNull Animator animator);
+
 }
diff --git a/transition/base/android/support/transition/ViewUtilsImpl.java b/transition/base/android/support/transition/ViewUtilsImpl.java
index e19985f..9038783 100644
--- a/transition/base/android/support/transition/ViewUtilsImpl.java
+++ b/transition/base/android/support/transition/ViewUtilsImpl.java
@@ -32,6 +32,10 @@
 
     float getTransitionAlpha(@NonNull View view);
 
+    void saveNonTransitionAlpha(@NonNull View view);
+
+    void clearNonTransitionAlpha(@NonNull View view);
+
     void transformMatrixToGlobal(@NonNull View view, @NonNull Matrix matrix);
 
     void transformMatrixToLocal(@NonNull View view, @NonNull Matrix matrix);
diff --git a/transition/res/values/ids.xml b/transition/res/values/ids.xml
index f64bd97..45477b8 100644
--- a/transition/res/values/ids.xml
+++ b/transition/res/values/ids.xml
@@ -24,4 +24,5 @@
     <item name="ghost_view" type="id"/>
     <item name="save_scale_type" type="id"/>
     <item name="save_image_matrix" type="id"/>
+    <item name="save_non_transition_alpha" type="id"/>
 </resources>
diff --git a/transition/src/android/support/transition/AnimatorUtils.java b/transition/src/android/support/transition/AnimatorUtils.java
index 4bd7625..215d768 100644
--- a/transition/src/android/support/transition/AnimatorUtils.java
+++ b/transition/src/android/support/transition/AnimatorUtils.java
@@ -38,4 +38,12 @@
         IMPL.addPauseListener(animator, listener);
     }
 
+    static void pause(@NonNull Animator animator) {
+        IMPL.pause(animator);
+    }
+
+    static void resume(@NonNull Animator animator) {
+        IMPL.resume(animator);
+    }
+
 }
diff --git a/transition/src/android/support/transition/Fade.java b/transition/src/android/support/transition/Fade.java
index 1b65c18..eab0f23 100644
--- a/transition/src/android/support/transition/Fade.java
+++ b/transition/src/android/support/transition/Fade.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
+import android.support.annotation.NonNull;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
@@ -60,6 +61,8 @@
  */
 public class Fade extends Visibility {
 
+    private static final String PROPNAME_TRANSITION_ALPHA = "android:fade:transitionAlpha";
+
     private static final String LOG_TAG = "Fade";
 
     /**
@@ -103,10 +106,17 @@
         a.recycle();
     }
 
+    @Override
+    public void captureStartValues(@NonNull TransitionValues transitionValues) {
+        super.captureStartValues(transitionValues);
+        transitionValues.values.put(PROPNAME_TRANSITION_ALPHA,
+                ViewUtils.getTransitionAlpha(transitionValues.view));
+    }
+
     /**
      * Utility method to handle creating and running the Animator.
      */
-    private Animator createAnimation(View view, float startAlpha, float endAlpha) {
+    private Animator createAnimation(final View view, float startAlpha, float endAlpha) {
         if (startAlpha == endAlpha) {
             return null;
         }
@@ -118,7 +128,14 @@
         }
         FadeAnimatorListener listener = new FadeAnimatorListener(view);
         anim.addListener(listener);
-        AnimatorUtils.addPauseListener(anim, listener);
+        addListener(new TransitionListenerAdapter() {
+            @Override
+            public void onTransitionEnd(@NonNull Transition transition) {
+                ViewUtils.setTransitionAlpha(view, 1);
+                ViewUtils.clearNonTransitionAlpha(view);
+                transition.removeListener(this);
+            }
+        });
         return anim;
     }
 
@@ -131,20 +148,35 @@
             Log.d(LOG_TAG, "Fade.onAppear: startView, startVis, endView, endVis = "
                     + startView + ", " + view);
         }
-        return createAnimation(view, 0, 1);
+        float startAlpha = getStartAlpha(startValues, 0);
+        if (startAlpha == 1) {
+            startAlpha = 0;
+        }
+        return createAnimation(view, startAlpha, 1);
     }
 
     @Override
     public Animator onDisappear(ViewGroup sceneRoot, final View view, TransitionValues startValues,
             TransitionValues endValues) {
-        return createAnimation(view, 1, 0);
+        ViewUtils.saveNonTransitionAlpha(view);
+        float startAlpha = getStartAlpha(startValues, 1);
+        return createAnimation(view, startAlpha, 0);
+    }
+
+    private static float getStartAlpha(TransitionValues startValues, float fallbackValue) {
+        float startAlpha = fallbackValue;
+        if (startValues != null) {
+            Float startAlphaFloat = (Float) startValues.values.get(PROPNAME_TRANSITION_ALPHA);
+            if (startAlphaFloat != null) {
+                startAlpha = startAlphaFloat;
+            }
+        }
+        return startAlpha;
     }
 
     private static class FadeAnimatorListener extends AnimatorListenerAdapter {
 
         private final View mView;
-        private boolean mCanceled = false;
-        private float mPausedAlpha = -1;
         private boolean mLayerTypeChanged = false;
 
         FadeAnimatorListener(View view) {
@@ -161,34 +193,13 @@
         }
 
         @Override
-        public void onAnimationCancel(Animator animation) {
-            mCanceled = true;
-            if (mPausedAlpha >= 0) {
-                ViewUtils.setTransitionAlpha(mView, mPausedAlpha);
-            }
-        }
-
-        @Override
         public void onAnimationEnd(Animator animation) {
-            if (!mCanceled) {
-                ViewUtils.setTransitionAlpha(mView, 1);
-            }
+            ViewUtils.setTransitionAlpha(mView, 1);
             if (mLayerTypeChanged) {
                 mView.setLayerType(View.LAYER_TYPE_NONE, null);
             }
         }
 
-        @Override
-        public void onAnimationPause(Animator animation) {
-            mPausedAlpha = ViewUtils.getTransitionAlpha(mView);
-            ViewUtils.setTransitionAlpha(mView, 1);
-        }
-
-        @Override
-        public void onAnimationResume(Animator animation) {
-            ViewUtils.setTransitionAlpha(mView, mPausedAlpha);
-        }
-
     }
 
 }
diff --git a/transition/src/android/support/transition/Transition.java b/transition/src/android/support/transition/Transition.java
index 807e353..369a3e3 100644
--- a/transition/src/android/support/transition/Transition.java
+++ b/transition/src/android/support/transition/Transition.java
@@ -1721,7 +1721,7 @@
                 AnimationInfo info = runningAnimators.valueAt(i);
                 if (info.mView != null && windowId.equals(info.mWindowId)) {
                     Animator anim = runningAnimators.keyAt(i);
-                    anim.cancel(); // pause() is API Level 19
+                    AnimatorUtils.pause(anim);
                 }
             }
             if (mListeners != null && mListeners.size() > 0) {
@@ -1754,7 +1754,7 @@
                     AnimationInfo info = runningAnimators.valueAt(i);
                     if (info.mView != null && windowId.equals(info.mWindowId)) {
                         Animator anim = runningAnimators.keyAt(i);
-                        anim.end(); // resume() is API Level 19
+                        AnimatorUtils.resume(anim);
                     }
                 }
                 if (mListeners != null && mListeners.size() > 0) {
@@ -1787,7 +1787,8 @@
             Animator anim = runningAnimators.keyAt(i);
             if (anim != null) {
                 AnimationInfo oldInfo = runningAnimators.get(anim);
-                if (oldInfo != null && oldInfo.mView != null && oldInfo.mWindowId == windowId) {
+                if (oldInfo != null && oldInfo.mView != null
+                        && windowId.equals(oldInfo.mWindowId)) {
                     TransitionValues oldValues = oldInfo.mValues;
                     View oldView = oldInfo.mView;
                     TransitionValues startValues = getTransitionValues(oldView, true);
@@ -2020,7 +2021,6 @@
     }
 
     /**
-     * <<<<<<< HEAD
      * Sets the algorithm used to calculate two-dimensional interpolation.
      * <p>
      * Transitions such as {@link android.transition.ChangeBounds} move Views, typically
@@ -2178,6 +2178,8 @@
             clone.mAnimators = new ArrayList<>();
             clone.mStartValues = new TransitionValuesMaps();
             clone.mEndValues = new TransitionValuesMaps();
+            clone.mStartValuesList = null;
+            clone.mEndValuesList = null;
             return clone;
         } catch (CloneNotSupportedException e) {
             return null;
diff --git a/transition/src/android/support/transition/TransitionManager.java b/transition/src/android/support/transition/TransitionManager.java
index 508e4a6..105aca4 100644
--- a/transition/src/android/support/transition/TransitionManager.java
+++ b/transition/src/android/support/transition/TransitionManager.java
@@ -166,22 +166,27 @@
     private static void changeScene(Scene scene, Transition transition) {
         final ViewGroup sceneRoot = scene.getSceneRoot();
 
-        Transition transitionClone = null;
-        if (transition != null) {
-            transitionClone = transition.clone();
-            transitionClone.setSceneRoot(sceneRoot);
+        if (!sPendingTransitions.contains(sceneRoot)) {
+            if (transition == null) {
+                scene.enter();
+            } else {
+                sPendingTransitions.add(sceneRoot);
+
+                Transition transitionClone = transition.clone();
+                transitionClone.setSceneRoot(sceneRoot);
+
+                Scene oldScene = Scene.getCurrentScene(sceneRoot);
+                if (oldScene != null && oldScene.isCreatedFromLayoutResource()) {
+                    transitionClone.setCanRemoveViews(true);
+                }
+
+                sceneChangeSetup(sceneRoot, transitionClone);
+
+                scene.enter();
+
+                sceneChangeRunTransition(sceneRoot, transitionClone);
+            }
         }
-
-        Scene oldScene = Scene.getCurrentScene(sceneRoot);
-        if (oldScene != null && oldScene.isCreatedFromLayoutResource()) {
-            transitionClone.setCanRemoveViews(true);
-        }
-
-        sceneChangeSetup(sceneRoot, transitionClone);
-
-        scene.enter();
-
-        sceneChangeRunTransition(sceneRoot, transitionClone);
     }
 
     static ArrayMap<ViewGroup, ArrayList<Transition>> getRunningTransitions() {
@@ -250,7 +255,12 @@
         @Override
         public boolean onPreDraw() {
             removeListeners();
-            sPendingTransitions.remove(mSceneRoot);
+
+            // Don't start the transition if it's no longer pending.
+            if (!sPendingTransitions.remove(mSceneRoot)) {
+                return true;
+            }
+
             // Add to running list, handle end to remove it
             final ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions =
                     getRunningTransitions();
diff --git a/transition/src/android/support/transition/ViewUtils.java b/transition/src/android/support/transition/ViewUtils.java
index 0bf0d61..7a35f14 100644
--- a/transition/src/android/support/transition/ViewUtils.java
+++ b/transition/src/android/support/transition/ViewUtils.java
@@ -21,15 +21,23 @@
 import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.v4.view.ViewCompat;
+import android.util.Log;
 import android.util.Property;
 import android.view.View;
 
+import java.lang.reflect.Field;
+
 /**
  * Compatibility utilities for platform features of {@link View}.
  */
 class ViewUtils {
 
     private static final ViewUtilsImpl IMPL;
+    private static final String TAG = "ViewUtils";
+
+    private static Field sViewFlagsField;
+    private static boolean sViewFlagsFieldFetched;
+    private static final int VISIBILITY_MASK = 0x0000000C;
 
     static {
         if (Build.VERSION.SDK_INT >= 21) {
@@ -99,6 +107,48 @@
     }
 
     /**
+     * This method needs to be called before an animation using {@link #setTransitionAlpha(View,
+     * float)} in order to make its behavior backward-compatible.
+     */
+    static void saveNonTransitionAlpha(@NonNull View view) {
+        IMPL.saveNonTransitionAlpha(view);
+    }
+
+    /**
+     * This method needs to be called after an animation using
+     * {@link #setTransitionAlpha(View, float)} if {@link #saveNonTransitionAlpha(View)} has been
+     * called.
+     */
+    static void clearNonTransitionAlpha(@NonNull View view) {
+        IMPL.clearNonTransitionAlpha(view);
+    }
+
+    /**
+     * Copy of a hidden platform method, View#setTransitionVisibility.
+     *
+     * <p>Change the visibility of the View without triggering any other changes. This is
+     * important for transitions, where visibility changes should not adjust focus or
+     * trigger a new layout. This is only used when the visibility has already been changed
+     * and we need a transient value during an animation. When the animation completes,
+     * the original visibility value is always restored.</p>
+     *
+     * @param view       The target view.
+     * @param visibility One of {@link View#VISIBLE}, {@link View#INVISIBLE}, or
+     *                   {@link View#GONE}.
+     */
+    static void setTransitionVisibility(@NonNull View view, int visibility) {
+        fetchViewFlagsField();
+        if (sViewFlagsField != null) {
+            try {
+                int viewFlags = sViewFlagsField.getInt(view);
+                sViewFlagsField.setInt(view, (viewFlags & ~VISIBILITY_MASK) | visibility);
+            } catch (IllegalAccessException e) {
+                // Do nothing
+            }
+        }
+    }
+
+    /**
      * Modifies the input matrix such that it maps view-local coordinates to
      * on-screen coordinates.
      *
@@ -140,4 +190,16 @@
         IMPL.setAnimationMatrix(v, m);
     }
 
+    private static void fetchViewFlagsField() {
+        if (!sViewFlagsFieldFetched) {
+            try {
+                sViewFlagsField = View.class.getDeclaredField("mViewFlags");
+                sViewFlagsField.setAccessible(true);
+            } catch (NoSuchFieldException e) {
+                Log.i(TAG, "fetchViewFlagsField: ");
+            }
+            sViewFlagsFieldFetched = true;
+        }
+    }
+
 }
diff --git a/transition/src/android/support/transition/Visibility.java b/transition/src/android/support/transition/Visibility.java
index 0c6c9d9..b71db02 100644
--- a/transition/src/android/support/transition/Visibility.java
+++ b/transition/src/android/support/transition/Visibility.java
@@ -413,49 +413,20 @@
 
         if (viewToKeep != null) {
             int originalVisibility = viewToKeep.getVisibility();
-            viewToKeep.setVisibility(View.VISIBLE);
+            ViewUtils.setTransitionVisibility(viewToKeep, View.VISIBLE);
             Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues);
             if (animator != null) {
-                final View finalViewToKeep = viewToKeep;
-                animator.addListener(new AnimatorListenerAdapter() {
-                    boolean mCanceled = false;
-
-                    @Override
-                    public void onAnimationPause(Animator animation) {
-                        if (!mCanceled) {
-                            //noinspection WrongConstant
-                            finalViewToKeep.setVisibility(finalVisibility);
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationResume(Animator animation) {
-                        if (!mCanceled) {
-                            finalViewToKeep.setVisibility(View.VISIBLE);
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationCancel(Animator animation) {
-                        mCanceled = true;
-                    }
-
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        if (!mCanceled) {
-                            //noinspection WrongConstant
-                            finalViewToKeep.setVisibility(finalVisibility);
-                        }
-                    }
-                });
+                DisappearListener disappearListener = new DisappearListener(viewToKeep,
+                        finalVisibility, true);
+                animator.addListener(disappearListener);
+                AnimatorUtils.addPauseListener(animator, disappearListener);
+                addListener(disappearListener);
             } else {
-                viewToKeep.setVisibility(originalVisibility);
+                ViewUtils.setTransitionVisibility(viewToKeep, originalVisibility);
             }
             return animator;
         }
         return null;
-
-
     }
 
     /**
@@ -489,6 +460,107 @@
                 || changeInfo.mEndVisibility == View.VISIBLE);
     }
 
+    private static class DisappearListener extends AnimatorListenerAdapter
+            implements TransitionListener, AnimatorUtilsApi14.AnimatorPauseListenerCompat {
+
+        private final View mView;
+        private final int mFinalVisibility;
+        private final ViewGroup mParent;
+        private final boolean mSuppressLayout;
+
+        private boolean mLayoutSuppressed;
+        boolean mCanceled = false;
+
+        DisappearListener(View view, int finalVisibility, boolean suppressLayout) {
+            mView = view;
+            mFinalVisibility = finalVisibility;
+            mParent = (ViewGroup) view.getParent();
+            mSuppressLayout = suppressLayout;
+            // Prevent a layout from including mView in its calculation.
+            suppressLayout(true);
+        }
+
+        // This overrides both AnimatorListenerAdapter and
+        // AnimatorUtilsApi14.AnimatorPauseListenerCompat
+        @Override
+        public void onAnimationPause(Animator animation) {
+            if (!mCanceled) {
+                ViewUtils.setTransitionVisibility(mView, mFinalVisibility);
+            }
+        }
+
+        // This overrides both AnimatorListenerAdapter and
+        // AnimatorUtilsApi14.AnimatorPauseListenerCompat
+        @Override
+        public void onAnimationResume(Animator animation) {
+            if (!mCanceled) {
+                ViewUtils.setTransitionVisibility(mView, View.VISIBLE);
+            }
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+            mCanceled = true;
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationStart(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            hideViewWhenNotCanceled();
+        }
+
+        @Override
+        public void onTransitionStart(@NonNull Transition transition) {
+            // Do nothing
+        }
+
+        @Override
+        public void onTransitionEnd(@NonNull Transition transition) {
+            hideViewWhenNotCanceled();
+            transition.removeListener(this);
+        }
+
+        @Override
+        public void onTransitionCancel(@NonNull Transition transition) {
+        }
+
+        @Override
+        public void onTransitionPause(@NonNull Transition transition) {
+            suppressLayout(false);
+        }
+
+        @Override
+        public void onTransitionResume(@NonNull Transition transition) {
+            suppressLayout(true);
+        }
+
+        private void hideViewWhenNotCanceled() {
+            if (!mCanceled) {
+                // Recreate the parent's display list in case it includes mView.
+                ViewUtils.setTransitionVisibility(mView, mFinalVisibility);
+                if (mParent != null) {
+                    mParent.invalidate();
+                }
+            }
+            // Layout is allowed now that the View is in its final state
+            suppressLayout(false);
+        }
+
+        private void suppressLayout(boolean suppress) {
+            if (mSuppressLayout && mLayoutSuppressed != suppress && mParent != null) {
+                mLayoutSuppressed = suppress;
+                ViewGroupUtils.suppressLayout(mParent, suppress);
+            }
+        }
+    }
+
     // TODO: Implement API 23; isTransitionRequired
 
 }
diff --git a/transition/tests/res/layout/scene0.xml b/transition/tests/res/layout/support_scene0.xml
similarity index 100%
rename from transition/tests/res/layout/scene0.xml
rename to transition/tests/res/layout/support_scene0.xml
diff --git a/transition/tests/src/android/support/transition/FadeTest.java b/transition/tests/src/android/support/transition/FadeTest.java
index 0493a99..3b171e2 100644
--- a/transition/tests/src/android/support/transition/FadeTest.java
+++ b/transition/tests/src/android/support/transition/FadeTest.java
@@ -16,12 +16,26 @@
 
 package android.support.transition;
 
+import static org.hamcrest.CoreMatchers.allOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
 
 import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.MediumTest;
 import android.view.View;
@@ -100,4 +114,162 @@
         assertThat(animator, is(nullValue()));
     }
 
+    @Test
+    public void testFadeOutThenIn() throws Throwable {
+        // Fade out
+        final Runnable interrupt = mock(Runnable.class);
+        float[] valuesOut = new float[2];
+        final InterruptibleFade fadeOut = new InterruptibleFade(Fade.MODE_OUT, interrupt,
+                valuesOut);
+        final Transition.TransitionListener listenerOut = mock(Transition.TransitionListener.class);
+        fadeOut.addListener(listenerOut);
+        changeVisibility(fadeOut, mRoot, mView, View.INVISIBLE);
+        verify(listenerOut, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        // The view is in the middle of fading out
+        verify(interrupt, timeout(3000)).run();
+
+        // Fade in
+        float[] valuesIn = new float[2];
+        final InterruptibleFade fadeIn = new InterruptibleFade(Fade.MODE_IN, null, valuesIn);
+        final Transition.TransitionListener listenerIn = mock(Transition.TransitionListener.class);
+        fadeIn.addListener(listenerIn);
+        changeVisibility(fadeIn, mRoot, mView, View.VISIBLE);
+        verify(listenerOut, timeout(3000)).onTransitionPause(any(Transition.class));
+        verify(listenerIn, timeout(3000)).onTransitionStart(any(Transition.class));
+        assertThat(valuesOut[1], allOf(greaterThan(0f), lessThan(1f)));
+        if (Build.VERSION.SDK_INT >= 19) {
+            // These won't match on API levels 18 and below due to lack of Animator pause.
+            assertEquals(valuesOut[1], valuesIn[0], 0.01f);
+        }
+
+        verify(listenerIn, timeout(3000)).onTransitionEnd(any(Transition.class));
+        assertThat(mView.getVisibility(), is(View.VISIBLE));
+        assertEquals(valuesIn[1], 1.f, 0.01f);
+    }
+
+    @Test
+    public void testFadeInThenOut() throws Throwable {
+        changeVisibility(null, mRoot, mView, View.INVISIBLE);
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+        // Fade in
+        final Runnable interrupt = mock(Runnable.class);
+        float[] valuesIn = new float[2];
+        final InterruptibleFade fadeIn = new InterruptibleFade(Fade.MODE_IN, interrupt, valuesIn);
+        final Transition.TransitionListener listenerIn = mock(Transition.TransitionListener.class);
+        fadeIn.addListener(listenerIn);
+        changeVisibility(fadeIn, mRoot, mView, View.VISIBLE);
+        verify(listenerIn, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        // The view is in the middle of fading in
+        verify(interrupt, timeout(3000)).run();
+
+        // Fade out
+        float[] valuesOut = new float[2];
+        final InterruptibleFade fadeOut = new InterruptibleFade(Fade.MODE_OUT, null, valuesOut);
+        final Transition.TransitionListener listenerOut = mock(Transition.TransitionListener.class);
+        fadeOut.addListener(listenerOut);
+        changeVisibility(fadeOut, mRoot, mView, View.INVISIBLE);
+        verify(listenerIn, timeout(3000)).onTransitionPause(any(Transition.class));
+        verify(listenerOut, timeout(3000)).onTransitionStart(any(Transition.class));
+        assertThat(valuesIn[1], allOf(greaterThan(0f), lessThan(1f)));
+        if (Build.VERSION.SDK_INT >= 19) {
+            // These won't match on API levels 18 and below due to lack of Animator pause.
+            assertEquals(valuesIn[1], valuesOut[0], 0.01f);
+        }
+
+        verify(listenerOut, timeout(3000)).onTransitionEnd(any(Transition.class));
+        assertThat(mView.getVisibility(), is(View.INVISIBLE));
+    }
+
+    @Test
+    public void testFadeWithAlpha() throws Throwable {
+        // Set the view alpha to 0.5
+        rule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mView.setAlpha(0.5f);
+            }
+        });
+        // Fade out
+        final Fade fadeOut = new Fade(Fade.OUT);
+        final Transition.TransitionListener listenerOut = mock(Transition.TransitionListener.class);
+        fadeOut.addListener(listenerOut);
+        changeVisibility(fadeOut, mRoot, mView, View.INVISIBLE);
+        verify(listenerOut, timeout(3000)).onTransitionStart(any(Transition.class));
+        verify(listenerOut, timeout(3000)).onTransitionEnd(any(Transition.class));
+        // Fade in
+        final Fade fadeIn = new Fade(Fade.IN);
+        final Transition.TransitionListener listenerIn = mock(Transition.TransitionListener.class);
+        fadeIn.addListener(listenerIn);
+        changeVisibility(fadeIn, mRoot, mView, View.VISIBLE);
+        verify(listenerIn, timeout(3000)).onTransitionStart(any(Transition.class));
+        verify(listenerIn, timeout(3000)).onTransitionEnd(any(Transition.class));
+        // Confirm that the view still has the original alpha value
+        assertThat(mView.getVisibility(), is(View.VISIBLE));
+        assertEquals(0.5f, mView.getAlpha(), 0.01f);
+    }
+
+    private void changeVisibility(final Fade fade, final ViewGroup container, final View target,
+            final int visibility) throws Throwable {
+        rule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (fade != null) {
+                    TransitionManager.beginDelayedTransition(container, fade);
+                }
+                target.setVisibility(visibility);
+            }
+        });
+    }
+
+    /**
+     * A special version of {@link Fade} that runs a specified {@link Runnable} soon after the
+     * target starts fading in or out.
+     */
+    private static class InterruptibleFade extends Fade {
+
+        static final float ALPHA_THRESHOLD = 0.2f;
+
+        float mInitialAlpha = -1;
+        Runnable mMiddle;
+        final float[] mAlphaValues;
+
+        InterruptibleFade(int mode, Runnable middle, float[] alphaValues) {
+            super(mode);
+            mMiddle = middle;
+            mAlphaValues = alphaValues;
+        }
+
+        @Nullable
+        @Override
+        public Animator createAnimator(@NonNull ViewGroup sceneRoot,
+                @Nullable final TransitionValues startValues,
+                @Nullable final TransitionValues endValues) {
+            final Animator animator = super.createAnimator(sceneRoot, startValues, endValues);
+            if (animator instanceof ObjectAnimator) {
+                ((ObjectAnimator) animator).addUpdateListener(
+                        new ValueAnimator.AnimatorUpdateListener() {
+                            @Override
+                            public void onAnimationUpdate(ValueAnimator animation) {
+                                final float alpha = (float) animation.getAnimatedValue();
+                                mAlphaValues[1] = alpha;
+                                if (mInitialAlpha < 0) {
+                                    mInitialAlpha = alpha;
+                                    mAlphaValues[0] = mInitialAlpha;
+                                } else if (Math.abs(alpha - mInitialAlpha) > ALPHA_THRESHOLD) {
+                                    if (mMiddle != null) {
+                                        mMiddle.run();
+                                        mMiddle = null;
+                                    }
+                                }
+                            }
+                        });
+            }
+            return animator;
+        }
+
+    }
+
 }
diff --git a/transition/tests/src/android/support/transition/SceneTest.java b/transition/tests/src/android/support/transition/SceneTest.java
index f192327..129a3eb 100644
--- a/transition/tests/src/android/support/transition/SceneTest.java
+++ b/transition/tests/src/android/support/transition/SceneTest.java
@@ -118,9 +118,10 @@
     public void testGetSceneForLayout_cache() {
         TransitionActivity activity = rule.getActivity();
         ViewGroup root = activity.getRoot();
-        Scene scene = Scene.getSceneForLayout(root, R.layout.scene0, activity);
+        Scene scene = Scene.getSceneForLayout(root, R.layout.support_scene0, activity);
         assertThat("getSceneForLayout should return the same instance for subsequent calls",
-                Scene.getSceneForLayout(root, R.layout.scene0, activity), is(sameInstance(scene)));
+                Scene.getSceneForLayout(root, R.layout.support_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
index 43f03d3..958435c 100644
--- a/transition/tests/src/android/support/transition/TransitionActivity.java
+++ b/transition/tests/src/android/support/transition/TransitionActivity.java
@@ -30,7 +30,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_transition);
-        mRoot = (LinearLayout) findViewById(R.id.root);
+        mRoot = findViewById(R.id.root);
     }
 
     ViewGroup getRoot() {
diff --git a/transition/tests/src/android/support/transition/TransitionManagerTest.java b/transition/tests/src/android/support/transition/TransitionManagerTest.java
index 82fb17b..7f49982 100644
--- a/transition/tests/src/android/support/transition/TransitionManagerTest.java
+++ b/transition/tests/src/android/support/transition/TransitionManagerTest.java
@@ -38,8 +38,8 @@
     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);
+        mScenes[0] = Scene.getSceneForLayout(root, R.layout.support_scene0, activity);
+        mScenes[1] = Scene.getSceneForLayout(root, R.layout.support_scene1, activity);
     }
 
     @Test
@@ -118,4 +118,18 @@
                 listener.await(), is(true));
     }
 
+    @Test
+    public void testGo_nullParameter() throws Throwable {
+        final ViewGroup root = rule.getActivity().getRoot();
+        rule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.go(mScenes[0], null);
+                assertThat(Scene.getCurrentScene(root), is(mScenes[0]));
+                TransitionManager.go(mScenes[1], null);
+                assertThat(Scene.getCurrentScene(root), is(mScenes[1]));
+            }
+        });
+    }
+
 }
diff --git a/transition/tests/src/android/support/transition/TransitionTest.java b/transition/tests/src/android/support/transition/TransitionTest.java
index 335c07b..361c4e0 100644
--- a/transition/tests/src/android/support/transition/TransitionTest.java
+++ b/transition/tests/src/android/support/transition/TransitionTest.java
@@ -64,8 +64,8 @@
     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);
+        mScenes[0] = Scene.getSceneForLayout(root, R.layout.support_scene0, activity);
+        mScenes[1] = Scene.getSceneForLayout(root, R.layout.support_scene1, activity);
     }
 
     @Test
@@ -121,7 +121,8 @@
         // Set up views
         TransitionActivity activity = rule.getActivity();
         ViewGroup root = activity.getRoot();
-        View container = LayoutInflater.from(activity).inflate(R.layout.scene0, root, false);
+        View container = LayoutInflater.from(activity)
+                .inflate(R.layout.support_scene0, root, false);
         root.addView(container);
         View view0 = container.findViewById(R.id.view0);
         View view1 = container.findViewById(R.id.view1);
diff --git a/tv-provider/src/android/support/media/tv/BasePreviewProgram.java b/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
index 3cd5f77..06deedc 100644
--- a/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
+++ b/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
@@ -23,12 +23,12 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.support.annotation.RestrictTo;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns.AspectRatio;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns.Availability;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns.InteractionType;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns.ReviewRatingStyle;
-import android.support.media.tv.TvContractCompat.BasePreviewProgramColumns.Type;
+import android.support.media.tv.TvContractCompat.PreviewProgramColumns;
+import android.support.media.tv.TvContractCompat.PreviewProgramColumns.AspectRatio;
+import android.support.media.tv.TvContractCompat.PreviewProgramColumns.Availability;
+import android.support.media.tv.TvContractCompat.PreviewProgramColumns.InteractionType;
+import android.support.media.tv.TvContractCompat.PreviewProgramColumns.Type;
+import android.support.media.tv.TvContractCompat.PreviewPrograms;
 import android.support.v4.os.BuildCompat;
 import android.text.TextUtils;
 
@@ -38,8 +38,7 @@
 import java.util.Objects;
 
 /**
- * Base class for derived classes that want to have fields defined in
- * {@link BasePreviewProgramColumns}.
+ * Base class for derived classes that want to have common fields for preview programs.
  */
 @TargetApi(26)
 public abstract class BasePreviewProgram extends BaseProgram {
@@ -59,23 +58,21 @@
     private final Uri mPreviewVideoUri;
     private final int mLastPlaybackPositionMillis;
     private final int mDurationMillis;
-    private final Uri mAppLinkIntentUri;
+    private final Uri mIntentUri;
     private final int mTransient;
-    private final String mType;
-    private final String mPosterArtAspectRatio;
-    private final String mThumbnailAspectRatio;
+    private final int mType;
+    private final int mPosterArtAspectRatio;
+    private final int mThumbnailAspectRatio;
     private final Uri mLogoUri;
-    private final String mAvailability;
+    private final int mAvailability;
     private final String mStartingPrice;
     private final String mOfferPrice;
     private final String mReleaseDate;
     private final int mItemCount;
     private final int mLive;
-    private final String mInteractionType;
+    private final int mInteractionType;
     private final long mInteractionCount;
     private final String mAuthor;
-    private final String mReviewRatingStyle;
-    private final String mReviewRating;
     private final int mBrowsable;
     private final String mContentId;
 
@@ -85,7 +82,7 @@
         mPreviewVideoUri = builder.mPreviewVideoUri;
         mLastPlaybackPositionMillis = builder.mLastPlaybackPositionMillis;
         mDurationMillis = builder.mDurationMillis;
-        mAppLinkIntentUri = builder.mAppLinkIntentUri;
+        mIntentUri = builder.mIntentUri;
         mTransient = builder.mTransient;
         mType = builder.mType;
         mPosterArtAspectRatio = builder.mPosterArtAspectRatio;
@@ -100,186 +97,183 @@
         mInteractionType = builder.mInteractionType;
         mInteractionCount = builder.mInteractionCount;
         mAuthor = builder.mAuthor;
-        mReviewRatingStyle = builder.mReviewRatingStyle;
-        mReviewRating = builder.mReviewRating;
         mBrowsable = builder.mBrowsable;
         mContentId = builder.mContentId;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_INTERNAL_PROVIDER_ID} for the
-     * program.
+     * @return The internal provider ID for the program.
+     * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
      */
     public String getInternalProviderId() {
         return mInternalProviderId;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_PREVIEW_VIDEO_URI} for the
-     * program.
+     * @return The preview video URI for the program.
+     * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
      */
     public Uri getPreviewVideoUri() {
         return mPreviewVideoUri;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_LAST_PLAYBACK_POSITION_MILLIS}
-     * for the program.
+     * @return The last playback position of the program in millis.
+     * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
      */
     public int getLastPlaybackPositionMillis() {
         return mLastPlaybackPositionMillis;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_DURATION_MILLIS} for the
-     * program.
+     * @return The duration of the program in millis.
+     * @see PreviewPrograms#COLUMN_DURATION_MILLIS
      */
     public int getDurationMillis() {
         return mDurationMillis;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_APP_LINK_INTENT_URI} for the
-     * program.
+     * @return The intent URI which is launched when the program is selected.
+     * @see PreviewPrograms#COLUMN_INTENT_URI
      */
-    public Uri getAppLinkIntentUri() {
-        return mAppLinkIntentUri;
+    public Uri getIntentUri() {
+        return mIntentUri;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_APP_LINK_INTENT_URI} for the
-     * program.
+     * @return The intent which is launched when the program is selected.
+     * @see PreviewPrograms#COLUMN_INTENT_URI
      */
-    public Intent getAppLinkIntent() throws URISyntaxException {
-        return Intent.parseUri(mAppLinkIntentUri.toString(), Intent.URI_INTENT_SCHEME);
+    public Intent getIntent() throws URISyntaxException {
+        return Intent.parseUri(mIntentUri.toString(), Intent.URI_INTENT_SCHEME);
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_TRANSIENT} for the program.
+     * @return Whether the program is transient or not.
+     * @see PreviewPrograms#COLUMN_TRANSIENT
      */
     public boolean isTransient() {
         return mTransient == IS_TRANSIENT;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_TYPE} for the program.
+     * @return The type of the program.
+     * @see PreviewPrograms#COLUMN_TYPE
      */
-    public @Type String getType() {
+    public @Type int getType() {
         return mType;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_POSTER_ART_ASPECT_RATIO} for the
-     * program.
+     * @return The poster art aspect ratio for the program.
+     * @see PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
+     * @see PreviewPrograms#COLUMN_POSTER_ART_URI
      */
-    public @AspectRatio String getPosterArtAspectRatio() {
+    public @AspectRatio int getPosterArtAspectRatio() {
         return mPosterArtAspectRatio;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_THUMBNAIL_ASPECT_RATIO} for the
-     * program.
+     * @return The thumbnail aspect ratio for the program.
+     * @see PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
+     * @see PreviewPrograms#COLUMN_THUMBNAIL_URI
      */
-    public @AspectRatio String getThumbnailAspectRatio() {
+    public @AspectRatio int getThumbnailAspectRatio() {
         return mThumbnailAspectRatio;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_LOGO_URI} for the program.
+     * @return The logo URI for the program.
+     * @see PreviewPrograms#COLUMN_LOGO_URI
      */
     public Uri getLogoUri() {
         return mLogoUri;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_AVAILABILITY} for the program.
+     * @return The availability of the program.
+     * @see PreviewPrograms#COLUMN_AVAILABILITY
      */
-    public @Availability String getAvailability() {
+    public @Availability int getAvailability() {
         return mAvailability;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_STARTING_PRICE} for the program.
+     * @return The starting price of the program.
+     * @see PreviewPrograms#COLUMN_STARTING_PRICE
      */
     public String getStartingPrice() {
         return mStartingPrice;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_OFFER_PRICE} for the program.
+     * @return The offer price of the program.
+     * @see PreviewPrograms#COLUMN_OFFER_PRICE
      */
     public String getOfferPrice() {
         return mOfferPrice;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_RELEASE_DATE} for the program.
+     * @return The release date of the program.
+     * @see PreviewPrograms#COLUMN_RELEASE_DATE
      */
     public String getReleaseDate() {
         return mReleaseDate;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_ITEM_COUNT} for the program.
+     * @return The item count for the program.
+     * @see PreviewPrograms#COLUMN_ITEM_COUNT
      */
     public int getItemCount() {
         return mItemCount;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_LIVE} for the program.
+     * @return Whether the program is live or not.
+     * @see PreviewPrograms#COLUMN_LIVE
      */
     public boolean isLive() {
         return mLive == IS_LIVE;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_INTERACTION_TYPE} for the
-     * program.
+     * @return The interaction type for the program.
+     * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
      */
-    public @InteractionType String getInteractionType() {
+    public @InteractionType int getInteractionType() {
         return mInteractionType;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_INTERACTION_COUNT} for the
-     * program.
+     * @return The interaction count for the program.
+     * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
      */
     public long getInteractionCount() {
         return mInteractionCount;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_AUTHOR} for the program.
+     * @return The author for the program.
+     * @see PreviewPrograms#COLUMN_AUTHOR
      */
     public String getAuthor() {
         return mAuthor;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_REVIEW_RATING_STYLE} for the
-     * program.
-     */
-    public @ReviewRatingStyle String getReviewRatingStyle() {
-        return mReviewRatingStyle;
-    }
-
-    /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_REVIEW_RATING} for the program.
-     */
-    public String getReviewRating() {
-        return mReviewRating;
-    }
-
-    /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_BROWSABLE} for the program.
+     * @return Whether the program is browsable or not.
+     * @see PreviewPrograms#COLUMN_BROWSABLE;
      */
     public boolean isBrowsable() {
         return mBrowsable == IS_BROWSABLE;
     }
 
     /**
-     * @return The value of {@link BasePreviewProgramColumns#COLUMN_CONTENT_ID} for the program.
+     * @return The content ID for the program.
+     * @see PreviewPrograms#COLUMN_CONTENT_ID
      */
     public String getContentId() {
         return mContentId;
@@ -299,8 +293,7 @@
                 && Objects.equals(mLastPlaybackPositionMillis,
                 program.mLastPlaybackPositionMillis)
                 && Objects.equals(mDurationMillis, program.mDurationMillis)
-                && Objects.equals(mAppLinkIntentUri,
-                program.mAppLinkIntentUri)
+                && Objects.equals(mIntentUri, program.mIntentUri)
                 && Objects.equals(mTransient, program.mTransient)
                 && Objects.equals(mType, program.mType)
                 && Objects.equals(mPosterArtAspectRatio, program.mPosterArtAspectRatio)
@@ -315,15 +308,13 @@
                 && Objects.equals(mInteractionType, program.mInteractionType)
                 && Objects.equals(mInteractionCount, program.mInteractionCount)
                 && Objects.equals(mAuthor, program.mAuthor)
-                && Objects.equals(mReviewRatingStyle, program.mReviewRatingStyle)
-                && Objects.equals(mReviewRating, program.mReviewRating)
                 && Objects.equals(mBrowsable, program.mBrowsable)
                 && Objects.equals(mContentId, program.mContentId);
     }
 
     /**
-     * @return The fields of the Program in the ContentValues format to be easily inserted into the
-     * TV Input Framework database.
+     * @return The fields of the BasePreviewProgram in {@link ContentValues} format to be easily
+     * inserted into the TV Input Framework database.
      */
     @Override
     public ContentValues toContentValues() {
@@ -342,82 +333,73 @@
         ContentValues values = super.toContentValues();
         if (BuildCompat.isAtLeastO()) {
             if (!TextUtils.isEmpty(mInternalProviderId)) {
-                values.put(BasePreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID,
-                        mInternalProviderId);
+                values.put(PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID, mInternalProviderId);
             }
             if (mPreviewVideoUri != null) {
-                values.put(BasePreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI,
+                values.put(PreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI,
                         mPreviewVideoUri.toString());
             }
             if (mLastPlaybackPositionMillis != INVALID_INT_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
+                values.put(PreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
                         mLastPlaybackPositionMillis);
             }
             if (mDurationMillis != INVALID_INT_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_DURATION_MILLIS, mDurationMillis);
+                values.put(PreviewProgramColumns.COLUMN_DURATION_MILLIS, mDurationMillis);
             }
-            if (mAppLinkIntentUri != null) {
-                values.put(BasePreviewProgramColumns.COLUMN_APP_LINK_INTENT_URI,
-                        mAppLinkIntentUri.toString());
+            if (mIntentUri != null) {
+                values.put(PreviewProgramColumns.COLUMN_INTENT_URI, mIntentUri.toString());
             }
             if (mTransient != INVALID_INT_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_TRANSIENT, mTransient);
+                values.put(PreviewProgramColumns.COLUMN_TRANSIENT, mTransient);
             }
-            if (!TextUtils.isEmpty(mType)) {
-                values.put(BasePreviewProgramColumns.COLUMN_TYPE, mType);
+            if (mType != INVALID_INT_VALUE) {
+                values.put(PreviewProgramColumns.COLUMN_TYPE, mType);
             }
-            if (!TextUtils.isEmpty(mPosterArtAspectRatio)) {
-                values.put(BasePreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO,
+            if (mPosterArtAspectRatio != INVALID_INT_VALUE) {
+                values.put(PreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO,
                         mPosterArtAspectRatio);
             }
-            if (!TextUtils.isEmpty(mThumbnailAspectRatio)) {
-                values.put(BasePreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO,
+            if (mThumbnailAspectRatio != INVALID_INT_VALUE) {
+                values.put(PreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO,
                         mThumbnailAspectRatio);
             }
             if (mLogoUri != null) {
-                values.put(BasePreviewProgramColumns.COLUMN_LOGO_URI, mLogoUri.toString());
+                values.put(PreviewProgramColumns.COLUMN_LOGO_URI, mLogoUri.toString());
             }
-            if (!TextUtils.isEmpty(mAvailability)) {
-                values.put(BasePreviewProgramColumns.COLUMN_AVAILABILITY, mAvailability);
+            if (mAvailability != INVALID_INT_VALUE) {
+                values.put(PreviewProgramColumns.COLUMN_AVAILABILITY, mAvailability);
             }
             if (!TextUtils.isEmpty(mStartingPrice)) {
-                values.put(BasePreviewProgramColumns.COLUMN_STARTING_PRICE, mStartingPrice);
+                values.put(PreviewProgramColumns.COLUMN_STARTING_PRICE, mStartingPrice);
             }
             if (!TextUtils.isEmpty(mOfferPrice)) {
-                values.put(BasePreviewProgramColumns.COLUMN_OFFER_PRICE, mOfferPrice);
+                values.put(PreviewProgramColumns.COLUMN_OFFER_PRICE, mOfferPrice);
             }
             if (!TextUtils.isEmpty(mReleaseDate)) {
-                values.put(BasePreviewProgramColumns.COLUMN_RELEASE_DATE, mReleaseDate);
+                values.put(PreviewProgramColumns.COLUMN_RELEASE_DATE, mReleaseDate);
             }
             if (mItemCount != INVALID_INT_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_ITEM_COUNT, mItemCount);
+                values.put(PreviewProgramColumns.COLUMN_ITEM_COUNT, mItemCount);
             }
             if (mLive != INVALID_INT_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_LIVE, mLive);
+                values.put(PreviewProgramColumns.COLUMN_LIVE, mLive);
             }
-            if (!TextUtils.isEmpty(mInteractionType)) {
-                values.put(BasePreviewProgramColumns.COLUMN_INTERACTION_TYPE, mInteractionType);
+            if (mInteractionType != INVALID_INT_VALUE) {
+                values.put(PreviewProgramColumns.COLUMN_INTERACTION_TYPE, mInteractionType);
             }
             if (mInteractionCount != INVALID_LONG_VALUE) {
-                values.put(BasePreviewProgramColumns.COLUMN_INTERACTION_COUNT, mInteractionCount);
+                values.put(PreviewProgramColumns.COLUMN_INTERACTION_COUNT, mInteractionCount);
             }
             if (!TextUtils.isEmpty(mAuthor)) {
-                values.put(BasePreviewProgramColumns.COLUMN_AUTHOR, mAuthor);
-            }
-            if (!TextUtils.isEmpty(mReviewRatingStyle)) {
-                values.put(BasePreviewProgramColumns.COLUMN_REVIEW_RATING_STYLE,
-                        mReviewRatingStyle);
-            }
-            if (!TextUtils.isEmpty(mReviewRating)) {
-                values.put(BasePreviewProgramColumns.COLUMN_REVIEW_RATING, mReviewRating);
+                values.put(PreviewProgramColumns.COLUMN_AUTHOR, mAuthor);
             }
             if (!TextUtils.isEmpty(mContentId)) {
-                values.put(BasePreviewProgramColumns.COLUMN_CONTENT_ID, mContentId);
+                values.put(PreviewProgramColumns.COLUMN_CONTENT_ID, mContentId);
             }
             if (includeProtectedFields) {
                 if (BuildCompat.isAtLeastO()) {
                     if (mBrowsable != INVALID_INT_VALUE) {
-                        values.put(BasePreviewProgramColumns.COLUMN_BROWSABLE, mBrowsable);
+                        values.put(PreviewProgramColumns.COLUMN_BROWSABLE, mBrowsable);
                     }
                 }
             }
@@ -436,107 +418,93 @@
         BaseProgram.setFieldsFromCursor(cursor, builder);
         int index;
         if (BuildCompat.isAtLeastO()) {
-            if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID)) >= 0
+            if ((index =
+                    cursor.getColumnIndex(PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderId(cursor.getString(index));
             }
             if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI)) >= 0
+                    cursor.getColumnIndex(PreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setPreviewVideoUri(Uri.parse(cursor.getString(index)));
             }
             if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS)) >= 0
+                    PreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setLastPlaybackPositionMillis(cursor.getInt(index));
             }
             if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_DURATION_MILLIS)) >= 0
+                    cursor.getColumnIndex(PreviewProgramColumns.COLUMN_DURATION_MILLIS)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setDurationMillis(cursor.getInt(index));
             }
-            if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_APP_LINK_INTENT_URI)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_INTENT_URI)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setAppLinkIntentUri(Uri.parse(cursor.getString(index)));
+                builder.setIntentUri(Uri.parse(cursor.getString(index)));
             }
-            if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_TRANSIENT)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_TRANSIENT)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setTransient(cursor.getInt(index) == IS_TRANSIENT);
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_TYPE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_TYPE)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setType(cursor.getString(index));
+                builder.setType(cursor.getInt(index));
             }
             if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO)) >= 0
+                    PreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setPosterArtAspectRatio(cursor.getString(index));
+                builder.setPosterArtAspectRatio(cursor.getInt(index));
             }
-            if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO)) >= 0
+            if ((index =
+                    cursor.getColumnIndex(PreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setThumbnailAspectRatio(cursor.getString(index));
+                builder.setThumbnailAspectRatio(cursor.getInt(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_LOGO_URI)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_LOGO_URI)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setLogoUri(Uri.parse(cursor.getString(index)));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_AVAILABILITY)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_AVAILABILITY)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setAvailability(cursor.getString(index));
+                builder.setAvailability(cursor.getInt(index));
             }
-            if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_STARTING_PRICE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_STARTING_PRICE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setStartingPrice(cursor.getString(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_OFFER_PRICE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_OFFER_PRICE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setOfferPrice(cursor.getString(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_RELEASE_DATE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_RELEASE_DATE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setReleaseDate(cursor.getString(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_ITEM_COUNT)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_ITEM_COUNT)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setItemCount(cursor.getInt(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_LIVE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_LIVE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setLive(cursor.getInt(index) == IS_LIVE);
             }
-            if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_INTERACTION_TYPE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_INTERACTION_TYPE)) >= 0
                     && !cursor.isNull(index)) {
-                builder.setInteractionType(cursor.getString(index));
+                builder.setInteractionType(cursor.getInt(index));
             }
-            if ((index =
-                    cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_INTERACTION_COUNT)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_INTERACTION_COUNT)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInteractionCount(cursor.getInt(index));
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_AUTHOR)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_AUTHOR)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setAuthor(cursor.getString(index));
             }
-            if ((index = cursor.getColumnIndex(
-                    BasePreviewProgramColumns.COLUMN_REVIEW_RATING_STYLE)) >= 0
-                    && !cursor.isNull(index)) {
-                builder.setReviewRatingStyle(cursor.getString(index));
-            }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_REVIEW_RATING)) >= 0
-                    && !cursor.isNull(index)) {
-                builder.setReviewRating(cursor.getString(index));
-            }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_BROWSABLE)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_BROWSABLE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setBrowsable(cursor.getInt(index) == IS_BROWSABLE);
             }
-            if ((index = cursor.getColumnIndex(BasePreviewProgramColumns.COLUMN_CONTENT_ID)) >= 0
+            if ((index = cursor.getColumnIndex(PreviewProgramColumns.COLUMN_CONTENT_ID)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setContentId(cursor.getString(index));
             }
@@ -545,29 +513,27 @@
 
     private static String[] getProjection() {
         String[] oColumns = new String[] {
-                BasePreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID,
-                BasePreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI,
-                BasePreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
-                BasePreviewProgramColumns.COLUMN_DURATION_MILLIS,
-                BasePreviewProgramColumns.COLUMN_APP_LINK_INTENT_URI,
-                BasePreviewProgramColumns.COLUMN_TRANSIENT,
-                BasePreviewProgramColumns.COLUMN_TYPE,
-                BasePreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO,
-                BasePreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO,
-                BasePreviewProgramColumns.COLUMN_LOGO_URI,
-                BasePreviewProgramColumns.COLUMN_AVAILABILITY,
-                BasePreviewProgramColumns.COLUMN_STARTING_PRICE,
-                BasePreviewProgramColumns.COLUMN_OFFER_PRICE,
-                BasePreviewProgramColumns.COLUMN_RELEASE_DATE,
-                BasePreviewProgramColumns.COLUMN_ITEM_COUNT,
-                BasePreviewProgramColumns.COLUMN_LIVE,
-                BasePreviewProgramColumns.COLUMN_INTERACTION_TYPE,
-                BasePreviewProgramColumns.COLUMN_INTERACTION_COUNT,
-                BasePreviewProgramColumns.COLUMN_AUTHOR,
-                BasePreviewProgramColumns.COLUMN_REVIEW_RATING_STYLE,
-                BasePreviewProgramColumns.COLUMN_REVIEW_RATING,
-                BasePreviewProgramColumns.COLUMN_BROWSABLE,
-                BasePreviewProgramColumns.COLUMN_CONTENT_ID,
+                PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID,
+                PreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI,
+                PreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
+                PreviewProgramColumns.COLUMN_DURATION_MILLIS,
+                PreviewProgramColumns.COLUMN_INTENT_URI,
+                PreviewProgramColumns.COLUMN_TRANSIENT,
+                PreviewProgramColumns.COLUMN_TYPE,
+                PreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO,
+                PreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO,
+                PreviewProgramColumns.COLUMN_LOGO_URI,
+                PreviewProgramColumns.COLUMN_AVAILABILITY,
+                PreviewProgramColumns.COLUMN_STARTING_PRICE,
+                PreviewProgramColumns.COLUMN_OFFER_PRICE,
+                PreviewProgramColumns.COLUMN_RELEASE_DATE,
+                PreviewProgramColumns.COLUMN_ITEM_COUNT,
+                PreviewProgramColumns.COLUMN_LIVE,
+                PreviewProgramColumns.COLUMN_INTERACTION_TYPE,
+                PreviewProgramColumns.COLUMN_INTERACTION_COUNT,
+                PreviewProgramColumns.COLUMN_AUTHOR,
+                PreviewProgramColumns.COLUMN_BROWSABLE,
+                PreviewProgramColumns.COLUMN_CONTENT_ID,
         };
         return CollectionUtils.concatAll(BaseProgram.PROJECTION, oColumns);
     }
@@ -584,23 +550,21 @@
         private Uri mPreviewVideoUri;
         private int mLastPlaybackPositionMillis = INVALID_INT_VALUE;
         private int mDurationMillis = INVALID_INT_VALUE;
-        private Uri mAppLinkIntentUri;
+        private Uri mIntentUri;
         private int mTransient = INVALID_INT_VALUE;
-        private String mType;
-        private String mPosterArtAspectRatio;
-        private String mThumbnailAspectRatio;
+        private int mType = INVALID_INT_VALUE;
+        private int mPosterArtAspectRatio = INVALID_INT_VALUE;
+        private int mThumbnailAspectRatio = INVALID_INT_VALUE;
         private Uri mLogoUri;
-        private String mAvailability;
+        private int mAvailability = INVALID_INT_VALUE;
         private String mStartingPrice;
         private String mOfferPrice;
         private String mReleaseDate;
         private int mItemCount = INVALID_INT_VALUE;
         private int mLive = INVALID_INT_VALUE;
-        private String mInteractionType;
+        private int mInteractionType = INVALID_INT_VALUE;
         private long mInteractionCount = INVALID_LONG_VALUE;
         private String mAuthor;
-        private String mReviewRatingStyle;
-        private String mReviewRating;
         private int mBrowsable = INVALID_INT_VALUE;
         private String mContentId;
 
@@ -620,7 +584,7 @@
             mPreviewVideoUri = other.mPreviewVideoUri;
             mLastPlaybackPositionMillis = other.mLastPlaybackPositionMillis;
             mDurationMillis = other.mDurationMillis;
-            mAppLinkIntentUri = other.mAppLinkIntentUri;
+            mIntentUri = other.mIntentUri;
             mTransient = other.mTransient;
             mType = other.mType;
             mPosterArtAspectRatio = other.mPosterArtAspectRatio;
@@ -635,8 +599,6 @@
             mInteractionType = other.mInteractionType;
             mInteractionCount  = other.mInteractionCount;
             mAuthor = other.mAuthor;
-            mReviewRatingStyle = other.mReviewRatingStyle;
-            mReviewRating = other.mReviewRating;
             mBrowsable = other.mBrowsable;
             mContentId = other.mContentId;
         }
@@ -644,10 +606,9 @@
         /**
          * Sets external ID for the program.
          *
-         * @param externalId The value of
-         *                   {@link BasePreviewProgramColumns#COLUMN_INTERNAL_PROVIDER_ID} for the
-         *                   program.
+         * @param externalId The internal provider ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
          */
         public T setInternalProviderId(String externalId) {
             mExternalId = externalId;
@@ -657,10 +618,9 @@
         /**
          * Sets a URI for the preview video.
          *
-         * @param previewVideoUri The value of
-         *                        {@link BasePreviewProgramColumns#COLUMN_PREVIEW_VIDEO_URI} for the
-         *                        program.
+         * @param previewVideoUri The preview video URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
          */
         public T setPreviewVideoUri(Uri previewVideoUri) {
             mPreviewVideoUri = previewVideoUri;
@@ -670,10 +630,9 @@
         /**
          * Sets the last playback position (in milliseconds) of the preview video.
          *
-         * @param position The value of
-         *                 {@link BasePreviewProgramColumns#COLUMN_LAST_PLAYBACK_POSITION_MILLIS}
-         *                 for the program.
+         * @param position The last playback posirion for the program in millis.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
          */
         public T setLastPlaybackPositionMillis(int position) {
             mLastPlaybackPositionMillis = position;
@@ -683,9 +642,9 @@
         /**
          * Sets the last playback duration (in milliseconds) of the preview video.
          *
-         * @param duration The value of {@link BasePreviewProgramColumns#COLUMN_DURATION_MILLIS} for
-         *                 the program.
+         * @param duration The duration the program in millis.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_DURATION_MILLIS
          */
         public T setDurationMillis(int duration) {
             mDurationMillis = duration;
@@ -693,34 +652,33 @@
         }
 
         /**
-         * Sets the intent URI of the app link for the preview video.
+         * Sets the intent URI which is launched when the program is selected.
          *
-         * @param appLinkIntentUri The value of
-         *                         {@link BasePreviewProgramColumns#COLUMN_APP_LINK_INTENT_URI} for
-         *                         the program.
+         * @param intentUri The intent URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_INTENT_URI
          */
-        public T setAppLinkIntentUri(Uri appLinkIntentUri) {
-            mAppLinkIntentUri = appLinkIntentUri;
+        public T setIntentUri(Uri intentUri) {
+            mIntentUri = intentUri;
             return (T) this;
         }
 
         /**
-         * Sets the intent of the app link for the preview video.
+         * Sets the intent which is launched when the program is selected.
          *
-         * @param appLinkIntent The Intent to be executed when the App Linking card is selected
+         * @param intent The Intent to be executed when the preview program is selected
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
-        public T setAppLinkIntent(Intent appLinkIntent) {
-            return setAppLinkIntentUri(Uri.parse(appLinkIntent.toUri(Intent.URI_INTENT_SCHEME)));
+        public T setIntent(Intent intent) {
+            return setIntentUri(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
         }
 
         /**
          * Sets whether this program is transient or not.
          *
-         * @param transientValue The value of {@link BasePreviewProgramColumns#COLUMN_TRANSIENT} for
-         *                       the program.
+         * @param transientValue Whether the program is transient or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_TRANSIENT
          */
         public T setTransient(boolean transientValue) {
             mTransient = transientValue ? IS_TRANSIENT : 0;
@@ -731,23 +689,24 @@
          * Sets the type of this program content.
          *
          * <p>The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#TYPE_MOVIE},
-         * {@link BasePreviewProgramColumns#TYPE_TV_SERIES},
-         * {@link BasePreviewProgramColumns#TYPE_TV_SEASON},
-         * {@link BasePreviewProgramColumns#TYPE_TV_EPISODE},
-         * {@link BasePreviewProgramColumns#TYPE_CLIP},
-         * {@link BasePreviewProgramColumns#TYPE_EVENT},
-         * {@link BasePreviewProgramColumns#TYPE_CHANNEL},
-         * {@link BasePreviewProgramColumns#TYPE_TRACK},
-         * {@link BasePreviewProgramColumns#TYPE_ALBUM},
-         * {@link BasePreviewProgramColumns#TYPE_ARTIST},
-         * {@link BasePreviewProgramColumns#TYPE_PLAYLIST}, and
-         * {@link BasePreviewProgramColumns#TYPE_STATION}.
+         * {@link PreviewPrograms#TYPE_MOVIE},
+         * {@link PreviewPrograms#TYPE_TV_SERIES},
+         * {@link PreviewPrograms#TYPE_TV_SEASON},
+         * {@link PreviewPrograms#TYPE_TV_EPISODE},
+         * {@link PreviewPrograms#TYPE_CLIP},
+         * {@link PreviewPrograms#TYPE_EVENT},
+         * {@link PreviewPrograms#TYPE_CHANNEL},
+         * {@link PreviewPrograms#TYPE_TRACK},
+         * {@link PreviewPrograms#TYPE_ALBUM},
+         * {@link PreviewPrograms#TYPE_ARTIST},
+         * {@link PreviewPrograms#TYPE_PLAYLIST}, and
+         * {@link PreviewPrograms#TYPE_STATION}.
          *
-         * @param type The value of {@link BasePreviewProgramColumns#COLUMN_TYPE} for the program.
+         * @param type The type of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_TYPE
          */
-        public T setType(@Type String type) {
+        public T setType(@Type int type) {
             mType = type;
             return (T) this;
         }
@@ -756,17 +715,18 @@
          * Sets the aspect ratio of the poster art for this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_16_9},
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_3_2},
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_1_1}, and
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_2_3}.
+         * {@link PreviewPrograms#ASPECT_RATIO_16_9},
+         * {@link PreviewPrograms#ASPECT_RATIO_3_2},
+         * {@link PreviewPrograms#ASPECT_RATIO_4_3},
+         * {@link PreviewPrograms#ASPECT_RATIO_1_1}, and
+         * {@link PreviewPrograms#ASPECT_RATIO_2_3}.
          *
-         * @param ratio The value of
-         *              {@link BasePreviewProgramColumns#COLUMN_POSTER_ART_ASPECT_RATIO} for the
-         *              program.
+         * @param ratio The poster art aspect ratio for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
+         * @see PreviewPrograms#COLUMN_POSTER_ART_URI
          */
-        public T setPosterArtAspectRatio(@AspectRatio String ratio) {
+        public T setPosterArtAspectRatio(@AspectRatio int ratio) {
             mPosterArtAspectRatio = ratio;
             return (T) this;
         }
@@ -775,16 +735,17 @@
          * Sets the aspect ratio of the thumbnail for this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_16_9},
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_3_2},
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_1_1}, and
-         * {@link BasePreviewProgramColumns#ASPECT_RATIO_2_3}.
+         * {@link PreviewPrograms#ASPECT_RATIO_16_9},
+         * {@link PreviewPrograms#ASPECT_RATIO_3_2},
+         * {@link PreviewPrograms#ASPECT_RATIO_4_3},
+         * {@link PreviewPrograms#ASPECT_RATIO_1_1}, and
+         * {@link PreviewPrograms#ASPECT_RATIO_2_3}.
          *
-         * @param ratio The value of {@link BasePreviewProgramColumns#COLUMN_THUMBNAIL_ASPECT_RATIO}
-         *              for the program.
+         * @param ratio The thumbnail aspect ratio of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
          */
-        public T setThumbnailAspectRatio(@AspectRatio String ratio) {
+        public T setThumbnailAspectRatio(@AspectRatio int ratio) {
             mThumbnailAspectRatio = ratio;
             return (T) this;
         }
@@ -792,9 +753,9 @@
         /**
          * Sets the URI for the logo of this TV program.
          *
-         * @param logoUri The value of {@link BasePreviewProgramColumns#COLUMN_LOGO_URI} for the
-         *                program.
+         * @param logoUri The logo URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_LOGO_URI
          */
         public T setLogoUri(Uri logoUri) {
             mLogoUri = logoUri;
@@ -805,15 +766,15 @@
          * Sets the availability of this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#AVAILABILITY_AVAILABLE},
-         * {@link BasePreviewProgramColumns#AVAILABILITY_FREE_WITH_SUBSCRIPTION}, and
-         * {@link BasePreviewProgramColumns#AVAILABILITY_PAID_CONTENT}.
+         * {@link PreviewPrograms#AVAILABILITY_AVAILABLE},
+         * {@link PreviewPrograms#AVAILABILITY_FREE_WITH_SUBSCRIPTION}, and
+         * {@link PreviewPrograms#AVAILABILITY_PAID_CONTENT}.
          *
-         * @param availability The value of {@link BasePreviewProgramColumns#COLUMN_AVAILABILITY}
-         *                     for the program.
+         * @param availability The availability of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_AVAILABILITY
          */
-        public T setAvailability(@Availability String availability) {
+        public T setAvailability(@Availability int availability) {
             mAvailability = availability;
             return (T) this;
         }
@@ -821,9 +782,9 @@
         /**
          * Sets the starting price of this TV program.
          *
-         * @param price The value of {@link BasePreviewProgramColumns#COLUMN_STARTING_PRICE} for the
-         *              program.
+         * @param price The starting price of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_STARTING_PRICE
          */
         public T setStartingPrice(String price) {
             mStartingPrice = price;
@@ -833,9 +794,9 @@
         /**
          * Sets the offer price of this TV program.
          *
-         * @param price The value of {@link BasePreviewProgramColumns#COLUMN_OFFER_PRICE} for the
-         *              program.
+         * @param price The offer price of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_OFFER_PRICE
          */
         public T setOfferPrice(String price) {
             mOfferPrice = price;
@@ -847,9 +808,9 @@
          *
          * <p>The value should be in the form of either "yyyy-MM-dd" or "yyyy".
          *
-         * @param releaseDate The value of {@link BasePreviewProgramColumns#COLUMN_RELEASE_DATE} for
-         *                    the program.
+         * @param releaseDate The release date of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(String releaseDate) {
             mReleaseDate = releaseDate;
@@ -859,9 +820,9 @@
         /**
          * Sets the release date of this TV program.
          *
-         * @param releaseDate The value of {@link BasePreviewProgramColumns#COLUMN_RELEASE_DATE} for
-         *                    the program.
+         * @param releaseDate The release date of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(Date releaseDate) {
             mReleaseDate = sFormat.format(releaseDate);
@@ -871,9 +832,9 @@
         /**
          * Sets the count of the items included in this TV program.
          *
-         * @param itemCount value of {@link BasePreviewProgramColumns#COLUMN_ITEM_COUNT} for the
-         *                  program.
+         * @param itemCount The item count for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_ITEM_COUNT
          */
         public T setItemCount(int itemCount) {
             mItemCount = itemCount;
@@ -883,8 +844,9 @@
         /**
          * Sets whether this TV program is live or not.
          *
-         * @param live The value of {@link BasePreviewProgramColumns#COLUMN_LIVE} for the program.
+         * @param live Whether the program is live or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_LIVE
          */
         public T setLive(boolean live) {
             mLive = live ? IS_LIVE : 0;
@@ -895,19 +857,19 @@
          * Sets the type of interaction for this TV program.
          *
          * <p> The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_LISTENS},
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_FOLLOWERS},
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_FANS},
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_LIKES},
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_THUMBS},
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_VIEWS}, and
-         * {@link BasePreviewProgramColumns#INTERACTION_TYPE_VIEWERS}.
+         * {@link PreviewPrograms#INTERACTION_TYPE_LISTENS},
+         * {@link PreviewPrograms#INTERACTION_TYPE_FOLLOWERS},
+         * {@link PreviewPrograms#INTERACTION_TYPE_FANS},
+         * {@link PreviewPrograms#INTERACTION_TYPE_LIKES},
+         * {@link PreviewPrograms#INTERACTION_TYPE_THUMBS},
+         * {@link PreviewPrograms#INTERACTION_TYPE_VIEWS}, and
+         * {@link PreviewPrograms#INTERACTION_TYPE_VIEWERS}.
          *
-         * @param interactionType The value of {@link BasePreviewProgramColumns#COLUMN_AVAILABILITY}
-         *                        for the program.
+         * @param interactionType The interaction type of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
          */
-        public T setInteractionType(@InteractionType String interactionType) {
+        public T setInteractionType(@InteractionType int interactionType) {
             mInteractionType = interactionType;
             return (T) this;
         }
@@ -915,10 +877,9 @@
         /**
          * Sets the interaction count for this program.
          *
-         * @param interactionCount value of
-         *                         {@link BasePreviewProgramColumns#COLUMN_INTERACTION_COUNT} for
-         *                         the program.
+         * @param interactionCount The interaction count for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
          */
         public T setInteractionCount(long interactionCount) {
             mInteractionCount = interactionCount;
@@ -928,9 +889,9 @@
         /**
          * Sets the author or artist of this content.
          *
-         * @param author The value of {@link BasePreviewProgramColumns#COLUMN_AUTHOR} for the
-         *               program.
+         * @param author The author of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_AUTHOR
          */
         public T setAuthor(String author) {
             mAuthor = author;
@@ -938,51 +899,11 @@
         }
 
         /**
-         * The review rating score style used for {@link #setReviewRating}.
-         *
-         * <p> The value should match one of the followings:
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_STARS},
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_THUMBS_UP_DOWN}, and
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_PERCENTAGE}.
-         *
-         * @param reviewRatingStyle The value of
-         *                          {@link BasePreviewProgramColumns#COLUMN_REVIEW_RATING_STYLE} for
-         *                          the program.
-         * @return This Builder object to allow for chaining of calls to builder methods.
-         */
-        public T setReviewRatingStyle(@ReviewRatingStyle String reviewRatingStyle) {
-            mReviewRatingStyle = reviewRatingStyle;
-            return (T) this;
-        }
-
-        /**
-         * Sets the review rating score for this program.
-         *
-         * <p>The format of the value is dependent on
-         * {@link BasePreviewProgramColumns#COLUMN_REVIEW_RATING_STYLE}. If the style is
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_STARS}, the value should be a real
-         * number between 0.0 and 5.0. (e.g. "4.5") If the style is
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_THUMBS_UP_DOWN}, the value should be
-         * two integers, one for thumbs-up count and the other for thumbs-down count, with a comma
-         * between them. (e.g. "200,40") If the style is
-         * {@link BasePreviewProgramColumns#REVIEW_RATING_STYLE_PERCENTAGE}, the value shoule be a
-         * real number between 0 and 100. (e.g. "99.9")
-         *
-         * @param reviewRating The value of {@link BasePreviewProgramColumns#COLUMN_AVAILABILITY}
-         *                     for the program.
-         * @return This Builder object to allow for chaining of calls to builder methods.
-         */
-        public T setReviewRating(String reviewRating) {
-            mReviewRating = reviewRating;
-            return (T) this;
-        }
-
-        /**
          * Sets whether this TV program is browsable or not.
          *
-         * @param browsable The value of {@link BasePreviewProgramColumns#COLUMN_BROWSABLE} for the
-         *                  program.
+         * @param browsable Whether the program is browsable or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_BROWSABLE
          * @hide
          */
         @RestrictTo(LIBRARY_GROUP)
@@ -994,9 +915,9 @@
         /**
          * Sets the content ID for this program.
          *
-         * @param contentId The value of {@link BasePreviewProgramColumns#COLUMN_CONTENT_ID} for the
-         *                  program.
+         * @param contentId The content ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see PreviewPrograms#COLUMN_CONTENT_ID
          */
         public T setContentId(String contentId) {
             mContentId = contentId;
diff --git a/tv-provider/src/android/support/media/tv/BaseProgram.java b/tv-provider/src/android/support/media/tv/BaseProgram.java
index 40cca7a..21a8313 100644
--- a/tv-provider/src/android/support/media/tv/BaseProgram.java
+++ b/tv-provider/src/android/support/media/tv/BaseProgram.java
@@ -23,7 +23,9 @@
 import android.net.Uri;
 import android.os.Build;
 import android.support.annotation.RestrictTo;
-import android.support.media.tv.TvContractCompat.BaseProgramColumns;
+import android.support.media.tv.TvContractCompat.BaseTvColumns;
+import android.support.media.tv.TvContractCompat.ProgramColumns;
+import android.support.media.tv.TvContractCompat.ProgramColumns.ReviewRatingStyle;
 import android.support.media.tv.TvContractCompat.Programs;
 import android.support.media.tv.TvContractCompat.Programs.Genres.Genre;
 import android.text.TextUtils;
@@ -32,7 +34,8 @@
 import java.util.Objects;
 
 /**
- * Base class for derived classes that want to have fields defined in  {@link BaseProgramColumns}.
+ * Base class for derived classes that want to have common fields for programs defined in
+ * {@link TvContractCompat}.
  */
 public abstract class BaseProgram {
     /**
@@ -65,6 +68,8 @@
     private final Long mInternalProviderFlag2;
     private final Long mInternalProviderFlag3;
     private final Long mInternalProviderFlag4;
+    private final int mReviewRatingStyle;
+    private final String mReviewRating;
     private final String mSeasonTitle;
 
     /* package-private */
@@ -89,162 +94,195 @@
         mInternalProviderFlag2 = builder.mInternalProviderFlag2;
         mInternalProviderFlag3 = builder.mInternalProviderFlag3;
         mInternalProviderFlag4 = builder.mInternalProviderFlag4;
+        mReviewRatingStyle = builder.mReviewRatingStyle;
+        mReviewRating = builder.mReviewRating;
         mSeasonTitle = builder.mSeasonTitle;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#_ID} for the program.
+     * @return The ID for the program.
+     * @see Programs#_ID
      */
     public long getId() {
         return mId;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_TITLE} for the program.
+     * @return The title for the program.
+     * @see Programs#COLUMN_TITLE
      */
     public String getTitle() {
         return mTitle;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_EPISODE_TITLE} for the program.
+     * @return The episode title for the program.
+     * @see Programs#COLUMN_EPISODE_TITLE
      */
     public String getEpisodeTitle() {
         return mEpisodeTitle;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_SEASON_DISPLAY_NUMBER} for the program.
+     * @return The season display number for the program.
+     * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
      */
     public String getSeasonNumber() {
         return mSeasonNumber;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_EPISODE_DISPLAY_NUMBER} for the
-     * program.
+     * @return The episode display number for the program.
+     * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
      */
     public String getEpisodeNumber() {
         return mEpisodeNumber;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_SHORT_DESCRIPTION} for the program.
+     * @return The short description for the program.
+     * @see Programs#COLUMN_SHORT_DESCRIPTION
      */
     public String getDescription() {
         return mDescription;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_LONG_DESCRIPTION} for the program.
+     * @return The long description for the program.
+     * @see Programs#COLUMN_LONG_DESCRIPTION
      */
     public String getLongDescription() {
         return mLongDescription;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_VIDEO_WIDTH} for the program.
+     * @return The video width for the program.
+     * @see Programs#COLUMN_VIDEO_WIDTH
      */
     public int getVideoWidth() {
         return mVideoWidth;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_VIDEO_HEIGHT} for the program.
+     * @return The video height for the program.
+     * @see Programs#COLUMN_VIDEO_HEIGHT
      */
     public int getVideoHeight() {
         return mVideoHeight;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_CANONICAL_GENRE} for the program.
+     * @return The canonical genre for the program.
+     * @see Programs#COLUMN_CANONICAL_GENRE
      */
     public @Genre String[] getCanonicalGenres() {
         return mCanonicalGenres;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_CONTENT_RATING} for the program.
+     * @return The content rating for the program.
+     * @see Programs#COLUMN_CONTENT_RATING
      */
     public TvContentRating[] getContentRatings() {
         return mContentRatings;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_POSTER_ART_URI} for the program.
+     * @return The poster art URI for the program.
+     * @see Programs#COLUMN_POSTER_ART_URI
      */
     public Uri getPosterArtUri() {
         return mPosterArtUri;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_THUMBNAIL_URI} for the program.
+     * @return The thumbnail URI for the program.
+     * @see Programs#COLUMN_THUMBNAIL_URI
      */
     public Uri getThumbnailUri() {
         return mThumbnailUri;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_DATA} for the
-     * program.
+     * @return The internal provider data for the program.
+     * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
      */
     public byte[] getInternalProviderDataByteArray() {
         return mInternalProviderData;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_AUDIO_LANGUAGE} for the program.
+     * @return The audio languages for the program.
+     * @see Programs#COLUMN_AUDIO_LANGUAGE
      */
     public String[] getAudioLanguages() {
         return mAudioLanguages;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_SEARCHABLE} for the program.
+     * @return Whether the program is searchable or not.
+     * @see Programs#COLUMN_SEARCHABLE
      */
     public boolean isSearchable() {
         return mSearchable == IS_SEARCHABLE || mSearchable == INVALID_INT_VALUE;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG1} for the
-     * program.
+     * @return The first internal provider flag for the program.
+     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
      */
     public Long getInternalProviderFlag1() {
         return mInternalProviderFlag1;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG2} for the
-     * program.
+     * @return The second internal provider flag for the program.
+     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
      */
     public Long getInternalProviderFlag2() {
         return mInternalProviderFlag2;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG3} for the
-     * program.
+     * @return The third internal provider flag for the program.
+     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
      */
     public Long getInternalProviderFlag3() {
         return mInternalProviderFlag3;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG4} for the
-     * program.
+     * @return The forth internal provider flag for the program.
+     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
      */
     public Long getInternalProviderFlag4() {
         return mInternalProviderFlag4;
     }
 
     /**
-     * @return The value of {@link BaseProgramColumns#COLUMN_SEASON_TITLE} for the program.
+     * @return The season title for the program.
+     * @see Programs#COLUMN_SEASON_TITLE
      */
     public String getSeasonTitle() {
         return mSeasonTitle;
     }
 
+    /**
+     * @return The review rating style for the program.
+     * @see Programs#COLUMN_REVIEW_RATING_STYLE
+     */
+    public @ReviewRatingStyle int getReviewRatingStyle() {
+        return mReviewRatingStyle;
+    }
+
+    /**
+     * @return The review rating for the program.
+     * @see Programs#COLUMN_REVIEW_RATING
+     */
+    public String getReviewRating() {
+        return mReviewRating;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(
@@ -280,7 +318,10 @@
                         && Objects.equals(mInternalProviderFlag3, program.mInternalProviderFlag3)
                         && Objects.equals(mInternalProviderFlag4, program.mInternalProviderFlag4)))
                 && (Build.VERSION.SDK_INT < Build.VERSION_CODES.N
-                        || Objects.equals(mSeasonTitle, program.mSeasonTitle));
+                        || Objects.equals(mSeasonTitle, program.mSeasonTitle))
+                && (Build.VERSION.SDK_INT < Build.VERSION_CODES.O
+                        || (Objects.equals(mReviewRatingStyle, program.mReviewRatingStyle)
+                        && Objects.equals(mReviewRating, program.mReviewRating)));
     }
 
     @Override
@@ -302,26 +343,26 @@
     }
 
     /**
-     * @return The fields of the Program in the ContentValues format to be easily inserted into the
-     * TV Input Framework database.
+     * @return The fields of the BaseProgram in {@link ContentValues} format to be easily inserted
+     * into the TV Input Framework database.
      */
     public ContentValues toContentValues() {
         ContentValues values = new ContentValues();
         if (mId != INVALID_LONG_VALUE) {
-            values.put(BaseProgramColumns._ID, mId);
+            values.put(BaseTvColumns._ID, mId);
         }
         if (!TextUtils.isEmpty(mTitle)) {
-            values.put(BaseProgramColumns.COLUMN_TITLE, mTitle);
+            values.put(ProgramColumns.COLUMN_TITLE, mTitle);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_TITLE);
+            values.putNull(ProgramColumns.COLUMN_TITLE);
         }
         if (!TextUtils.isEmpty(mEpisodeTitle)) {
-            values.put(BaseProgramColumns.COLUMN_EPISODE_TITLE, mEpisodeTitle);
+            values.put(ProgramColumns.COLUMN_EPISODE_TITLE, mEpisodeTitle);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_EPISODE_TITLE);
+            values.putNull(ProgramColumns.COLUMN_EPISODE_TITLE);
         }
         if (!TextUtils.isEmpty(mSeasonNumber) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            values.put(BaseProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER, mSeasonNumber);
+            values.put(ProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER, mSeasonNumber);
         } else if (!TextUtils.isEmpty(mSeasonNumber)
                 && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             values.put(Programs.COLUMN_SEASON_NUMBER,
@@ -330,7 +371,7 @@
             values.putNull(TvContractCompat.Programs.COLUMN_SEASON_NUMBER);
         }
         if (!TextUtils.isEmpty(mEpisodeNumber) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            values.put(BaseProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER, mEpisodeNumber);
+            values.put(ProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER, mEpisodeNumber);
         } else if (!TextUtils.isEmpty(mEpisodeNumber)
                 && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             values.put(Programs.COLUMN_EPISODE_NUMBER,
@@ -339,83 +380,92 @@
             values.putNull(Programs.COLUMN_EPISODE_NUMBER);
         }
         if (!TextUtils.isEmpty(mDescription)) {
-            values.put(BaseProgramColumns.COLUMN_SHORT_DESCRIPTION, mDescription);
+            values.put(ProgramColumns.COLUMN_SHORT_DESCRIPTION, mDescription);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_SHORT_DESCRIPTION);
+            values.putNull(ProgramColumns.COLUMN_SHORT_DESCRIPTION);
         }
         if (!TextUtils.isEmpty(mLongDescription)) {
-            values.put(BaseProgramColumns.COLUMN_LONG_DESCRIPTION, mLongDescription);
+            values.put(ProgramColumns.COLUMN_LONG_DESCRIPTION, mLongDescription);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_LONG_DESCRIPTION);
+            values.putNull(ProgramColumns.COLUMN_LONG_DESCRIPTION);
         }
         if (mPosterArtUri != null) {
-            values.put(BaseProgramColumns.COLUMN_POSTER_ART_URI, mPosterArtUri.toString());
+            values.put(ProgramColumns.COLUMN_POSTER_ART_URI, mPosterArtUri.toString());
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_POSTER_ART_URI);
+            values.putNull(ProgramColumns.COLUMN_POSTER_ART_URI);
         }
         if (mThumbnailUri != null) {
-            values.put(BaseProgramColumns.COLUMN_THUMBNAIL_URI, mThumbnailUri.toString());
+            values.put(ProgramColumns.COLUMN_THUMBNAIL_URI, mThumbnailUri.toString());
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_THUMBNAIL_URI);
+            values.putNull(ProgramColumns.COLUMN_THUMBNAIL_URI);
         }
         if (mAudioLanguages != null && mAudioLanguages.length > 0) {
-            values.put(BaseProgramColumns.COLUMN_AUDIO_LANGUAGE,
+            values.put(ProgramColumns.COLUMN_AUDIO_LANGUAGE,
                     TvContractUtils.audioLanguagesToString(mAudioLanguages));
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_AUDIO_LANGUAGE);
+            values.putNull(ProgramColumns.COLUMN_AUDIO_LANGUAGE);
         }
         if (mCanonicalGenres != null && mCanonicalGenres.length > 0) {
-            values.put(BaseProgramColumns.COLUMN_CANONICAL_GENRE,
+            values.put(ProgramColumns.COLUMN_CANONICAL_GENRE,
                     Programs.Genres.encode(mCanonicalGenres));
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_CANONICAL_GENRE);
+            values.putNull(ProgramColumns.COLUMN_CANONICAL_GENRE);
         }
         if (mContentRatings != null && mContentRatings.length > 0) {
-            values.put(BaseProgramColumns.COLUMN_CONTENT_RATING,
+            values.put(ProgramColumns.COLUMN_CONTENT_RATING,
                     TvContractUtils.contentRatingsToString(mContentRatings));
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_CONTENT_RATING);
+            values.putNull(ProgramColumns.COLUMN_CONTENT_RATING);
         }
         if (mVideoWidth != INVALID_INT_VALUE) {
-            values.put(BaseProgramColumns.COLUMN_VIDEO_WIDTH, mVideoWidth);
+            values.put(ProgramColumns.COLUMN_VIDEO_WIDTH, mVideoWidth);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_VIDEO_WIDTH);
+            values.putNull(ProgramColumns.COLUMN_VIDEO_WIDTH);
         }
         if (mVideoHeight != INVALID_INT_VALUE) {
-            values.put(BaseProgramColumns.COLUMN_VIDEO_HEIGHT, mVideoHeight);
+            values.put(ProgramColumns.COLUMN_VIDEO_HEIGHT, mVideoHeight);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_VIDEO_HEIGHT);
+            values.putNull(ProgramColumns.COLUMN_VIDEO_HEIGHT);
         }
         if (mInternalProviderData != null && mInternalProviderData.length > 0) {
-            values.put(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA,
+            values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA,
                     mInternalProviderData);
         } else {
-            values.putNull(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA);
+            values.putNull(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA);
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             if (mSearchable != INVALID_INT_VALUE) {
-                values.put(BaseProgramColumns.COLUMN_SEARCHABLE, mSearchable);
+                values.put(ProgramColumns.COLUMN_SEARCHABLE, mSearchable);
             }
             if (mInternalProviderFlag1 != null) {
-                values.put(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1,
+                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1,
                         mInternalProviderFlag1);
             }
             if (mInternalProviderFlag2 != null) {
-                values.put(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2,
+                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2,
                         mInternalProviderFlag2);
             }
             if (mInternalProviderFlag3 != null) {
-                values.put(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3,
+                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3,
                         mInternalProviderFlag3);
             }
             if (mInternalProviderFlag4 != null) {
-                values.put(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4,
+                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4,
                         mInternalProviderFlag4);
             }
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             if (!TextUtils.isEmpty(mSeasonTitle)) {
-                values.put(BaseProgramColumns.COLUMN_SEASON_TITLE, mSeasonTitle);
+                values.put(ProgramColumns.COLUMN_SEASON_TITLE, mSeasonTitle);
+            }
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            if (mReviewRatingStyle != INVALID_INT_VALUE) {
+                values.put(ProgramColumns.COLUMN_REVIEW_RATING_STYLE,
+                        mReviewRatingStyle);
+            }
+            if (!TextUtils.isEmpty(mReviewRating)) {
+                values.put(ProgramColumns.COLUMN_REVIEW_RATING, mReviewRating);
             }
         }
         return values;
@@ -430,20 +480,20 @@
     static void setFieldsFromCursor(Cursor cursor, Builder builder) {
         // TODO: Add additional API which does not use costly getColumnIndex().
         int index;
-        if ((index = cursor.getColumnIndex(BaseProgramColumns._ID)) >= 0 && !cursor.isNull(index)) {
+        if ((index = cursor.getColumnIndex(BaseTvColumns._ID)) >= 0 && !cursor.isNull(index)) {
             builder.setId(cursor.getLong(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_TITLE)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_TITLE)) >= 0
                 && !cursor.isNull(index)) {
             builder.setTitle(cursor.getString(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_EPISODE_TITLE)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_EPISODE_TITLE)) >= 0
                 && !cursor.isNull(index)) {
             builder.setEpisodeTitle(cursor.getString(index));
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setSeasonNumber(cursor.getString(index), INVALID_INT_VALUE);
             }
@@ -455,7 +505,7 @@
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setEpisodeNumber(cursor.getString(index), INVALID_INT_VALUE);
             }
@@ -465,116 +515,134 @@
                 builder.setEpisodeNumber(cursor.getInt(index));
             }
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_SHORT_DESCRIPTION)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_SHORT_DESCRIPTION)) >= 0
                 && !cursor.isNull(index)) {
             builder.setDescription(cursor.getString(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_LONG_DESCRIPTION)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_LONG_DESCRIPTION)) >= 0
                 && !cursor.isNull(index)) {
             builder.setLongDescription(cursor.getString(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_POSTER_ART_URI)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_POSTER_ART_URI)) >= 0
                 && !cursor.isNull(index)) {
             builder.setPosterArtUri(Uri.parse(cursor.getString(index)));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_THUMBNAIL_URI)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_THUMBNAIL_URI)) >= 0
                 && !cursor.isNull(index)) {
             builder.setThumbnailUri(Uri.parse(cursor.getString(index)));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_AUDIO_LANGUAGE)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_AUDIO_LANGUAGE)) >= 0
                 && !cursor.isNull(index)) {
             builder.setAudioLanguages(
                     TvContractUtils.stringToAudioLanguages(cursor.getString(index)));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_CANONICAL_GENRE)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_CANONICAL_GENRE)) >= 0
                 && !cursor.isNull(index)) {
             builder.setCanonicalGenres(Programs.Genres.decode(
                     cursor.getString(index)));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_CONTENT_RATING)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_CONTENT_RATING)) >= 0
                 && !cursor.isNull(index)) {
             builder.setContentRatings(
                     TvContractUtils.stringToContentRatings(cursor.getString(index)));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_VIDEO_WIDTH)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_VIDEO_WIDTH)) >= 0
                 && !cursor.isNull(index)) {
             builder.setVideoWidth((int) cursor.getLong(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_VIDEO_HEIGHT)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_VIDEO_HEIGHT)) >= 0
                 && !cursor.isNull(index)) {
             builder.setVideoHeight((int) cursor.getLong(index));
         }
-        if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA)) >= 0
+        if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA)) >= 0
                 && !cursor.isNull(index)) {
             builder.setInternalProviderData(cursor.getBlob(index));
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_SEARCHABLE)) >= 0
+            if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_SEARCHABLE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setSearchable(cursor.getInt(index) == IS_SEARCHABLE);
             }
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderFlag1(cursor.getLong(index));
             }
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderFlag2(cursor.getLong(index));
             }
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderFlag3(cursor.getLong(index));
             }
             if ((index =
-                    cursor.getColumnIndex(BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4)) >= 0
+                    cursor.getColumnIndex(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderFlag4(cursor.getLong(index));
             }
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            if ((index = cursor.getColumnIndex(BaseProgramColumns.COLUMN_SEASON_TITLE)) >= 0
+            if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_SEASON_TITLE)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setSeasonTitle(cursor.getString(index));
             }
         }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            if ((index = cursor.getColumnIndex(
+                    ProgramColumns.COLUMN_REVIEW_RATING_STYLE)) >= 0
+                    && !cursor.isNull(index)) {
+                builder.setReviewRatingStyle(cursor.getInt(index));
+            }
+            if ((index = cursor.getColumnIndex(ProgramColumns.COLUMN_REVIEW_RATING)) >= 0
+                    && !cursor.isNull(index)) {
+                builder.setReviewRating(cursor.getString(index));
+            }
+        }
     }
 
     private static String[] getProjection() {
         String[] baseColumns = new String[] {
-                BaseProgramColumns._ID,
-                BaseProgramColumns.COLUMN_TITLE,
-                BaseProgramColumns.COLUMN_EPISODE_TITLE,
+                BaseTvColumns._ID,
+                ProgramColumns.COLUMN_TITLE,
+                ProgramColumns.COLUMN_EPISODE_TITLE,
                 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
-                        ? BaseProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER
+                        ? ProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER
                         : Programs.COLUMN_SEASON_NUMBER,
                 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
-                        ? BaseProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER
+                        ? ProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER
                         : Programs.COLUMN_EPISODE_NUMBER,
-                BaseProgramColumns.COLUMN_SHORT_DESCRIPTION,
-                BaseProgramColumns.COLUMN_LONG_DESCRIPTION,
-                BaseProgramColumns.COLUMN_POSTER_ART_URI,
-                BaseProgramColumns.COLUMN_THUMBNAIL_URI,
-                BaseProgramColumns.COLUMN_AUDIO_LANGUAGE,
-                BaseProgramColumns.COLUMN_CANONICAL_GENRE,
-                BaseProgramColumns.COLUMN_CONTENT_RATING,
-                BaseProgramColumns.COLUMN_VIDEO_WIDTH,
-                BaseProgramColumns.COLUMN_VIDEO_HEIGHT,
-                BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA
+                ProgramColumns.COLUMN_SHORT_DESCRIPTION,
+                ProgramColumns.COLUMN_LONG_DESCRIPTION,
+                ProgramColumns.COLUMN_POSTER_ART_URI,
+                ProgramColumns.COLUMN_THUMBNAIL_URI,
+                ProgramColumns.COLUMN_AUDIO_LANGUAGE,
+                ProgramColumns.COLUMN_CANONICAL_GENRE,
+                ProgramColumns.COLUMN_CONTENT_RATING,
+                ProgramColumns.COLUMN_VIDEO_WIDTH,
+                ProgramColumns.COLUMN_VIDEO_HEIGHT,
+                ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA
         };
         String[] marshmallowColumns = new String[] {
-                BaseProgramColumns.COLUMN_SEARCHABLE,
-                BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1,
-                BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2,
-                BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3,
-                BaseProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4,
+                ProgramColumns.COLUMN_SEARCHABLE,
+                ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1,
+                ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2,
+                ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3,
+                ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4,
         };
         String[] nougatColumns = new String[] {
-                BaseProgramColumns.COLUMN_SEASON_TITLE,
+                ProgramColumns.COLUMN_SEASON_TITLE,
         };
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+        String[] oatmealColumns = new String[] {
+                ProgramColumns.COLUMN_REVIEW_RATING,
+                ProgramColumns.COLUMN_REVIEW_RATING_STYLE,
+        };
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            return CollectionUtils.concatAll(baseColumns, marshmallowColumns, nougatColumns,
+                    oatmealColumns);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return CollectionUtils.concatAll(baseColumns, marshmallowColumns, nougatColumns);
         } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             return CollectionUtils.concatAll(baseColumns, marshmallowColumns);
@@ -609,6 +677,8 @@
         private Long mInternalProviderFlag2;
         private Long mInternalProviderFlag3;
         private Long mInternalProviderFlag4;
+        private int mReviewRatingStyle = INVALID_INT_VALUE;
+        private String mReviewRating;
         private String mSeasonTitle;
 
         /**
@@ -642,14 +712,17 @@
             mInternalProviderFlag2 = other.mInternalProviderFlag2;
             mInternalProviderFlag3 = other.mInternalProviderFlag3;
             mInternalProviderFlag4 = other.mInternalProviderFlag4;
+            mReviewRatingStyle = other.mReviewRatingStyle;
+            mReviewRating = other.mReviewRating;
             mSeasonTitle = other.mSeasonTitle;
         }
 
         /**
          * Sets a unique id for this program.
          *
-         * @param programId The value of {@link BaseProgramColumns#_ID} for the program.
+         * @param programId The ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see BaseTvColumns#_ID
          */
         public T setId(long programId) {
             mId = programId;
@@ -659,8 +732,9 @@
         /**
          * Sets the title of this program. For a series, this is the series title.
          *
-         * @param title The value of {@link BaseProgramColumns#COLUMN_TITLE} for the program.
+         * @param title The title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_TITLE
          */
         public T setTitle(String title) {
             mTitle = title;
@@ -670,9 +744,9 @@
         /**
          * Sets the title of this particular episode for a series.
          *
-         * @param episodeTitle The value of {@link BaseProgramColumns#COLUMN_EPISODE_TITLE} for the
-         *                     program.
+         * @param episodeTitle The episode title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_EPISODE_TITLE
          */
         public T setEpisodeTitle(String episodeTitle) {
             mEpisodeTitle = episodeTitle;
@@ -682,9 +756,9 @@
         /**
          * Sets the season number for this episode for a series.
          *
-         * @param seasonNumber The value of
-         * {@link BaseProgramColumns#COLUMN_SEASON_DISPLAY_NUMBER} for the program.
+         * @param seasonNumber The season display number for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
          */
         public T setSeasonNumber(int seasonNumber) {
             mSeasonNumber = String.valueOf(seasonNumber);
@@ -694,11 +768,12 @@
         /**
          * Sets the season number for this episode for a series.
          *
-         * @param seasonNumber The value of {@link BaseProgramColumns#COLUMN_SEASON_DISPLAY_NUMBER}
-         *                     for the program.
+         * @param seasonNumber The season display number for the program.
          * @param numericalSeasonNumber An integer value for {@link Programs#COLUMN_SEASON_NUMBER}
          *                              which will be used for API Level 23 and below.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
+         * @see Programs#COLUMN_SEASON_NUMBER
          */
         public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -712,9 +787,9 @@
         /**
          * Sets the episode number in a season for this episode for a series.
          *
-         * @param episodeNumber The value of
-         * {@link BaseProgramColumns#COLUMN_EPISODE_DISPLAY_NUMBER} for the program.
+         * @param episodeNumber The value of episode display number for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
          */
         public T setEpisodeNumber(int episodeNumber) {
             mEpisodeNumber = String.valueOf(episodeNumber);
@@ -724,12 +799,12 @@
         /**
          * Sets the episode number in a season for this episode for a series.
          *
-         * @param episodeNumber The value of
-         *                      {@link BaseProgramColumns#COLUMN_EPISODE_DISPLAY_NUMBER} for the
-         *                      program.
+         * @param episodeNumber The value of episode display number for the program.
          * @param numericalEpisodeNumber An integer value for {@link Programs#COLUMN_EPISODE_NUMBER}
          *                               which will be used for API Level 23 and below.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
+         * @see Programs#COLUMN_EPISODE_NUMBER
          */
         public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -744,9 +819,9 @@
          * Sets a brief description of the program. For a series, this would be a brief description
          * of the episode.
          *
-         * @param description The value of {@link BaseProgramColumns#COLUMN_SHORT_DESCRIPTION} for
-         *                    the program.
+         * @param description The short description for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_SHORT_DESCRIPTION
          */
         public T setDescription(String description) {
             mDescription = description;
@@ -756,9 +831,9 @@
         /**
          * Sets a longer description of a program if one exists.
          *
-         * @param longDescription The value of {@link BaseProgramColumns#COLUMN_LONG_DESCRIPTION}
-         *                        for the program.
+         * @param longDescription The long description for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_LONG_DESCRIPTION
          */
         public T setLongDescription(String longDescription) {
             mLongDescription = longDescription;
@@ -768,8 +843,9 @@
         /**
          * Sets the video width of the program.
          *
-         * @param width The value of {@link BaseProgramColumns#COLUMN_VIDEO_WIDTH} for the program.
+         * @param width The video width for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_VIDEO_WIDTH
          */
         public T setVideoWidth(int width) {
             mVideoWidth = width;
@@ -779,9 +855,9 @@
         /**
          * Sets the video height of the program.
          *
-         * @param height The value of {@link BaseProgramColumns#COLUMN_VIDEO_HEIGHT} for the
-         *               program.
+         * @param height The video height for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_VIDEO_HEIGHT
          */
         public T setVideoHeight(int height) {
             mVideoHeight = height;
@@ -794,7 +870,7 @@
          * @param contentRatings An array of {@link TvContentRating} that apply to this program
          *                       which will be flattened to a String to store in a database.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see BaseProgramColumns#COLUMN_CONTENT_RATING
+         * @see Programs#COLUMN_CONTENT_RATING
          */
         public T setContentRatings(TvContentRating[] contentRatings) {
             mContentRatings = contentRatings;
@@ -804,9 +880,9 @@
         /**
          * Sets the large poster art of the program.
          *
-         * @param posterArtUri The value of {@link BaseProgramColumns#COLUMN_POSTER_ART_URI} for the
-         *                     program.
+         * @param posterArtUri The poster art URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_POSTER_ART_URI
          */
         public T setPosterArtUri(Uri posterArtUri) {
             mPosterArtUri = posterArtUri;
@@ -816,9 +892,9 @@
         /**
          * Sets a small thumbnail of the program.
          *
-         * @param thumbnailUri The value of {@link BaseProgramColumns#COLUMN_THUMBNAIL_URI} for the
-         *                     program.
+         * @param thumbnailUri The thumbnail URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_THUMBNAIL_URI
          */
         public T setThumbnailUri(Uri thumbnailUri) {
             mThumbnailUri = thumbnailUri;
@@ -831,7 +907,7 @@
          * @param genres An array of {@link Programs.Genres} that apply to the program which will be
          *               flattened to a String to store in a database.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see BaseProgramColumns#COLUMN_CANONICAL_GENRE
+         * @see Programs#COLUMN_CANONICAL_GENRE
          */
         public T setCanonicalGenres(@Genre String[] genres) {
             mCanonicalGenres = genres;
@@ -841,9 +917,9 @@
         /**
          * Sets the internal provider data for the program as raw bytes.
          *
-         * @param data The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_DATA} for the
-         *             program.
+         * @param data The internal provider data for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
          */
         public T setInternalProviderData(byte[] data) {
             mInternalProviderData = data;
@@ -865,9 +941,9 @@
         /**
          * Sets whether this channel can be searched for in other applications.
          *
-         * @param searchable The value of {@link BaseProgramColumns#COLUMN_SEARCHABLE} for the
-         *                   program.
+         * @param searchable Whether the program is searchable or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_SEARCHABLE
          */
         public T setSearchable(boolean searchable) {
             mSearchable = searchable ? IS_SEARCHABLE : 0;
@@ -877,9 +953,9 @@
         /**
          * Sets the internal provider flag1 for the program.
          *
-         * @param flag The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG1} for
-         *             the program.
+         * @param flag The first internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
          */
         public T setInternalProviderFlag1(long flag) {
             mInternalProviderFlag1 = flag;
@@ -889,9 +965,9 @@
         /**
          * Sets the internal provider flag2 for the program.
          *
-         * @param flag The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG2} for
-         *             the program.
+         * @param flag The second internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
          */
         public T setInternalProviderFlag2(long flag) {
             mInternalProviderFlag2 = flag;
@@ -901,9 +977,9 @@
         /**
          * Sets the internal provider flag3 for the program.
          *
-         * @param flag The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG3} for
-         *             the program.
+         * @param flag The third internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
          */
         public T setInternalProviderFlag3(long flag) {
             mInternalProviderFlag3 = flag;
@@ -913,9 +989,9 @@
         /**
          * Sets the internal provider flag4 for the program.
          *
-         * @param flag The value of {@link BaseProgramColumns#COLUMN_INTERNAL_PROVIDER_FLAG4} for
-         *             the program.
+         * @param flag The forth internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
          */
         public T setInternalProviderFlag4(long flag) {
             mInternalProviderFlag4 = flag;
@@ -923,11 +999,51 @@
         }
 
         /**
+         * Sets the review rating score style used for {@link #setReviewRating}.
+         *
+         * @param reviewRatingStyle The reviewing rating style for the program.
+         * @return This Builder object to allow for chaining of calls to builder methods.
+         *
+         * @see Programs#COLUMN_REVIEW_RATING_STYLE
+         * @see Programs#REVIEW_RATING_STYLE_STARS
+         * @see Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
+         * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
+         */
+        public T setReviewRatingStyle(@ReviewRatingStyle int reviewRatingStyle) {
+            mReviewRatingStyle = reviewRatingStyle;
+            return (T) this;
+        }
+
+        /**
+         * Sets the review rating score for this program.
+         *
+         * <p>The format of the value is dependent on the review rating style. If the style is
+         * based on "stars", the value should be a real number between 0.0 and 5.0. (e.g. "4.5")
+         * If the style is based on "thumbs up/down", the value should be two integers, one for
+         * thumbs-up count and the other for thumbs-down count, with a comma between them.
+         * (e.g. "200,40") If the style is base on "percentage", the value should be a
+         * real number between 0 and 100. (e.g. "99.9")
+         *
+         * @param reviewRating The value of the review rating for the program.
+         * @return This Builder object to allow for chaining of calls to builder methods.
+         *
+         * @see Programs#COLUMN_REVIEW_RATING
+         * @see Programs#COLUMN_REVIEW_RATING_STYLE
+         * @see Programs#REVIEW_RATING_STYLE_STARS
+         * @see Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
+         * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
+         */
+        public T setReviewRating(String reviewRating) {
+            mReviewRating = reviewRating;
+            return (T) this;
+        }
+
+        /**
          * Sets a custom name for the season, if applicable.
          *
-         * @param seasonTitle The value of {@link BaseProgramColumns#COLUMN_SEASON_TITLE} for the
-         *                    program.
+         * @param seasonTitle The season title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
+         * @see Programs#COLUMN_SEASON_TITLE
          */
         public T setSeasonTitle(String seasonTitle) {
             mSeasonTitle = seasonTitle;
diff --git a/tv-provider/src/android/support/media/tv/Channel.java b/tv-provider/src/android/support/media/tv/Channel.java
index 7290f61..2c12901 100644
--- a/tv-provider/src/android/support/media/tv/Channel.java
+++ b/tv-provider/src/android/support/media/tv/Channel.java
@@ -103,6 +103,7 @@
     private final Long mInternalProviderFlag2;
     private final Long mInternalProviderFlag3;
     private final Long mInternalProviderFlag4;
+    private final String mInternalProviderId;
     private final int mTransient;
     private final int mBrowsable;
     private final int mSystemApproved;
@@ -133,6 +134,7 @@
         mInternalProviderFlag2 = builder.mInternalProviderFlag2;
         mInternalProviderFlag3 = builder.mInternalProviderFlag3;
         mInternalProviderFlag4 = builder.mInternalProviderFlag4;
+        mInternalProviderId = builder.mInternalProviderId;
         mTransient = builder.mTransient;
         mBrowsable = builder.mBrowsable;
         mSystemApproved = builder.mSystemApproved;
@@ -318,6 +320,13 @@
     }
 
     /**
+     * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_ID} for the channel.
+     */
+    public String getInternalProviderId() {
+        return mInternalProviderId;
+    }
+
+    /**
      * @return The value of {@link Channels#COLUMN_TRANSIENT} for the channel.
      */
     public boolean isTransient() {
@@ -467,6 +476,7 @@
             }
         }
         if (BuildCompat.isAtLeastO()) {
+            values.put(Channels.COLUMN_INTERNAL_PROVIDER_ID, mInternalProviderId);
             values.put(Channels.COLUMN_TRANSIENT, mTransient);
         }
 
@@ -595,6 +605,10 @@
             }
         }
         if (BuildCompat.isAtLeastO()) {
+            if ((index = cursor.getColumnIndex(Channels.COLUMN_INTERNAL_PROVIDER_ID)) >= 0
+                    && !cursor.isNull(index)) {
+                builder.setInternalProviderId(cursor.getString(index));
+            }
             if ((index = cursor.getColumnIndex(Channels.COLUMN_TRANSIENT)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setTransient(cursor.getInt(index) == IS_TRANSIENT);
@@ -639,6 +653,7 @@
                 Channels.COLUMN_INTERNAL_PROVIDER_FLAG4,
         };
         String[] oReleaseColumns = new String[] {
+                Channels.COLUMN_INTERNAL_PROVIDER_ID,
                 Channels.COLUMN_TRANSIENT,
                 Channels.COLUMN_SYSTEM_APPROVED,
         };
@@ -679,6 +694,7 @@
         private Long mInternalProviderFlag2;
         private Long mInternalProviderFlag3;
         private Long mInternalProviderFlag4;
+        private String mInternalProviderId;
         private int mTransient;
         private int mBrowsable;
         private int mSystemApproved;
@@ -712,6 +728,7 @@
             mInternalProviderFlag2 = other.mInternalProviderFlag2;
             mInternalProviderFlag3 = other.mInternalProviderFlag3;
             mInternalProviderFlag4 = other.mInternalProviderFlag4;
+            mInternalProviderId = other.mInternalProviderId;
             mTransient = other.mTransient;
             mBrowsable = other.mBrowsable;
             mSystemApproved = other.mSystemApproved;
@@ -1018,6 +1035,18 @@
         }
 
         /**
+         * Sets the internal provider ID for the channel.
+         *
+         * @param internalProviderId The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_ID}
+         *                           for the program.
+         * @return This Builder object to allow for chaining of calls to builder methods.
+         */
+        public Builder setInternalProviderId(String internalProviderId) {
+            mInternalProviderId = internalProviderId;
+            return this;
+        }
+
+        /**
          * Sets whether this channel is transient or not.
          *
          * @param value The value of {@link Channels#COLUMN_TRANSIENT} for the channel.
diff --git a/tv-provider/src/android/support/media/tv/TvContractCompat.java b/tv-provider/src/android/support/media/tv/TvContractCompat.java
index b3daa49..43c1d25 100644
--- a/tv-provider/src/android/support/media/tv/TvContractCompat.java
+++ b/tv-provider/src/android/support/media/tv/TvContractCompat.java
@@ -18,20 +18,24 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import android.app.Activity;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentUris;
+import android.content.Context;
 import android.content.Intent;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.BaseColumns;
+import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.StringDef;
 import android.support.media.tv.TvContractCompat.Programs.Genres;
+import android.support.v4.os.BuildCompat;
 import android.text.TextUtils;
 
 import java.lang.annotation.Retention;
@@ -79,8 +83,9 @@
     private static final String PATH_PASSTHROUGH = "passthrough";
 
     /**
-     * Activity Action: sent by an application telling the system to set the given channel as
-     * browsable. This is only relevant to channels with {@link Channels#TYPE_PREVIEW} type.
+     * Broadcast Action: sent when an application requests the system to make the given channel
+     * browsable.  The operation is performed in the background without user interaction. This
+     * is only relevant to channels with {@link Channels#TYPE_PREVIEW} type.
      *
      * <p>The intent must contain the following bundle parameters:
      * <ul>
@@ -88,9 +93,26 @@
      *     integer.</li>
      *     <li>{@link #EXTRA_PACKAGE_NAME}: the package name of the requesting application.</li>
      * </ul>
+     * @hide
      */
-    public static final String ACTION_MAKE_CHANNEL_BROWSABLE =
-            "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
+    @RestrictTo(LIBRARY_GROUP)
+    public static final String ACTION_CHANNEL_BROWSABLE_REQUESTED =
+            "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
+
+    /**
+     * Activity Action: sent by an application telling the system to make the given channel
+     * browsable with user interaction. The system may show UI to ask user to approve the channel.
+     * This is only relevant to channels with {@link Channels#TYPE_PREVIEW} type. Use
+     * {@link Activity#startActivityForResult} to get the result of the request.
+     *
+     * <p>The intent must contain the following bundle parameters:
+     * <ul>
+     *     <li>{@link #EXTRA_CHANNEL_ID}: ID for the {@link Channels#TYPE_PREVIEW} channel as a long
+     *     integer.</li>
+     * </ul>
+     */
+    public static final String ACTION_REQUEST_CHANNEL_BROWSABLE =
+            "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
 
     /**
      * Broadcast Action: sent by the system to tell the target TV input that one of its preview
@@ -133,10 +155,33 @@
     public static final String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT =
             "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
 
-    /** The key for a bundle parameter containing a channel ID as a long integer */
+    /**
+     * Broadcast Action: sent to the target TV input after it is first installed to notify the input
+     * to initialize its channels and programs to the system content provider.
+     *
+     * <p>Note that this intent is sent only on devices with
+     * {@link android.content.pm.PackageManager#FEATURE_LEANBACK} enabled. Besides that, in order
+     * to receive this intent, the target TV input must:
+     * <ul>
+     *     <li>Declare a broadcast receiver for this intent in its
+     *         <code>AndroidManifest.xml</code>.</li>
+     *     <li>Declare appropriate permissions to write channel and program data in its
+     *         <code>AndroidManifest.xml</code>.</li>
+     * </ul>
+     */
+    public static final String ACTION_INITIALIZE_PROGRAMS =
+            "android.media.tv.action.INITIALIZE_PROGRAMS";
+
+    /**
+     * The key for a bundle parameter containing a channel ID as a long integer
+     */
     public static final String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
 
-    /** The key for a bundle parameter containing a package name as a string. */
+    /**
+     * The key for a bundle parameter containing a package name as a string.
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
     public static final String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
 
     /** The key for a bundle parameter containing a program ID as a long integer. */
@@ -509,6 +554,24 @@
         }
     }
 
+    /**
+     * Requests to make a channel browsable.
+     *
+     * <p>Once called, the system will review the request and make the channel browsable based on
+     * its policy. The first request from a package is guaranteed to be approved. This is only
+     * relevant to channels with {@link Channels#TYPE_PREVIEW} type.
+     *
+     * <p>No-op on devices prior to {@link android.os.Build.VERSION_CODES#O}.
+     *
+     * @param context The context for accessing content provider.
+     * @param channelId The channel ID to be browsable.
+     * @see Channels#COLUMN_BROWSABLE
+     */
+    public static void requestChannelBrowsable(Context context, long channelId) {
+        if (BuildCompat.isAtLeastO()) {
+            TvContract.requestChannelBrowsable(context, channelId);
+        }
+    }
 
     private TvContractCompat() {}
 
@@ -529,9 +592,42 @@
     }
 
     /**
-     * Common base for the tables of TV programs.
+     * Common columns for the tables of TV programs.
+     * @hide
      */
-    public interface BaseProgramColumns extends BaseTvColumns {
+    @RestrictTo(LIBRARY_GROUP)
+    interface ProgramColumns {
+        /** @hide */
+        @IntDef({
+                REVIEW_RATING_STYLE_STARS,
+                REVIEW_RATING_STYLE_THUMBS_UP_DOWN,
+                REVIEW_RATING_STYLE_PERCENTAGE,
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(LIBRARY_GROUP)
+        @interface ReviewRatingStyle {}
+
+        /**
+         * The review rating style for five star rating.
+         *
+         * @see #COLUMN_REVIEW_RATING_STYLE
+         */
+        int REVIEW_RATING_STYLE_STARS = 0;
+
+        /**
+         * The review rating style for thumbs-up and thumbs-down rating.
+         *
+         * @see #COLUMN_REVIEW_RATING_STYLE
+         */
+        int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1;
+
+        /**
+         * The review rating style for 0 to 100 point system.
+         *
+         * @see #COLUMN_REVIEW_RATING_STYLE
+         */
+        int REVIEW_RATING_STYLE_PERCENTAGE = 2;
+
         /**
          * The title of this TV program.
          *
@@ -794,15 +890,44 @@
          * <p>Type: INTEGER
          */
         String COLUMN_VERSION_NUMBER = "version_number";
+
+        /**
+         * The review rating score style used for {@link #COLUMN_REVIEW_RATING}.
+         *
+         * <p> The value should match one of the followings: {@link #REVIEW_RATING_STYLE_STARS},
+         * {@link #REVIEW_RATING_STYLE_THUMBS_UP_DOWN}, and {@link #REVIEW_RATING_STYLE_PERCENTAGE}.
+         *
+         * <p>Type: INTEGER
+         * @see #COLUMN_REVIEW_RATING
+         */
+        String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+
+        /**
+         * The review rating score for this program.
+         *
+         * <p>The format of the value is dependent on {@link #COLUMN_REVIEW_RATING_STYLE}. If the
+         * style is {@link #REVIEW_RATING_STYLE_STARS}, the value should be a real number between
+         * 0.0 and 5.0. (e.g. "4.5") If the style is {@link #REVIEW_RATING_STYLE_THUMBS_UP_DOWN},
+         * the value should be two integers, one for thumbs-up count and the other for thumbs-down
+         * count, with a comma between them. (e.g. "200,40") If the style is
+         * {@link #REVIEW_RATING_STYLE_PERCENTAGE}, the value shoule be a real number between 0 and
+         * 100. (e.g. "99.9")
+         *
+         * <p>Type: TEXT
+         * @see #COLUMN_REVIEW_RATING_STYLE
+         */
+        String COLUMN_REVIEW_RATING = "review_rating";
     }
 
     /**
-     * Common base for the tables of preview programs.
+     * Common columns for the tables of preview programs.
+     * @hide
      */
-    public interface BasePreviewProgramColumns extends BaseProgramColumns {
+    @RestrictTo(LIBRARY_GROUP)
+    public interface PreviewProgramColumns {
 
         /** @hide */
-        @StringDef({
+        @IntDef({
                 TYPE_MOVIE,
                 TYPE_TV_SERIES,
                 TYPE_TV_SEASON,
@@ -825,93 +950,95 @@
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_MOVIE = "TYPE_MOVIE";
+        int TYPE_MOVIE = 0;
 
         /**
          * The program type for TV series.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_TV_SERIES = "TYPE_TV_SERIES";
+        int TYPE_TV_SERIES = 1;
 
         /**
          * The program type for TV season.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_TV_SEASON = "TYPE_TV_SEASON";
+        int TYPE_TV_SEASON = 2;
 
         /**
          * The program type for TV episode.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_TV_EPISODE = "TYPE_TV_EPISODE";
+        int TYPE_TV_EPISODE = 3;
 
         /**
          * The program type for clip.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_CLIP = "TYPE_CLIP";
+        int TYPE_CLIP = 4;
 
         /**
          * The program type for event.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_EVENT = "TYPE_EVENT";
+        int TYPE_EVENT = 5;
 
         /**
          * The program type for channel.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_CHANNEL = "TYPE_CHANNEL";
+        int TYPE_CHANNEL = 6;
 
         /**
          * The program type for track.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_TRACK = "TYPE_TRACK";
+        int TYPE_TRACK = 7;
 
         /**
          * The program type for album.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_ALBUM = "TYPE_ALBUM";
+        int TYPE_ALBUM = 8;
 
         /**
          * The program type for artist.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_ARTIST = "TYPE_ARTIST";
+        int TYPE_ARTIST = 9;
 
         /**
          * The program type for playlist.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_PLAYLIST = "TYPE_PLAYLIST";
+        int TYPE_PLAYLIST = 10;
 
         /**
          * The program type for station.
          *
          * @see #COLUMN_TYPE
          */
-        String TYPE_STATION = "TYPE_STATION";
+        int TYPE_STATION = 11;
 
         /** @hide */
-        @StringDef({
+        @IntDef({
                 ASPECT_RATIO_16_9,
                 ASPECT_RATIO_3_2,
+                ASPECT_RATIO_4_3,
                 ASPECT_RATIO_1_1,
                 ASPECT_RATIO_2_3,
         })
         @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(LIBRARY_GROUP)
         public @interface AspectRatio {}
 
         /**
@@ -920,7 +1047,7 @@
          * @see #COLUMN_POSTER_ART_ASPECT_RATIO
          * @see #COLUMN_THUMBNAIL_ASPECT_RATIO
          */
-        String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
+        int ASPECT_RATIO_16_9 = 0;
 
         /**
          * The aspect ratio for 3:2.
@@ -928,7 +1055,15 @@
          * @see #COLUMN_POSTER_ART_ASPECT_RATIO
          * @see #COLUMN_THUMBNAIL_ASPECT_RATIO
          */
-        String ASPECT_RATIO_3_2 = "ASPECT_RATIO_3_2";
+        int ASPECT_RATIO_3_2 = 1;
+
+        /**
+         * The aspect ratio for 4:3.
+         *
+         * @see #COLUMN_POSTER_ART_ASPECT_RATIO
+         * @see #COLUMN_THUMBNAIL_ASPECT_RATIO
+         */
+        int ASPECT_RATIO_4_3 = 2;
 
         /**
          * The aspect ratio for 1:1.
@@ -936,7 +1071,7 @@
          * @see #COLUMN_POSTER_ART_ASPECT_RATIO
          * @see #COLUMN_THUMBNAIL_ASPECT_RATIO
          */
-        String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
+        int ASPECT_RATIO_1_1 = 3;
 
         /**
          * The aspect ratio for 2:3.
@@ -944,15 +1079,16 @@
          * @see #COLUMN_POSTER_ART_ASPECT_RATIO
          * @see #COLUMN_THUMBNAIL_ASPECT_RATIO
          */
-        String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
+        int ASPECT_RATIO_2_3 = 4;
 
         /** @hide */
-        @StringDef({
+        @IntDef({
                 AVAILABILITY_AVAILABLE,
                 AVAILABILITY_FREE_WITH_SUBSCRIPTION,
                 AVAILABILITY_PAID_CONTENT,
         })
         @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(LIBRARY_GROUP)
         public @interface Availability {}
 
         /**
@@ -960,15 +1096,14 @@
          *
          * @see #COLUMN_AVAILABILITY
          */
-        String AVAILABILITY_AVAILABLE = "AVAILABILITY_AVAILABLE";
+        int AVAILABILITY_AVAILABLE = 0;
 
         /**
          * The availability for "free with subscription".
          *
          * @see #COLUMN_AVAILABILITY
          */
-        String AVAILABILITY_FREE_WITH_SUBSCRIPTION =
-                "AVAILABILITY_FREE_WITH_SUBSCRIPTION";
+        int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1;
 
         /**
          * The availability for "paid content, either to-own or rental
@@ -976,16 +1111,16 @@
          *
          * @see #COLUMN_AVAILABILITY
          */
-        String AVAILABILITY_PAID_CONTENT = "AVAILABILITY_PAID_CONTENT";
+        int AVAILABILITY_PAID_CONTENT = 2;
 
         /** @hide */
-        @StringDef({
+        @IntDef({
+                INTERACTION_TYPE_VIEWS,
                 INTERACTION_TYPE_LISTENS,
                 INTERACTION_TYPE_FOLLOWERS,
                 INTERACTION_TYPE_FANS,
                 INTERACTION_TYPE_LIKES,
                 INTERACTION_TYPE_THUMBS,
-                INTERACTION_TYPE_VIEWS,
                 INTERACTION_TYPE_VIEWERS,
         })
         @Retention(RetentionPolicy.SOURCE)
@@ -993,86 +1128,53 @@
         public @interface InteractionType {}
 
         /**
+         * The interaction type for "views".
+         *
+         * @see #COLUMN_INTERACTION_TYPE
+         */
+        int INTERACTION_TYPE_VIEWS = 0;
+
+        /**
          * The interaction type for "listens".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_LISTENS = "INTERACTION_TYPE_LISTENS";
+        int INTERACTION_TYPE_LISTENS = 1;
 
         /**
          * The interaction type for "followers".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
+        int INTERACTION_TYPE_FOLLOWERS = 2;
 
         /**
          * The interaction type for "fans".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
+        int INTERACTION_TYPE_FANS = 3;
 
         /**
          * The interaction type for "likes".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_LIKES = "INTERACTION_TYPE_LIKES";
+        int INTERACTION_TYPE_LIKES = 4;
 
         /**
          * The interaction type for "thumbs".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_THUMBS = "INTERACTION_TYPE_THUMBS";
-
-        /**
-         * The interaction type for "views".
-         *
-         * @see #COLUMN_INTERACTION_TYPE
-         */
-        String INTERACTION_TYPE_VIEWS = "INTERACTION_TYPE_VIEWS";
+        int INTERACTION_TYPE_THUMBS = 5;
 
         /**
          * The interaction type for "viewers".
          *
          * @see #COLUMN_INTERACTION_TYPE
          */
-        String INTERACTION_TYPE_VIEWERS = "INTERACTION_TYPE_VIEWERS";
-
-        /** @hide */
-        @StringDef({
-                REVIEW_RATING_STYLE_STARS,
-                REVIEW_RATING_STYLE_THUMBS_UP_DOWN,
-                REVIEW_RATING_STYLE_PERCENTAGE,
-        })
-        @Retention(RetentionPolicy.SOURCE)
-        @RestrictTo(LIBRARY_GROUP)
-        public @interface ReviewRatingStyle {}
-
-        /**
-         * The review rating style for five star rating.
-         *
-         * @see #COLUMN_REVIEW_RATING_STYLE
-         */
-        String REVIEW_RATING_STYLE_STARS = "REVIEW_RATING_STYLE_STARS";
-
-        /**
-         * The review rating style for thumbs-up and thumbs-down rating.
-         *
-         * @see #COLUMN_REVIEW_RATING_STYLE
-         */
-        String REVIEW_RATING_STYLE_THUMBS_UP_DOWN =
-                "REVIEW_RATING_STYLE_THUMBS_UP_DOWN";
-
-        /**
-         * The review rating style for 0 to 100 point system.
-         *
-         * @see #COLUMN_REVIEW_RATING_STYLE
-         */
-        String REVIEW_RATING_STYLE_PERCENTAGE =
-                "REVIEW_RATING_STYLE_PERCENTAGE";
+        int INTERACTION_TYPE_VIEWERS = 6;
 
         /**
          * The type of this program content.
@@ -1094,7 +1196,7 @@
          * <p>This is a required field if the program is from a {@link Channels#TYPE_PREVIEW}
          * channel.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          */
         String COLUMN_TYPE = "type";
 
@@ -1104,10 +1206,11 @@
          * <p>The value should match one of the followings:
          * {@link #ASPECT_RATIO_16_9},
          * {@link #ASPECT_RATIO_3_2},
+         * {@link #ASPECT_RATIO_4_3},
          * {@link #ASPECT_RATIO_1_1}, and
          * {@link #ASPECT_RATIO_2_3}.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          */
         String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
 
@@ -1117,10 +1220,11 @@
          * <p>The value should match one of the followings:
          * {@link #ASPECT_RATIO_16_9},
          * {@link #ASPECT_RATIO_3_2},
+         * {@link #ASPECT_RATIO_4_3},
          * {@link #ASPECT_RATIO_1_1}, and
          * {@link #ASPECT_RATIO_2_3}.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          */
         String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
 
@@ -1153,7 +1257,7 @@
          * {@link #AVAILABILITY_FREE_WITH_SUBSCRIPTION}, and
          * {@link #AVAILABILITY_PAID_CONTENT}.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          */
         String COLUMN_AVAILABILITY = "availability";
 
@@ -1264,18 +1368,17 @@
         String COLUMN_DURATION_MILLIS = "duration_millis";
 
         /**
-         * The intent URI which is launched when the preview video is selected.
+         * The intent URI which is launched when the preview program is selected.
          *
          * <p>The URI is created using {@link Intent#toUri} with {@link Intent#URI_INTENT_SCHEME}
          * and converted back to the original intent with {@link Intent#parseUri}. The intent is
-         * launched when the user selects the preview video item.
+         * launched when the user selects the preview program item.
          *
          * <p>Can be empty.
          *
          * <p>Type: TEXT
          */
-        String COLUMN_APP_LINK_INTENT_URI =
-                "app_link_intent_uri";
+        String COLUMN_INTENT_URI = "intent_uri";
 
         /**
          * The flag indicating whether this program is transient or not.
@@ -1301,7 +1404,7 @@
          * {@link #INTERACTION_TYPE_VIEWS}, and
          * {@link #INTERACTION_TYPE_VIEWERS}.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          * @see #COLUMN_INTERACTION_COUNT
          */
         String COLUMN_INTERACTION_TYPE = "interaction_type";
@@ -1324,33 +1427,6 @@
         String COLUMN_AUTHOR = "author";
 
         /**
-         * The review rating score style used for {@link #COLUMN_REVIEW_RATING}.
-         *
-         * <p> The value should match one of the followings: {@link #REVIEW_RATING_STYLE_STARS},
-         * {@link #REVIEW_RATING_STYLE_THUMBS_UP_DOWN}, and {@link #REVIEW_RATING_STYLE_PERCENTAGE}.
-         *
-         * <p>Type: TEXT
-         * @see #COLUMN_REVIEW_RATING
-         */
-        String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
-
-        /**
-         * The review rating score for this program.
-         *
-         * <p>The format of the value is dependent on {@link #COLUMN_REVIEW_RATING_STYLE}. If the
-         * style is {@link #REVIEW_RATING_STYLE_STARS}, the value should be a real number between
-         * 0.0 and 5.0. (e.g. "4.5") If the style is {@link #REVIEW_RATING_STYLE_THUMBS_UP_DOWN},
-         * the value should be two integers, one for thumbs-up count and the other for thumbs-down
-         * count, with a comma between them. (e.g. "200,40") If the style is
-         * {@link #REVIEW_RATING_STYLE_PERCENTAGE}, the value shoule be a real number between 0 and
-         * 100. (e.g. "99.9")
-         *
-         * <p>Type: TEXT
-         * @see #COLUMN_REVIEW_RATING_STYLE
-         */
-        String COLUMN_REVIEW_RATING = "review_rating";
-
-        /**
          * The flag indicating whether this TV program is browsable or not.
          *
          * <p>This column can only be set by applications having proper system permission. For
@@ -2195,7 +2271,7 @@
      * <p>By default, the query results will be sorted by
      * {@link Programs#COLUMN_START_TIME_UTC_MILLIS} in ascending order.
      */
-    public static final class Programs implements BaseProgramColumns {
+    public static final class Programs implements BaseTvColumns, ProgramColumns {
 
         /** The content:// style URI for this table. */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
@@ -2509,7 +2585,7 @@
      * <p>By default, the query results will be sorted by {@link #COLUMN_START_TIME_UTC_MILLIS} in
      * ascending order.
      */
-    public static final class RecordedPrograms implements BaseProgramColumns {
+    public static final class RecordedPrograms implements BaseTvColumns, ProgramColumns {
 
         /** The content:// style URI for this table. */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
@@ -2631,7 +2707,8 @@
     /**
      * Column definitions for the preview TV programs table.
      */
-    public static final class PreviewPrograms implements BasePreviewProgramColumns {
+    public static final class PreviewPrograms implements BaseTvColumns, ProgramColumns,
+            PreviewProgramColumns {
 
         /** The content:// style URI for this table. */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
@@ -2674,7 +2751,8 @@
     /**
      * Column definitions for the "watch next" TV programs table.
      */
-    public static final class WatchNextPrograms implements BasePreviewProgramColumns {
+    public static final class WatchNextPrograms implements BaseTvColumns, ProgramColumns,
+            PreviewProgramColumns {
 
         /** The content:// style URI for this table. */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
@@ -2687,7 +2765,7 @@
         public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
 
         /** @hide */
-        @StringDef({
+        @IntDef({
                 WATCH_NEXT_TYPE_CONTINUE,
                 WATCH_NEXT_TYPE_NEXT,
                 WATCH_NEXT_TYPE_NEW,
@@ -2703,7 +2781,7 @@
          *
          * @see #COLUMN_WATCH_NEXT_TYPE
          */
-        public static final String WATCH_NEXT_TYPE_CONTINUE = "WATCH_NEXT_TYPE_CONTINUE";
+        public static final int WATCH_NEXT_TYPE_CONTINUE = 0;
 
         /**
          * The watch next type for NEXT. Use this type when the user has watched one or more
@@ -2713,7 +2791,7 @@
          *
          * @see #COLUMN_WATCH_NEXT_TYPE
          */
-        public static final String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
+        public static final int WATCH_NEXT_TYPE_NEXT = 1;
 
         /**
          * The watch next type for NEW. Use this type when the user had watched all of the available
@@ -2723,7 +2801,7 @@
          *
          * @see #COLUMN_WATCH_NEXT_TYPE
          */
-        public static final String WATCH_NEXT_TYPE_NEW = "WATCH_NEXT_TYPE_NEW";
+        public static final int WATCH_NEXT_TYPE_NEW = 2;
 
         /**
          * The watch next type for WATCHLIST. Use this type when the user has elected to explicitly
@@ -2732,7 +2810,7 @@
          *
          * @see #COLUMN_WATCH_NEXT_TYPE
          */
-        public static final String WATCH_NEXT_TYPE_WATCHLIST = "WATCH_NEXT_TYPE_WATCHLIST";
+        public static final int WATCH_NEXT_TYPE_WATCHLIST = 3;
 
         /**
          * The "watch next" type of this program content.
@@ -2745,7 +2823,7 @@
          *
          * <p>This is a required field.
          *
-         * <p>Type: TEXT
+         * <p>Type: INTEGER
          */
         public static final String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
 
@@ -2771,4 +2849,4 @@
         public static final String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS =
                 "last_engagement_time_utc_millis";
     }
-}
\ No newline at end of file
+}
diff --git a/tv-provider/src/android/support/media/tv/WatchNextProgram.java b/tv-provider/src/android/support/media/tv/WatchNextProgram.java
index 0c32883..b7c9666 100644
--- a/tv-provider/src/android/support/media/tv/WatchNextProgram.java
+++ b/tv-provider/src/android/support/media/tv/WatchNextProgram.java
@@ -23,7 +23,6 @@
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.WatchNextPrograms;
 import android.support.media.tv.TvContractCompat.WatchNextPrograms.WatchNextType;
-import android.text.TextUtils;
 
 import java.util.Objects;
 
@@ -70,7 +69,7 @@
     private static final long INVALID_LONG_VALUE = -1;
     private static final int INVALID_INT_VALUE = -1;
 
-    private final String mWatchNextType;
+    private final int mWatchNextType;
     private final long mLastEngagementTimeUtcMillis;
 
     private WatchNextProgram(Builder builder) {
@@ -82,7 +81,7 @@
     /**
      * @return The value of {@link WatchNextPrograms#COLUMN_WATCH_NEXT_TYPE} for the program.
      */
-    public @WatchNextType String getWatchNextType() {
+    public @WatchNextType int getWatchNextType() {
         return mWatchNextType;
     }
 
@@ -135,7 +134,7 @@
     @Override
     public ContentValues toContentValues(boolean includeProtectedFields) {
         ContentValues values = super.toContentValues(includeProtectedFields);
-        if (!TextUtils.isEmpty(mWatchNextType)) {
+        if (mWatchNextType != INVALID_INT_VALUE) {
             values.put(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE, mWatchNextType);
         }
         if (mLastEngagementTimeUtcMillis != INVALID_LONG_VALUE) {
@@ -159,7 +158,7 @@
         int index;
         if ((index = cursor.getColumnIndex(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE)) >= 0
                 && !cursor.isNull(index)) {
-            builder.setWatchNextType(cursor.getString(index));
+            builder.setWatchNextType(cursor.getInt(index));
         }
         if ((index = cursor.getColumnIndex(
                 WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS)) >= 0
@@ -181,7 +180,7 @@
      * This Builder class simplifies the creation of a {@link WatchNextProgram} object.
      */
     public static final class Builder extends BasePreviewProgram.Builder<Builder> {
-        private String mWatchNextType;
+        private int mWatchNextType = INVALID_INT_VALUE;
         private long mLastEngagementTimeUtcMillis = INVALID_LONG_VALUE;
 
         /**
@@ -212,7 +211,7 @@
          *                      the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
-        public Builder setWatchNextType(@WatchNextType String watchNextType) {
+        public Builder setWatchNextType(@WatchNextType int watchNextType) {
             mWatchNextType = watchNextType;
             return this;
         }
diff --git a/tv-provider/tests/src/android/support/media/tv/ChannelTest.java b/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
index 69201ad..88dc405 100644
--- a/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
@@ -136,6 +136,7 @@
                 .setInternalProviderFlag2(0x3)
                 .setInternalProviderFlag3(0x2)
                 .setInternalProviderFlag4(0x1)
+                .setInternalProviderId("Internal Provider")
                 .setTransient(true)
                 .setBrowsable(true)
                 .setLocked(true)
@@ -166,6 +167,7 @@
             assertEquals(channelA.getAppLinkText(), channelB.getAppLinkText());
         }
         if (BuildCompat.isAtLeastO()) {
+            assertEquals(channelA.getInternalProviderId(), channelB.getInternalProviderId());
             assertEquals(channelA.isTransient(), channelB.isTransient());
         }
         if (includeIdAndProtectedFields) {
diff --git a/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java b/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
index 20bc8ab..b39cf97 100644
--- a/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
@@ -151,7 +151,7 @@
                 .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg"))
                 .setLastPlaybackPositionMillis(0)
                 .setDurationMillis(60 * 1000)
-                .setAppLinkIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
+                .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
                         Intent.URI_INTENT_SCHEME)))
                 .setTransient(false)
                 .setType(PreviewPrograms.TYPE_TV_EPISODE)
@@ -186,7 +186,7 @@
                 PreviewPrograms.COLUMN_PREVIEW_VIDEO_URI,
                 PreviewPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
                 PreviewPrograms.COLUMN_DURATION_MILLIS,
-                PreviewPrograms.COLUMN_APP_LINK_INTENT_URI,
+                PreviewPrograms.COLUMN_INTENT_URI,
                 PreviewPrograms.COLUMN_WEIGHT,
                 PreviewPrograms.COLUMN_TRANSIENT,
                 PreviewPrograms.COLUMN_TYPE,
@@ -225,7 +225,7 @@
                 .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg"))
                 .setLastPlaybackPositionMillis(0)
                 .setDurationMillis(60 * 1000)
-                .setAppLinkIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
+                .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
                         Intent.URI_INTENT_SCHEME)))
                 .setTransient(false)
                 .setType(PreviewPrograms.TYPE_MOVIE)
@@ -294,7 +294,7 @@
         assertEquals(programA.getLastPlaybackPositionMillis(),
                 programB.getLastPlaybackPositionMillis());
         assertEquals(programA.getDurationMillis(), programB.getDurationMillis());
-        assertEquals(programA.getAppLinkIntentUri(), programB.getAppLinkIntentUri());
+        assertEquals(programA.getIntentUri(), programB.getIntentUri());
         assertEquals(programA.getWeight(), programB.getWeight());
         assertEquals(programA.isTransient(), programB.isTransient());
         assertEquals(programA.getType(), programB.getType());
diff --git a/tv-provider/tests/src/android/support/media/tv/ProgramTest.java b/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
index ec66068..3b09777 100644
--- a/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
@@ -143,6 +143,8 @@
                 .setInternalProviderFlag2(0x3)
                 .setInternalProviderFlag3(0x2)
                 .setInternalProviderFlag4(0x1)
+                .setReviewRatingStyle(Programs.REVIEW_RATING_STYLE_PERCENTAGE)
+                .setReviewRating("83.9")
                 .setChannelId(channelId)
                 .setStartTimeUtcMillis(0)
                 .setEndTimeUtcMillis(1000)
@@ -182,6 +184,10 @@
             assertTrue(Objects.equals(programA.isRecordingProhibited(),
                     programB.isRecordingProhibited()));
         }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle());
+            assertEquals(programA.getReviewRating(), programB.getReviewRating());
+        }
         assertEquals(programA.toString(), programB.toString());
         if (includeIdAndProtectedFields) {
             // Skip row ID since the one from system DB has the valid ID while the other does not.
diff --git a/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java b/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
index 724644a..79048aa 100644
--- a/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
@@ -138,7 +138,7 @@
                 .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg"))
                 .setLastPlaybackPositionMillis(0)
                 .setDurationMillis(60 * 1000)
-                .setAppLinkIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
+                .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
                         Intent.URI_INTENT_SCHEME)))
                 .setTransient(false)
                 .setType(WatchNextPrograms.TYPE_TV_EPISODE)
@@ -172,7 +172,7 @@
                 WatchNextPrograms.COLUMN_PREVIEW_VIDEO_URI,
                 WatchNextPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
                 WatchNextPrograms.COLUMN_DURATION_MILLIS,
-                WatchNextPrograms.COLUMN_APP_LINK_INTENT_URI,
+                WatchNextPrograms.COLUMN_INTENT_URI,
                 WatchNextPrograms.COLUMN_TRANSIENT,
                 WatchNextPrograms.COLUMN_TYPE,
                 WatchNextPrograms.COLUMN_POSTER_ART_ASPECT_RATIO,
@@ -208,7 +208,7 @@
                 .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg"))
                 .setLastPlaybackPositionMillis(0)
                 .setDurationMillis(60 * 1000)
-                .setAppLinkIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
+                .setIntentUri(Uri.parse(new Intent(Intent.ACTION_VIEW).toUri(
                         Intent.URI_INTENT_SCHEME)))
                 .setTransient(false)
                 .setType(WatchNextPrograms.TYPE_MOVIE)
@@ -277,7 +277,7 @@
         assertEquals(programA.getLastPlaybackPositionMillis(),
                 programB.getLastPlaybackPositionMillis());
         assertEquals(programA.getDurationMillis(), programB.getDurationMillis());
-        assertEquals(programA.getAppLinkIntentUri(), programB.getAppLinkIntentUri());
+        assertEquals(programA.getIntentUri(), programB.getIntentUri());
         assertEquals(programA.isTransient(), programB.isTransient());
         assertEquals(programA.getType(), programB.getType());
         assertEquals(programA.getWatchNextType(), programB.getWatchNextType());
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java b/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
index 3dbc78a..a433fc0 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BackgroundManager.java
@@ -37,6 +37,7 @@
 import android.support.v17.leanback.widget.BackgroundHelper;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.graphics.drawable.DrawableCompat;
+import android.support.v4.os.BuildCompat;
 import android.support.v4.view.animation.FastOutLinearInInterpolator;
 import android.util.Log;
 import android.view.View;
@@ -661,6 +662,11 @@
      */
     public void attachToView(View sceneRoot) {
         attachToViewInternal(sceneRoot);
+        // clear background to reduce overdraw since the View will act as background.
+        // Activity transition below O has ghost effect for null window background where we
+        // need set a transparent background to force redraw the whole window.
+        mContext.getWindow().getDecorView().setBackground(
+                BuildCompat.isAtLeastO() ? null : new ColorDrawable(Color.TRANSPARENT));
     }
 
     void attachToViewInternal(View sceneRoot) {
@@ -705,15 +711,18 @@
      */
     public void release() {
         if (DEBUG) Log.v(TAG, "release " + this);
+        if (mChangeRunnable != null) {
+            mHandler.removeCallbacks(mChangeRunnable);
+            mChangeRunnable = null;
+        }
+        if (mAnimator.isStarted()) {
+            mAnimator.cancel();
+        }
         if (mLayerDrawable != null) {
             mLayerDrawable.clearDrawable(R.id.background_imagein, mContext);
             mLayerDrawable.clearDrawable(R.id.background_imageout, mContext);
             mLayerDrawable = null;
         }
-        if (mChangeRunnable != null) {
-            mHandler.removeCallbacks(mChangeRunnable);
-            mChangeRunnable = null;
-        }
         mBackgroundDrawable = null;
     }
 
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 e9634bd..4af1f98 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -617,6 +617,7 @@
                 // wait next cycle for Fragment view created so we can focus on it.
                 // This is a bit hack eventually we will do commitNow() which get view immediately.
                 getView().post(new Runnable() {
+                    @Override
                     public void run() {
                         if (getView() != null) {
                             switchToVideo();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragmentBackgroundController.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragmentBackgroundController.java
index f6f389c..e3fc820 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragmentBackgroundController.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragmentBackgroundController.java
@@ -116,6 +116,8 @@
     int mSolidColor;
     boolean mCanUseHost = false;
 
+    private Fragment mLastVideoFragmentForGlueHost;
+
     /**
      * Creates a DetailsFragmentBackgroundController for a DetailsFragment. Note that
      * each DetailsFragment can only associate with one DetailsFragmentBackgroundController.
@@ -227,13 +229,23 @@
         if (mPlaybackGlue == playbackGlue) {
             return;
         }
+
+        PlaybackGlueHost playbackGlueHost = null;
         if (mPlaybackGlue != null) {
+            playbackGlueHost = mPlaybackGlue.getHost();
             mPlaybackGlue.setHost(null);
         }
+
         mPlaybackGlue = playbackGlue;
         mVideoHelper.setPlaybackGlue(mPlaybackGlue);
         if (mCanUseHost && mPlaybackGlue != null) {
-            mPlaybackGlue.setHost(onCreateGlueHost());
+            if (playbackGlueHost == null
+                    || mLastVideoFragmentForGlueHost != findOrCreateVideoFragment()) {
+                mPlaybackGlue.setHost(onCreateGlueHost());
+                mLastVideoFragmentForGlueHost = findOrCreateVideoFragment();
+            } else {
+                mPlaybackGlue.setHost(playbackGlueHost);
+            }
         }
     }
 
@@ -299,6 +311,7 @@
             mCanUseHost = true;
             if (mPlaybackGlue != null) {
                 mPlaybackGlue.setHost(onCreateGlueHost());
+                mLastVideoFragmentForGlueHost = findOrCreateVideoFragment();
             }
         }
         if (mPlaybackGlue != null && mPlaybackGlue.isReadyForPlayback()) {
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 4ebfb78..31a678f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
@@ -620,6 +620,7 @@
                 // wait next cycle for Fragment view created so we can focus on it.
                 // This is a bit hack eventually we will do commitNow() which get view immediately.
                 getView().post(new Runnable() {
+                    @Override
                     public void run() {
                         if (getView() != null) {
                             switchToVideo();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController.java
index 763b84f..6a951c9 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController.java
@@ -119,6 +119,8 @@
     int mSolidColor;
     boolean mCanUseHost = false;
 
+    private Fragment mLastVideoSupportFragmentForGlueHost;
+
     /**
      * Creates a DetailsSupportFragmentBackgroundController for a DetailsSupportFragment. Note that
      * each DetailsSupportFragment can only associate with one DetailsSupportFragmentBackgroundController.
@@ -230,13 +232,23 @@
         if (mPlaybackGlue == playbackGlue) {
             return;
         }
+
+        PlaybackGlueHost playbackGlueHost = null;
         if (mPlaybackGlue != null) {
+            playbackGlueHost = mPlaybackGlue.getHost();
             mPlaybackGlue.setHost(null);
         }
+
         mPlaybackGlue = playbackGlue;
         mVideoHelper.setPlaybackGlue(mPlaybackGlue);
         if (mCanUseHost && mPlaybackGlue != null) {
-            mPlaybackGlue.setHost(onCreateGlueHost());
+            if (playbackGlueHost == null
+                    || mLastVideoSupportFragmentForGlueHost != findOrCreateVideoSupportFragment()) {
+                mPlaybackGlue.setHost(onCreateGlueHost());
+                mLastVideoSupportFragmentForGlueHost = findOrCreateVideoSupportFragment();
+            } else {
+                mPlaybackGlue.setHost(playbackGlueHost);
+            }
         }
     }
 
@@ -302,6 +314,7 @@
             mCanUseHost = true;
             if (mPlaybackGlue != null) {
                 mPlaybackGlue.setHost(onCreateGlueHost());
+                mLastVideoSupportFragmentForGlueHost = findOrCreateVideoSupportFragment();
             }
         }
         if (mPlaybackGlue != null && mPlaybackGlue.isReadyForPlayback()) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
index aa2a51f..3305bd1 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
@@ -24,7 +24,9 @@
 import android.animation.TimeInterpolator;
 import android.app.Fragment;
 import android.content.Context;
+import android.graphics.Color;
 import android.os.Bundle;
+import android.support.annotation.ColorInt;
 import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.PagingIndicator;
@@ -167,6 +169,10 @@
 
     // Keys used to save and restore the states.
     private static final String KEY_CURRENT_PAGE_INDEX = "leanback.onboarding.current_page_index";
+    private static final String KEY_LOGO_ANIMATION_FINISHED =
+            "leanback.onboarding.logo_animation_finished";
+    private static final String KEY_ENTER_ANIMATION_FINISHED =
+            "leanback.onboarding.enter_animation_finished";
 
     private ContextThemeWrapper mThemeWrapper;
 
@@ -186,8 +192,25 @@
     // the fragment is restored.
     private int mLogoResourceId;
     boolean mLogoAnimationFinished;
+    boolean mEnterAnimationFinished;
     int mCurrentPageIndex;
 
+    @ColorInt
+    int mTitleViewTextColor = Color.TRANSPARENT;
+    boolean mTitleViewTextColorSet;
+
+    @ColorInt
+    int mDescriptionViewTextColor = Color.TRANSPARENT;
+    boolean mDescriptionViewTextColorSet;
+
+    @ColorInt
+    int mDotBackgroundColor = Color.TRANSPARENT;
+    boolean mDotBackgroundColorSet;
+
+    @ColorInt
+    int mArrowBackgroundColor = Color.TRANSPARENT;
+    boolean mArrowBackgroundColorSet;
+
     private AnimatorSet mAnimator;
 
     private final OnClickListener mOnClickListener = new OnClickListener() {
@@ -289,38 +312,157 @@
         mLogoView = (ImageView) view.findViewById(R.id.logo);
         mTitleView = (TextView) view.findViewById(R.id.title);
         mDescriptionView = (TextView) view.findViewById(R.id.description);
+
+        if (mTitleViewTextColorSet) {
+            mTitleView.setTextColor(mTitleViewTextColor);
+        }
+        if (mDescriptionViewTextColorSet) {
+            mDescriptionView.setTextColor(mDescriptionViewTextColor);
+        }
+        if (mDotBackgroundColorSet) {
+            mPageIndicator.setDotBackgroundColor(mDotBackgroundColor);
+        }
+        if (mArrowBackgroundColorSet) {
+            mPageIndicator.setDotBackgroundColor(mArrowBackgroundColor);
+        }
         final Context context = FragmentUtil.getContext(this);
         if (sSlideDistance == 0) {
             sSlideDistance = (int) (SLIDE_DISTANCE * context.getResources()
                     .getDisplayMetrics().scaledDensity);
         }
-        if (savedInstanceState == null) {
-            mCurrentPageIndex = 0;
-            mLogoAnimationFinished = false;
-            mPageIndicator.onPageSelected(0, false);
-            view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
-                @Override
-                public boolean onPreDraw() {
-                    view.getViewTreeObserver().removeOnPreDrawListener(this);
-                    if (!startLogoAnimation()) {
-                        startEnterAnimation();
-                    }
-                    return true;
-                }
-            });
-        } else {
-            mLogoAnimationFinished = true;
-            mCurrentPageIndex = savedInstanceState.getInt(KEY_CURRENT_PAGE_INDEX);
-            initializeViews(view);
-        }
         view.requestFocus();
         return view;
     }
 
     @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (savedInstanceState == null) {
+            mCurrentPageIndex = 0;
+            mLogoAnimationFinished = false;
+            mEnterAnimationFinished = false;
+            mPageIndicator.onPageSelected(0, false);
+            view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    getView().getViewTreeObserver().removeOnPreDrawListener(this);
+                    if (!startLogoAnimation()) {
+                        mLogoAnimationFinished = true;
+                        onLogoAnimationFinished();
+                    }
+                    return true;
+                }
+            });
+        } else {
+            mCurrentPageIndex = savedInstanceState.getInt(KEY_CURRENT_PAGE_INDEX);
+            mLogoAnimationFinished = savedInstanceState.getBoolean(KEY_LOGO_ANIMATION_FINISHED);
+            mEnterAnimationFinished = savedInstanceState.getBoolean(KEY_ENTER_ANIMATION_FINISHED);
+            if (!mLogoAnimationFinished) {
+                // logo animation wasn't started or was interrupted when the activity was destroyed;
+                // restart it againl
+                if (!startLogoAnimation()) {
+                    mLogoAnimationFinished = true;
+                    onLogoAnimationFinished();
+                }
+            } else {
+                onLogoAnimationFinished();
+            }
+        }
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(KEY_CURRENT_PAGE_INDEX, mCurrentPageIndex);
+        outState.putBoolean(KEY_LOGO_ANIMATION_FINISHED, mLogoAnimationFinished);
+        outState.putBoolean(KEY_ENTER_ANIMATION_FINISHED, mEnterAnimationFinished);
+    }
+
+    /**
+     * Sets the text color for TitleView. If not set, the default textColor set in style
+     * referenced by attr {@link R.attr#onboardingTitleStyle} will be used.
+     * @param color the color to use as the text color for TitleView
+     */
+    public void setTitleViewTextColor(@ColorInt int color) {
+        mTitleViewTextColor = color;
+        mTitleViewTextColorSet = true;
+        if (mTitleView != null) {
+            mTitleView.setTextColor(color);
+        }
+    }
+
+    /**
+     * Returns the text color of TitleView if it's set through
+     * {@link #setTitleViewTextColor(int)}. If no color was set, transparent is returned.
+     */
+    @ColorInt
+    public final int getTitleViewTextColor() {
+        return mTitleViewTextColor;
+    }
+
+    /**
+     * Sets the text color for DescriptionView. If not set, the default textColor set in style
+     * referenced by attr {@link R.attr#onboardingDescriptionStyle} will be used.
+     * @param color the color to use as the text color for DescriptionView
+     */
+    public void setDescriptionViewTextColor(@ColorInt int color) {
+        mDescriptionViewTextColor = color;
+        mDescriptionViewTextColorSet = true;
+        if (mDescriptionView != null) {
+            mDescriptionView.setTextColor(color);
+        }
+    }
+
+    /**
+     * Returns the text color of DescriptionView if it's set through
+     * {@link #setDescriptionViewTextColor(int)}. If no color was set, transparent is returned.
+     */
+    @ColorInt
+    public final int getDescriptionViewTextColor() {
+        return mDescriptionViewTextColor;
+    }
+    /**
+     * Sets the background color of the dots. If not set, the default color from attr
+     * {@link R.styleable#PagingIndicator_dotBgColor} in the theme will be used.
+     * @param color the color to use for dot backgrounds
+     */
+    public void setDotBackgroundColor(@ColorInt int color) {
+        mDotBackgroundColor = color;
+        mDotBackgroundColorSet = true;
+        if (mPageIndicator != null) {
+            mPageIndicator.setDotBackgroundColor(color);
+        }
+    }
+
+    /**
+     * Returns the background color of the dot if it's set through
+     * {@link #setDotBackgroundColor(int)}. If no color was set, transparent is returned.
+     */
+    @ColorInt
+    public final int getDotBackgroundColor() {
+        return mDotBackgroundColor;
+    }
+
+    /**
+     * Sets the background color of the arrow. If not set, the default color from attr
+     * {@link R.styleable#PagingIndicator_arrowBgColor} in the theme will be used.
+     * @param color the color to use for arrow background
+     */
+    public void setArrowBackgroundColor(@ColorInt int color) {
+        mArrowBackgroundColor = color;
+        mArrowBackgroundColorSet = true;
+        if (mPageIndicator != null) {
+            mPageIndicator.setArrowBackgroundColor(color);
+        }
+    }
+
+    /**
+     * Returns the background color of the arrow if it's set through
+     * {@link #setArrowBackgroundColor(int)}. If no color was set, transparent is returned.
+     */
+    @ColorInt
+    public final int getArrowBackgroundColor() {
+        return mArrowBackgroundColor;
     }
 
     /**
@@ -411,7 +553,8 @@
                 @Override
                 public void onAnimationEnd(Animator animation) {
                     if (context != null) {
-                        startEnterAnimation();
+                        mLogoAnimationFinished = true;
+                        onLogoAnimationFinished();
                     }
                 }
             });
@@ -432,7 +575,12 @@
         return null;
     }
 
-    private void initializeViews(View container) {
+
+    /**
+     * Hides the logo view and makes other fragment views visible. Also initializes the texts for
+     * Title and Description views.
+     */
+    void hideLogoView() {
         mLogoView.setVisibility(View.GONE);
 
         if (mIconResourceId != 0) {
@@ -440,6 +588,7 @@
             mMainIconView.setVisibility(View.VISIBLE);
         }
 
+        View container = getView();
         // Create custom views.
         LayoutInflater inflater = getThemeInflater(LayoutInflater.from(
                 FragmentUtil.getContext(this)));
@@ -478,20 +627,35 @@
         // Header views.
         mTitleView.setText(getPageTitle(mCurrentPageIndex));
         mDescriptionView.setText(getPageDescription(mCurrentPageIndex));
-        onLogoAnimationFinished();
     }
 
     /**
-     * Called immediately after fragment views become visible. This method gives subclasses a chance
-     * to initialize themselves. If a logo animation is specified, calling this method is delayed
-     * until after the logo animation is complete.
+     * Called immediately after the logo animation is complete or no logo animation is specified.
+     * This method can also be called when the activity is recreated, i.e. when no logo animation
+     * are performed.
+     * By default, this method will hide the logo view and start the entrance animation for this
+     * fragment.
+     * Overriding subclasses can provide their own data loading logic as to when the entrance
+     * animation should be executed.
      */
     protected void onLogoAnimationFinished() {
+        startEnterAnimation(false);
     }
 
-    void startEnterAnimation() {
-        mLogoAnimationFinished = true;
-        initializeViews(getView());
+    /**
+     * Called to start entrance transition. This can be called by subclasses when the logo animation
+     * and data loading is complete. If force flag is set to false, it will only start the animation
+     * if it's not already done yet. Otherwise, it will always start the enter animation. In both
+     * cases, the logo view will hide and the rest of fragment views become visible after this call.
+     *
+     * @param force {@code true} if enter animation has to be performed regardless of whether it's
+     *                          been done in the past, {@code false} otherwise
+     */
+    protected final void startEnterAnimation(boolean force) {
+        hideLogoView();
+        if (mEnterAnimationFinished && !force) {
+            return;
+        }
         List<Animator> animators = new ArrayList<>();
         final Context context = FragmentUtil.getContext(this);
         Animator animator = AnimatorInflater.loadAnimator(context,
@@ -526,6 +690,12 @@
         mAnimator = new AnimatorSet();
         mAnimator.playTogether(animators);
         mAnimator.start();
+        mAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mEnterAnimationFinished = true;
+            }
+        });
         // Search focus and give the focus to the appropriate child which has become visible.
         getView().requestFocus();
     }
@@ -549,7 +719,7 @@
     }
 
     /**
-     * Returns whether the logo enter transition is finished.
+     * Returns whether the logo enter animation is finished.
      *
      * @return {@code true} if the logo enter transition is finished, {@code false} otherwise
      */
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
index 59a0f5f..8009e3f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
@@ -27,7 +27,9 @@
 import android.animation.TimeInterpolator;
 import android.support.v4.app.Fragment;
 import android.content.Context;
+import android.graphics.Color;
 import android.os.Bundle;
+import android.support.annotation.ColorInt;
 import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.PagingIndicator;
@@ -170,6 +172,10 @@
 
     // Keys used to save and restore the states.
     private static final String KEY_CURRENT_PAGE_INDEX = "leanback.onboarding.current_page_index";
+    private static final String KEY_LOGO_ANIMATION_FINISHED =
+            "leanback.onboarding.logo_animation_finished";
+    private static final String KEY_ENTER_ANIMATION_FINISHED =
+            "leanback.onboarding.enter_animation_finished";
 
     private ContextThemeWrapper mThemeWrapper;
 
@@ -189,8 +195,25 @@
     // the fragment is restored.
     private int mLogoResourceId;
     boolean mLogoAnimationFinished;
+    boolean mEnterAnimationFinished;
     int mCurrentPageIndex;
 
+    @ColorInt
+    int mTitleViewTextColor = Color.TRANSPARENT;
+    boolean mTitleViewTextColorSet;
+
+    @ColorInt
+    int mDescriptionViewTextColor = Color.TRANSPARENT;
+    boolean mDescriptionViewTextColorSet;
+
+    @ColorInt
+    int mDotBackgroundColor = Color.TRANSPARENT;
+    boolean mDotBackgroundColorSet;
+
+    @ColorInt
+    int mArrowBackgroundColor = Color.TRANSPARENT;
+    boolean mArrowBackgroundColorSet;
+
     private AnimatorSet mAnimator;
 
     private final OnClickListener mOnClickListener = new OnClickListener() {
@@ -292,38 +315,153 @@
         mLogoView = (ImageView) view.findViewById(R.id.logo);
         mTitleView = (TextView) view.findViewById(R.id.title);
         mDescriptionView = (TextView) view.findViewById(R.id.description);
+
+        if (mTitleViewTextColorSet) {
+            mTitleView.setTextColor(mTitleViewTextColor);
+        }
+        if (mDescriptionViewTextColorSet) {
+            mDescriptionView.setTextColor(mDescriptionViewTextColor);
+        }
+        if (mDotBackgroundColorSet) {
+            mPageIndicator.setDotBackgroundColor(mDotBackgroundColor);
+        }
+        if (mArrowBackgroundColorSet) {
+            mPageIndicator.setDotBackgroundColor(mArrowBackgroundColor);
+        }
         final Context context = getContext();
         if (sSlideDistance == 0) {
             sSlideDistance = (int) (SLIDE_DISTANCE * context.getResources()
                     .getDisplayMetrics().scaledDensity);
         }
-        if (savedInstanceState == null) {
-            mCurrentPageIndex = 0;
-            mLogoAnimationFinished = false;
-            mPageIndicator.onPageSelected(0, false);
-            view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
-                @Override
-                public boolean onPreDraw() {
-                    view.getViewTreeObserver().removeOnPreDrawListener(this);
-                    if (!startLogoAnimation()) {
-                        startEnterAnimation();
-                    }
-                    return true;
-                }
-            });
-        } else {
-            mLogoAnimationFinished = true;
-            mCurrentPageIndex = savedInstanceState.getInt(KEY_CURRENT_PAGE_INDEX);
-            initializeViews(view);
-        }
         view.requestFocus();
         return view;
     }
 
     @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (savedInstanceState == null) {
+            mCurrentPageIndex = 0;
+            mLogoAnimationFinished = false;
+            mEnterAnimationFinished = false;
+            mPageIndicator.onPageSelected(0, false);
+            view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    getView().getViewTreeObserver().removeOnPreDrawListener(this);
+                    if (!startLogoAnimation()) {
+                        mLogoAnimationFinished = true;
+                        onLogoAnimationFinished();
+                    }
+                    return true;
+                }
+            });
+        } else {
+            mCurrentPageIndex = savedInstanceState.getInt(KEY_CURRENT_PAGE_INDEX);
+            mLogoAnimationFinished = savedInstanceState.getBoolean(KEY_LOGO_ANIMATION_FINISHED);
+            mEnterAnimationFinished = savedInstanceState.getBoolean(KEY_ENTER_ANIMATION_FINISHED);
+            if (!mLogoAnimationFinished) {
+                // logo animation wasn't started or was interrupted when the activity was destroyed;
+                // restart it againl
+                if (!startLogoAnimation()) {
+                    mLogoAnimationFinished = true;
+                    onLogoAnimationFinished();
+                }
+            } else {
+                onLogoAnimationFinished();
+            }
+        }
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(KEY_CURRENT_PAGE_INDEX, mCurrentPageIndex);
+        outState.putBoolean(KEY_LOGO_ANIMATION_FINISHED, mLogoAnimationFinished);
+        outState.putBoolean(KEY_ENTER_ANIMATION_FINISHED, mEnterAnimationFinished);
+    }
+
+    /**
+     * Sets the text color for TitleView. If not set, the default textColor set in style
+     * referenced by attr {@link R.attr#onboardingTitleStyle} will be used.
+     * @param color the color to use as the text color for TitleView
+     */
+    public void setTitleViewTextColor(@ColorInt int color) {
+        mTitleViewTextColor = color;
+        mTitleViewTextColorSet = true;
+        if (mTitleView != null) {
+            mTitleView.setTextColor(color);
+        }
+    }
+
+    /**
+     * Returns the text color of TitleView if it's set through
+     * {@link #setTitleViewTextColor(int)}. If no color was set, transparent is returned.
+     */
+    public final int getTitleViewTextColor() {
+        return mTitleViewTextColor;
+    }
+
+    /**
+     * Sets the text color for DescriptionView. If not set, the default textColor set in style
+     * referenced by attr {@link R.attr#onboardingDescriptionStyle} will be used.
+     * @param color the color to use as the text color for DescriptionView
+     */
+    public void setDescriptionViewTextColor(@ColorInt int color) {
+        mDescriptionViewTextColor = color;
+        mDescriptionViewTextColorSet = true;
+        if (mDescriptionView != null) {
+            mDescriptionView.setTextColor(color);
+        }
+    }
+
+    /**
+     * Returns the text color of DescriptionView if it's set through
+     * {@link #setDescriptionViewTextColor(int)}. If no color was set, transparent is returned.
+     */
+    public final int getDescriptionViewTextColor() {
+        return mDescriptionViewTextColor;
+    }
+    /**
+     * Sets the background color of the dots. If not set, the default color from attr
+     * {@link R.styleable#PagingIndicator_dotBgColor} in the theme will be used.
+     * @param color the color to use for dot backgrounds
+     */
+    public void setDotBackgroundColor(@ColorInt int color) {
+        mDotBackgroundColor = color;
+        mDotBackgroundColorSet = true;
+        if (mPageIndicator != null) {
+            mPageIndicator.setDotBackgroundColor(color);
+        }
+    }
+
+    /**
+     * Returns the background color of the dot if it's set through
+     * {@link #setDotBackgroundColor(int)}. If no color was set, transparent is returned.
+     */
+    public final int getDotBackgroundColor() {
+        return mDotBackgroundColor;
+    }
+
+    /**
+     * Sets the background color of the arrow. If not set, the default color from attr
+     * {@link R.styleable#PagingIndicator_arrowBgColor} in the theme will be used.
+     * @param color the color to use for arrow background
+     */
+    public void setArrowBackgroundColor(@ColorInt int color) {
+        mArrowBackgroundColor = color;
+        mArrowBackgroundColorSet = true;
+        if (mPageIndicator != null) {
+            mPageIndicator.setArrowBackgroundColor(color);
+        }
+    }
+
+    /**
+     * Returns the background color of the arrow if it's set through
+     * {@link #setArrowBackgroundColor(int)}. If no color was set, transparent is returned.
+     */
+    public final int getArrowBackgroundColor() {
+        return mArrowBackgroundColor;
     }
 
     /**
@@ -414,7 +552,8 @@
                 @Override
                 public void onAnimationEnd(Animator animation) {
                     if (context != null) {
-                        startEnterAnimation();
+                        mLogoAnimationFinished = true;
+                        onLogoAnimationFinished();
                     }
                 }
             });
@@ -435,7 +574,12 @@
         return null;
     }
 
-    private void initializeViews(View container) {
+
+    /**
+     * Hides the logo view and makes other fragment views visible. Also initializes the texts for
+     * Title and Description views.
+     */
+    void hideLogoView() {
         mLogoView.setVisibility(View.GONE);
 
         if (mIconResourceId != 0) {
@@ -443,6 +587,7 @@
             mMainIconView.setVisibility(View.VISIBLE);
         }
 
+        View container = getView();
         // Create custom views.
         LayoutInflater inflater = getThemeInflater(LayoutInflater.from(
                 getContext()));
@@ -481,20 +626,35 @@
         // Header views.
         mTitleView.setText(getPageTitle(mCurrentPageIndex));
         mDescriptionView.setText(getPageDescription(mCurrentPageIndex));
-        onLogoAnimationFinished();
     }
 
     /**
-     * Called immediately after fragment views become visible. This method gives subclasses a chance
-     * to initialize themselves. If a logo animation is specified, calling this method is delayed
-     * until after the logo animation is complete.
+     * Called immediately after the logo animation is complete or no logo animation is specified.
+     * This method can also be called when the activity is recreated, i.e. when no logo animation
+     * are performed.
+     * By default, this method will hide the logo view and start the entrance animation for this
+     * fragment.
+     * Overriding subclasses can provide their own data loading logic as to when the entrance
+     * animation should be executed.
      */
     protected void onLogoAnimationFinished() {
+        startEnterAnimation(false);
     }
 
-    void startEnterAnimation() {
-        mLogoAnimationFinished = true;
-        initializeViews(getView());
+    /**
+     * Called to start entrance transition. This can be called by subclasses when the logo animation
+     * and data loading is complete. If force flag is set to false, it will only start the animation
+     * if it's not already done yet. Otherwise, it will always start the enter animation. In both
+     * cases, the logo view will hide and the rest of fragment views become visible after this call.
+     *
+     * @param force {@code true} if enter animation has to be performed regardless of whether it's
+     *                          been done in the past, {@code false} otherwise
+     */
+    protected final void startEnterAnimation(boolean force) {
+        hideLogoView();
+        if (mEnterAnimationFinished && !force) {
+            return;
+        }
         List<Animator> animators = new ArrayList<>();
         final Context context = getContext();
         Animator animator = AnimatorInflater.loadAnimator(context,
@@ -529,6 +689,12 @@
         mAnimator = new AnimatorSet();
         mAnimator.playTogether(animators);
         mAnimator.start();
+        mAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mEnterAnimationFinished = true;
+            }
+        });
         // Search focus and give the focus to the appropriate child which has become visible.
         getView().requestFocus();
     }
@@ -552,7 +718,7 @@
     }
 
     /**
-     * Returns whether the logo enter transition is finished.
+     * Returns whether the logo enter animation is finished.
      *
      * @return {@code true} if the logo enter transition is finished, {@code false} otherwise
      */
diff --git a/v17/leanback/src/android/support/v17/leanback/app/ProgressBarManager.java b/v17/leanback/src/android/support/v17/leanback/app/ProgressBarManager.java
index c9a2b87..895ed6b 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/ProgressBarManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/ProgressBarManager.java
@@ -78,6 +78,7 @@
             mProgressBarView.setVisibility(View.INVISIBLE);
         } else if (mProgressBarView != null) {
             rootView.removeView(mProgressBarView);
+            mProgressBarView = null;
         }
 
         mHandler.removeCallbacks(runnable);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/BaseCardView.java b/v17/leanback/src/android/support/v17/leanback/widget/BaseCardView.java
index b9c4948..9ca331f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/BaseCardView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BaseCardView.java
@@ -681,6 +681,8 @@
         if (mAnim != null) {
             mAnim.cancel();
             mAnim = null;
+            // force-clear the animation, as Animation#cancel() doesn't work prior to N,
+            // and will instead cause the animation to infinitely loop
             clearAnimation();
         }
     }
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 eb09225..6f5f366 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
@@ -250,7 +250,11 @@
      * Gets the row index of item at given index.
      */
     public final int getRowIndex(int index) {
-        return getLocation(index).row;
+        Location location = getLocation(index);
+        if (location == null) {
+            return -1;
+        }
+        return location.row;
     }
 
     /**
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 2c9f069..7ba2885 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -3464,12 +3464,14 @@
             RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) {
         ViewGroup.LayoutParams lp = host.getLayoutParams();
         if (mGrid == null || !(lp instanceof LayoutParams)) {
-            super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info);
             return;
         }
         LayoutParams glp = (LayoutParams) lp;
-        int position = glp.getViewLayoutPosition();
-        int rowIndex = mGrid.getRowIndex(position);
+        int position = glp.getViewAdapterPosition();
+        int rowIndex = position >= 0 ? mGrid.getRowIndex(position) : -1;
+        if (rowIndex < 0) {
+            return;
+        }
         int guessSpanIndex = position / mGrid.getNumRows();
         if (mOrientation == HORIZONTAL) {
             info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ImageCardView.java b/v17/leanback/src/android/support/v17/leanback/widget/ImageCardView.java
index a91a008..8f0c66e 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ImageCardView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ImageCardView.java
@@ -175,12 +175,12 @@
         boolean hasIconLeft =
                 !hasIconRight && (cardType & CARD_TYPE_FLAG_ICON_LEFT) == CARD_TYPE_FLAG_ICON_LEFT;
 
-        mImageView = (ImageView) findViewById(R.id.main_image);
+        mImageView = findViewById(R.id.main_image);
         if (mImageView.getDrawable() == null) {
             mImageView.setVisibility(View.INVISIBLE);
         }
 
-        mInfoArea = (ViewGroup) findViewById(R.id.info_field);
+        mInfoArea = findViewById(R.id.info_field);
         if (hasImageOnly) {
             removeView(mInfoArea);
             cardAttrs.recycle();
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowHoverCardView.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowHoverCardView.java
index 3ea3b04..bc4ecc1 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ListRowHoverCardView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowHoverCardView.java
@@ -42,8 +42,8 @@
         super(context, attrs, defStyle);
         LayoutInflater inflater = LayoutInflater.from(context);
         inflater.inflate(R.layout.lb_list_row_hovercard, this);
-        mTitleView = (TextView) findViewById(R.id.title);
-        mDescriptionView = (TextView) findViewById(R.id.description);
+        mTitleView = findViewById(R.id.title);
+        mDescriptionView = findViewById(R.id.description);
     }
 
     /**
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/MediaNowPlayingView.java b/v17/leanback/src/android/support/v17/leanback/widget/MediaNowPlayingView.java
index 88ae7d3..95f751b 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/MediaNowPlayingView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/MediaNowPlayingView.java
@@ -47,9 +47,9 @@
         super(context, attrs);
 
         LayoutInflater.from(context).inflate(R.layout.lb_playback_now_playing_bars, this, true);
-        mImage1 = (ImageView) findViewById(R.id.bar1);
-        mImage2 = (ImageView) findViewById(R.id.bar2);
-        mImage3 = (ImageView) findViewById(R.id.bar3);
+        mImage1 = findViewById(R.id.bar1);
+        mImage2 = findViewById(R.id.bar2);
+        mImage3 = findViewById(R.id.bar3);
 
         mImage1.setPivotY(mImage1.getDrawable().getIntrinsicHeight());
         mImage2.setPivotY(mImage2.getDrawable().getIntrinsicHeight());
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PagingIndicator.java b/v17/leanback/src/android/support/v17/leanback/widget/PagingIndicator.java
index b0bdacd..c7c801f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/PagingIndicator.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PagingIndicator.java
@@ -116,7 +116,7 @@
 
     // drawing
     @ColorInt
-    final int mDotFgSelectColor;
+    int mDotFgSelectColor;
     final Paint mBgPaint;
     final Paint mFgPaint;
     private final AnimatorSet mShowAnimator;
@@ -201,6 +201,26 @@
         }
     }
 
+    /**
+     * Set the background color of the dot. This color will take over the value set through the
+     * theme attribute.
+     *
+     * @param color the background color of the dot
+     */
+    public void setDotBackgroundColor(@ColorInt int color) {
+        mBgPaint.setColor(color);
+    }
+
+    /**
+     * Sets the background color of the arrow. This color will take over the value set through the
+     * theme attribute.
+     *
+     * @param color the background color of the arrow
+     */
+    public void setArrowBackgroundColor(@ColorInt int color) {
+        mDotFgSelectColor = color;
+    }
+
     private Animator createDotAlphaAnimator(float from, float to) {
         ObjectAnimator animator = ObjectAnimator.ofFloat(null, DOT_ALPHA, from, to);
         animator.setDuration(DURATION_ALPHA);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/RowContainerView.java b/v17/leanback/src/android/support/v17/leanback/widget/RowContainerView.java
index a329c08..b845bb7 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/RowContainerView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/RowContainerView.java
@@ -48,7 +48,7 @@
         LayoutInflater inflater = LayoutInflater.from(context);
         inflater.inflate(R.layout.lb_row_container, this);
 
-        mHeaderDock = (ViewGroup) findViewById(R.id.lb_row_container_header_dock);
+        mHeaderDock = findViewById(R.id.lb_row_container_header_dock);
         setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
index 88d0aad..7fa54e2 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
@@ -97,10 +97,11 @@
 
     @Override
     public final Location getLocation(int index) {
-        if (mLocations.size() == 0) {
+        final int indexInArray = index - mFirstIndex;
+        if (indexInArray < 0 || indexInArray >= mLocations.size()) {
             return null;
         }
-        return mLocations.get(index - mFirstIndex);
+        return mLocations.get(indexInArray);
     }
 
     @Override
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
index 90acddf..29059ba 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
@@ -106,7 +106,7 @@
                 context.getResources());
 
         setSeparator(mConstant.timeSeparator);
-        mPickerView = (ViewGroup) findViewById(R.id.picker);
+        mPickerView = findViewById(R.id.picker);
         final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
                 R.styleable.lbTimePicker);
         mIs24hFormat = attributesArray.getBoolean(R.styleable.lbTimePicker_is24HourFormat,
diff --git a/v17/leanback/tests/generatev4.py b/v17/leanback/tests/generatev4.py
index 13db043..9e4f935 100755
--- a/v17/leanback/tests/generatev4.py
+++ b/v17/leanback/tests/generatev4.py
@@ -100,7 +100,7 @@
         line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
 	line = line.replace('extends Activity', 'extends FragmentActivity')
 	line = line.replace('Activity.this.getFragmentManager', 'Activity.this.getSupportFragmentManager')
-	line = line.replace('mActivity.getFragmentManager', 'mActivity.getSupportFragmentManager')
+	line = line.replace('tivity.getFragmentManager', 'tivity.getSupportFragmentManager')
         outfile.write(line)
     file.close()
     outfile.close()
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
index 65e4b89..a08759b 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
@@ -23,10 +23,12 @@
 import static org.mockito.Mockito.verify;
 
 import android.content.Intent;
+import android.os.Build;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v17.leanback.widget.ItemBridgeAdapter;
 import android.support.v17.leanback.widget.ListRowPresenter;
 import android.support.v17.leanback.widget.Presenter;
@@ -45,8 +47,7 @@
 public class BrowseFragmentTest {
 
     static final String TAG = "BrowseFragmentTest";
-    static final long TRANSITION_LENGTH = 1000;
-    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long WAIT_TRANSIITON_TIMEOUT = 10000;
 
     @Rule
     public ActivityTestRule<BrowseFragmentTestActivity> activityTestRule =
@@ -66,6 +67,28 @@
         });
     }
 
+    void waitForEntranceTransitionFinished() {
+        PollingCheck.waitFor(WAIT_TRANSIITON_TIMEOUT, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                if (Build.VERSION.SDK_INT >= 21) {
+                    return mActivity.getBrowseTestFragment() != null
+                            && mActivity.getBrowseTestFragment().mEntranceTransitionEnded;
+                } else {
+                    // when entrance transition not supported, wait main fragment loaded.
+                    return mActivity.getBrowseTestFragment() != null
+                            && mActivity.getBrowseTestFragment().getMainFragment() != null;
+                }
+            }
+        });
+    }
+
+    void waitForHeaderTransitionFinished() {
+        View row = mActivity.getBrowseTestFragment().getRowsFragment().getRowViewHolder(
+                mActivity.getBrowseTestFragment().getSelectedPosition()).view;
+        PollingCheck.waitFor(WAIT_TRANSIITON_TIMEOUT, new PollingCheck.ViewStableOnScreen(row));
+    }
+
     @Test
     public void testTwoBackKeysWithBackStack() throws Throwable {
         final long dataLoadingDelay = 1000;
@@ -74,11 +97,11 @@
         intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         assertNotNull(mActivity.getBrowseTestFragment().getMainFragment());
         sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
+        waitForHeaderTransitionFinished();
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
@@ -90,11 +113,11 @@
         intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         assertNotNull(mActivity.getBrowseTestFragment().getMainFragment());
         sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
+        waitForHeaderTransitionFinished();
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
@@ -120,7 +143,7 @@
         intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         Presenter.ViewHolderTask itemTask = Mockito.spy(
                 new ItemSelectionTask(mActivity, selectRow));
@@ -159,7 +182,7 @@
         intent.putExtra(BrowseFragmentTestActivity.EXTRA_SET_ADAPTER_AFTER_DATA_LOAD, true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         InstrumentationRegistry.getInstrumentation().callActivityOnRestart(mActivity);
         activityTestRule.runOnUiThread(new Runnable() {
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
index 9778e4f..22262ee 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
@@ -26,10 +26,12 @@
 import static org.mockito.Mockito.verify;
 
 import android.content.Intent;
+import android.os.Build;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v17.leanback.widget.ItemBridgeAdapter;
 import android.support.v17.leanback.widget.ListRowPresenter;
 import android.support.v17.leanback.widget.Presenter;
@@ -48,8 +50,7 @@
 public class BrowseSupportFragmentTest {
 
     static final String TAG = "BrowseSupportFragmentTest";
-    static final long TRANSITION_LENGTH = 1000;
-    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long WAIT_TRANSIITON_TIMEOUT = 10000;
 
     @Rule
     public ActivityTestRule<BrowseSupportFragmentTestActivity> activityTestRule =
@@ -69,6 +70,28 @@
         });
     }
 
+    void waitForEntranceTransitionFinished() {
+        PollingCheck.waitFor(WAIT_TRANSIITON_TIMEOUT, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                if (Build.VERSION.SDK_INT >= 21) {
+                    return mActivity.getBrowseTestSupportFragment() != null
+                            && mActivity.getBrowseTestSupportFragment().mEntranceTransitionEnded;
+                } else {
+                    // when entrance transition not supported, wait main fragment loaded.
+                    return mActivity.getBrowseTestSupportFragment() != null
+                            && mActivity.getBrowseTestSupportFragment().getMainFragment() != null;
+                }
+            }
+        });
+    }
+
+    void waitForHeaderTransitionFinished() {
+        View row = mActivity.getBrowseTestSupportFragment().getRowsSupportFragment().getRowViewHolder(
+                mActivity.getBrowseTestSupportFragment().getSelectedPosition()).view;
+        PollingCheck.waitFor(WAIT_TRANSIITON_TIMEOUT, new PollingCheck.ViewStableOnScreen(row));
+    }
+
     @Test
     public void testTwoBackKeysWithBackStack() throws Throwable {
         final long dataLoadingDelay = 1000;
@@ -77,11 +100,11 @@
         intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         assertNotNull(mActivity.getBrowseTestSupportFragment().getMainFragment());
         sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
+        waitForHeaderTransitionFinished();
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
@@ -93,11 +116,11 @@
         intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         assertNotNull(mActivity.getBrowseTestSupportFragment().getMainFragment());
         sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
+        waitForHeaderTransitionFinished();
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
@@ -123,7 +146,7 @@
         intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         Presenter.ViewHolderTask itemTask = Mockito.spy(
                 new ItemSelectionTask(mActivity, selectRow));
@@ -162,7 +185,7 @@
         intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_SET_ADAPTER_AFTER_DATA_LOAD, true);
         mActivity = activityTestRule.launchActivity(intent);
 
-        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+        waitForEntranceTransitionFinished();
 
         InstrumentationRegistry.getInstrumentation().callActivityOnRestart(mActivity);
         activityTestRule.runOnUiThread(new Runnable() {
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
index 094fdc3..aa525ed 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
@@ -51,6 +51,8 @@
 
     int NUM_ROWS;
     int REPEAT_PER_ROW;
+    boolean mEntranceTransitionStarted;
+    boolean mEntranceTransitionEnded;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -124,6 +126,18 @@
         setAdapter(mRowsAdapter);
     }
 
+    @Override
+    protected void onEntranceTransitionStart() {
+        super.onEntranceTransitionStart();
+        mEntranceTransitionStarted = true;
+    }
+
+    @Override
+    protected void onEntranceTransitionEnd() {
+        super.onEntranceTransitionEnd();
+        mEntranceTransitionEnded = true;
+    }
+
     private void loadData() {
         for (int i = 0; i < NUM_ROWS; ++i) {
             ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(sCardPresenter);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
index 95dfc09..a0c8e25 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
@@ -54,6 +54,8 @@
 
     int NUM_ROWS;
     int REPEAT_PER_ROW;
+    boolean mEntranceTransitionStarted;
+    boolean mEntranceTransitionEnded;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -127,6 +129,18 @@
         setAdapter(mRowsAdapter);
     }
 
+    @Override
+    protected void onEntranceTransitionStart() {
+        super.onEntranceTransitionStart();
+        mEntranceTransitionStarted = true;
+    }
+
+    @Override
+    protected void onEntranceTransitionEnd() {
+        super.onEntranceTransitionEnd();
+        mEntranceTransitionEnded = true;
+    }
+
     private void loadData() {
         for (int i = 0; i < NUM_ROWS; ++i) {
             ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(sCardPresenter);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java
index b92e518..2c361f4 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java
@@ -37,6 +37,7 @@
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.graphics.FitWidthBitmapDrawable;
 import android.support.v17.leanback.media.MediaPlayerGlue;
+import android.support.v17.leanback.media.PlaybackGlueHost;
 import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.util.StateMachine;
@@ -116,12 +117,13 @@
 
     @Test
     public void parallaxSetupTest() {
-        launchAndWaitActivity(DetailsFragmentTest.DetailsFragmentParallax.class,
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentTest.DetailsFragmentParallax.class,
                 new SingleFragmentTestBase.Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         double delta = 0.0002;
-        DetailsParallax dpm = ((DetailsFragment) mActivity.getTestFragment()).getParallax();
+        DetailsParallax dpm = ((DetailsFragment) activity.getTestFragment()).getParallax();
 
         RecyclerViewParallax.ChildPositionProperty frameTop =
                 (RecyclerViewParallax.ChildPositionProperty) dpm.getOverviewRowTop();
@@ -137,12 +139,12 @@
 
     @Test
     public void parallaxTest() throws Throwable {
-        launchAndWaitActivity(DetailsFragmentParallax.class,
+        SingleFragmentTestActivity activity = launchAndWaitActivity(DetailsFragmentParallax.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsFragmentParallax detailsFragment =
-                (DetailsFragmentParallax) mActivity.getTestFragment();
+                (DetailsFragmentParallax) activity.getTestFragment();
         DetailsParallaxDrawable drawable =
                 detailsFragment.getParallaxDrawable();
         final FitWidthBitmapDrawable bitmapDrawable = (FitWidthBitmapDrawable)
@@ -162,8 +164,8 @@
         final int windowWidth = verticalGridView.getWidth();
         // make sure background manager attached to window is same size as VerticalGridView
         // i.e. no status bar.
-        assertEquals(windowHeight, mActivity.getWindow().getDecorView().getHeight());
-        assertEquals(windowWidth, mActivity.getWindow().getDecorView().getWidth());
+        assertEquals(windowHeight, activity.getWindow().getDecorView().getHeight());
+        assertEquals(windowWidth, activity.getWindow().getDecorView().getWidth());
 
         final View detailsFrame = verticalGridView.findViewById(R.id.details_frame);
 
@@ -270,12 +272,12 @@
 
     private void navigateBetweenRowsAndVideoUsingRequestFocusInternal(Class cls)
             throws Throwable {
-        launchAndWaitActivity(cls,
+        SingleFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsFragmentWithVideo detailsFragment =
-                (DetailsFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsFragmentWithVideo) activity.getTestFragment();
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
             public boolean canProceed() {
@@ -333,12 +335,12 @@
     }
 
     private void navigateBetweenRowsAndVideoUsingDPADInternal(Class cls) throws Throwable {
-        launchAndWaitActivity(cls,
+        SingleFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsFragmentWithVideo detailsFragment =
-                (DetailsFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsFragmentWithVideo) activity.getTestFragment();
         // wait video playing
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -404,12 +406,12 @@
     }
 
     private void fragmentOnStartWithVideoInternal(Class cls) throws Throwable {
-        launchAndWaitActivity(cls,
+        final SingleFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsFragmentWithVideo detailsFragment =
-                (DetailsFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsFragmentWithVideo) activity.getTestFragment();
         // wait video playing
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -442,10 +444,10 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        Intent intent = new Intent(mActivity, SingleFragmentTestActivity.class);
+                        Intent intent = new Intent(activity, SingleFragmentTestActivity.class);
                         intent.putExtra(SingleFragmentTestActivity.EXTRA_FRAGMENT_NAME,
                                 EmptyFragmentClass.class.getName());
-                        mActivity.startActivity(intent);
+                        activity.startActivity(intent);
                     }
                 }
         );
@@ -470,10 +472,11 @@
 
     @Test
     public void navigateBetweenRowsAndTitle() throws Throwable {
-        launchAndWaitActivity(DetailsTestFragment.class, new Options().uiVisibility(
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsTestFragment.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsTestFragment detailsFragment =
-                (DetailsTestFragment) mActivity.getTestFragment();
+                (DetailsTestFragment) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -551,10 +554,11 @@
 
     @Test
     public void lateSetupVideo() {
-        launchAndWaitActivity(DetailsFragmentWithNoVideo.class, new Options().uiVisibility(
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentWithNoVideo.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentWithNoVideo detailsFragment =
-                (DetailsFragmentWithNoVideo) mActivity.getTestFragment();
+                (DetailsFragmentWithNoVideo) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -586,7 +590,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -627,7 +631,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue2);
                         glue2.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue2.setArtist("A Googleer");
@@ -662,11 +666,93 @@
     }
 
     @Test
+    public void sharedGlueHost() {
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentWithNoVideo.class, new Options().uiVisibility(
+                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
+        final DetailsFragmentWithNoVideo detailsFragment =
+                (DetailsFragmentWithNoVideo) activity.getTestFragment();
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                detailsFragment.setItem(new PhotoItem("Hello world", "Fake content goes here",
+                        android.support.v17.leanback.test.R.drawable.spiderman));
+            }
+        });
+
+        SystemClock.sleep(1000);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        final MediaPlayerGlue glue1 = new MediaPlayerGlue(activity);
+                        detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue1);
+                        glue1.setArtist("A Googleer");
+                        glue1.setTitle("Diving with Sharks");
+                        glue1.setMediaSource(Uri.parse(
+                                "android.resource://android.support.v17.leanback.test/raw/video"));
+                    }
+                }
+        );
+
+        // after setup Video Playback the DPAD up will navigate to Video Fragment.
+        PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return detailsFragment.mVideoFragment != null
+                        && detailsFragment.mVideoFragment.getView() != null;
+            }
+        });
+
+        final MediaPlayerGlue glue1 = (MediaPlayerGlue) detailsFragment
+                .mDetailsBackgroundController
+                .getPlaybackGlue();
+        PlaybackGlueHost playbackGlueHost = glue1.getHost();
+
+        // wait a little bit to replace with new Glue
+        SystemClock.sleep(1000);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(activity);
+                        detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue2);
+                        glue2.setArtist("A Googleer");
+                        glue2.setTitle("Diving with Sharks");
+                        glue2.setMediaSource(Uri.parse(
+                                "android.resource://android.support.v17.leanback.test/raw/video"));
+                    }
+                }
+        );
+
+        // wait for new glue to get its glue host
+        PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                MediaPlayerGlue mediaPlayerGlue = (MediaPlayerGlue) detailsFragment
+                        .mDetailsBackgroundController
+                        .getPlaybackGlue();
+                return mediaPlayerGlue != null && mediaPlayerGlue != glue1
+                        && mediaPlayerGlue.getHost() != null;
+            }
+        });
+
+        final MediaPlayerGlue glue2 = (MediaPlayerGlue) detailsFragment
+                .mDetailsBackgroundController
+                .getPlaybackGlue();
+
+        assertTrue(glue1.getHost() == null);
+        assertTrue(glue2.getHost() == playbackGlueHost);
+    }
+
+    @Test
     public void clearVideo() {
-        launchAndWaitActivity(DetailsFragmentWithNoVideo.class, new Options().uiVisibility(
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentWithNoVideo.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentWithNoVideo detailsFragment =
-                (DetailsFragmentWithNoVideo) mActivity.getTestFragment();
+                (DetailsFragmentWithNoVideo) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -695,7 +781,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -771,10 +857,11 @@
 
     @Test
     public void noInitialItem() {
-        launchAndWaitActivity(DetailsFragmentWithNoItem.class, new Options().uiVisibility(
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentWithNoItem.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentWithNoItem detailsFragment =
-                (DetailsFragmentWithNoItem) mActivity.getTestFragment();
+                (DetailsFragmentWithNoItem) activity.getTestFragment();
 
         final int recyclerViewHeight = detailsFragment.getRowsFragment().getVerticalGridView()
                 .getHeight();
@@ -822,16 +909,17 @@
 
     @Test
     public void switchToVideoInOnCreate() {
-        launchAndWaitActivity(DetailsFragmentSwitchToVideoInOnCreate.class,
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentSwitchToVideoInOnCreate.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentSwitchToVideoInOnCreate detailsFragment =
-                (DetailsFragmentSwitchToVideoInOnCreate) mActivity.getTestFragment();
+                (DetailsFragmentSwitchToVideoInOnCreate) activity.getTestFragment();
 
         // the pending enter transition flag should be automatically cleared
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTER_TRANSITION_COMPLETE.getStatus());
-        assertNull(TransitionHelper.getEnterTransition(mActivity.getWindow()));
+        assertNull(TransitionHelper.getEnterTransition(activity.getWindow()));
         assertEquals(0, getCoverDrawableAlpha(detailsFragment.mDetailsBackgroundController));
         assertTrue(detailsFragment.getRowsFragment().getView().hasFocus());
         //SystemClock.sleep(5000);
@@ -843,7 +931,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -915,16 +1003,17 @@
 
     @Test
     public void switchToVideoBackToQuit() {
-        launchAndWaitActivity(DetailsFragmentSwitchToVideoInOnCreate.class,
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentSwitchToVideoInOnCreate.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentSwitchToVideoInOnCreate detailsFragment =
-                (DetailsFragmentSwitchToVideoInOnCreate) mActivity.getTestFragment();
+                (DetailsFragmentSwitchToVideoInOnCreate) activity.getTestFragment();
 
         // the pending enter transition flag should be automatically cleared
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTER_TRANSITION_COMPLETE.getStatus());
-        assertNull(TransitionHelper.getEnterTransition(mActivity.getWindow()));
+        assertNull(TransitionHelper.getEnterTransition(activity.getWindow()));
         assertEquals(0, getCoverDrawableAlpha(detailsFragment.mDetailsBackgroundController));
         assertTrue(detailsFragment.getRowsFragment().getView().hasFocus());
         assertFalse(detailsFragment.isShowingTitle());
@@ -935,7 +1024,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -964,7 +1053,7 @@
 
         // before any details row is presented, pressing BACK will quit the activity
         sendKeys(KeyEvent.KEYCODE_BACK);
-        PollingCheck.waitFor(4000, new PollingCheck.ActivityDestroy(mActivity));
+        PollingCheck.waitFor(4000, new PollingCheck.ActivityDestroy(activity));
     }
 
     public static class DetailsFragmentSwitchToVideoAndPrepareEntranceTransition
@@ -1007,12 +1096,13 @@
 
     @Test
     public void switchToVideoInOnCreateAndPrepareEntranceTransition() {
-        launchAndWaitActivity(DetailsFragmentSwitchToVideoAndPrepareEntranceTransition.class,
+        SingleFragmentTestActivity activity = launchAndWaitActivity(
+                DetailsFragmentSwitchToVideoAndPrepareEntranceTransition.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentSwitchToVideoAndPrepareEntranceTransition detailsFragment =
                 (DetailsFragmentSwitchToVideoAndPrepareEntranceTransition)
-                        mActivity.getTestFragment();
+                        activity.getTestFragment();
 
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTRANCE_COMPLETE.getStatus());
@@ -1052,12 +1142,13 @@
 
     @Test
     public void entranceTransitionBlocksSwitchToVideo() {
-        launchAndWaitActivity(DetailsFragmentEntranceTransition.class,
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsFragmentEntranceTransition.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsFragmentEntranceTransition detailsFragment =
                 (DetailsFragmentEntranceTransition)
-                        mActivity.getTestFragment();
+                        activity.getTestFragment();
 
         if (Build.VERSION.SDK_INT < 21) {
             // when enter transition is not supported, mCanUseHost is immmediately true
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
index 2b4a2d9..b4322ec 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
@@ -40,6 +40,7 @@
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.graphics.FitWidthBitmapDrawable;
 import android.support.v17.leanback.media.MediaPlayerGlue;
+import android.support.v17.leanback.media.PlaybackGlueHost;
 import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.util.StateMachine;
@@ -119,12 +120,13 @@
 
     @Test
     public void parallaxSetupTest() {
-        launchAndWaitActivity(DetailsSupportFragmentTest.DetailsSupportFragmentParallax.class,
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentTest.DetailsSupportFragmentParallax.class,
                 new SingleSupportFragmentTestBase.Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         double delta = 0.0002;
-        DetailsParallax dpm = ((DetailsSupportFragment) mActivity.getTestFragment()).getParallax();
+        DetailsParallax dpm = ((DetailsSupportFragment) activity.getTestFragment()).getParallax();
 
         RecyclerViewParallax.ChildPositionProperty frameTop =
                 (RecyclerViewParallax.ChildPositionProperty) dpm.getOverviewRowTop();
@@ -140,12 +142,12 @@
 
     @Test
     public void parallaxTest() throws Throwable {
-        launchAndWaitActivity(DetailsSupportFragmentParallax.class,
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(DetailsSupportFragmentParallax.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsSupportFragmentParallax detailsFragment =
-                (DetailsSupportFragmentParallax) mActivity.getTestFragment();
+                (DetailsSupportFragmentParallax) activity.getTestFragment();
         DetailsParallaxDrawable drawable =
                 detailsFragment.getParallaxDrawable();
         final FitWidthBitmapDrawable bitmapDrawable = (FitWidthBitmapDrawable)
@@ -165,8 +167,8 @@
         final int windowWidth = verticalGridView.getWidth();
         // make sure background manager attached to window is same size as VerticalGridView
         // i.e. no status bar.
-        assertEquals(windowHeight, mActivity.getWindow().getDecorView().getHeight());
-        assertEquals(windowWidth, mActivity.getWindow().getDecorView().getWidth());
+        assertEquals(windowHeight, activity.getWindow().getDecorView().getHeight());
+        assertEquals(windowWidth, activity.getWindow().getDecorView().getWidth());
 
         final View detailsFrame = verticalGridView.findViewById(R.id.details_frame);
 
@@ -273,12 +275,12 @@
 
     private void navigateBetweenRowsAndVideoUsingRequestFocusInternal(Class cls)
             throws Throwable {
-        launchAndWaitActivity(cls,
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsSupportFragmentWithVideo detailsFragment =
-                (DetailsSupportFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithVideo) activity.getTestFragment();
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
             public boolean canProceed() {
@@ -336,12 +338,12 @@
     }
 
     private void navigateBetweenRowsAndVideoUsingDPADInternal(Class cls) throws Throwable {
-        launchAndWaitActivity(cls,
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsSupportFragmentWithVideo detailsFragment =
-                (DetailsSupportFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithVideo) activity.getTestFragment();
         // wait video playing
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -407,12 +409,12 @@
     }
 
     private void fragmentOnStartWithVideoInternal(Class cls) throws Throwable {
-        launchAndWaitActivity(cls,
+        final SingleSupportFragmentTestActivity activity = launchAndWaitActivity(cls,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
 
         final DetailsSupportFragmentWithVideo detailsFragment =
-                (DetailsSupportFragmentWithVideo) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithVideo) activity.getTestFragment();
         // wait video playing
         PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -445,10 +447,10 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        Intent intent = new Intent(mActivity, SingleSupportFragmentTestActivity.class);
+                        Intent intent = new Intent(activity, SingleSupportFragmentTestActivity.class);
                         intent.putExtra(SingleSupportFragmentTestActivity.EXTRA_FRAGMENT_NAME,
                                 EmptyFragmentClass.class.getName());
-                        mActivity.startActivity(intent);
+                        activity.startActivity(intent);
                     }
                 }
         );
@@ -473,10 +475,11 @@
 
     @Test
     public void navigateBetweenRowsAndTitle() throws Throwable {
-        launchAndWaitActivity(DetailsTestSupportFragment.class, new Options().uiVisibility(
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsTestSupportFragment.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsTestSupportFragment detailsFragment =
-                (DetailsTestSupportFragment) mActivity.getTestFragment();
+                (DetailsTestSupportFragment) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -554,10 +557,11 @@
 
     @Test
     public void lateSetupVideo() {
-        launchAndWaitActivity(DetailsSupportFragmentWithNoVideo.class, new Options().uiVisibility(
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentWithNoVideo.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentWithNoVideo detailsFragment =
-                (DetailsSupportFragmentWithNoVideo) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithNoVideo) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -589,7 +593,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -630,7 +634,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue2);
                         glue2.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue2.setArtist("A Googleer");
@@ -665,11 +669,93 @@
     }
 
     @Test
+    public void sharedGlueHost() {
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentWithNoVideo.class, new Options().uiVisibility(
+                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
+        final DetailsSupportFragmentWithNoVideo detailsFragment =
+                (DetailsSupportFragmentWithNoVideo) activity.getTestFragment();
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                detailsFragment.setItem(new PhotoItem("Hello world", "Fake content goes here",
+                        android.support.v17.leanback.test.R.drawable.spiderman));
+            }
+        });
+
+        SystemClock.sleep(1000);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        final MediaPlayerGlue glue1 = new MediaPlayerGlue(activity);
+                        detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue1);
+                        glue1.setArtist("A Googleer");
+                        glue1.setTitle("Diving with Sharks");
+                        glue1.setMediaSource(Uri.parse(
+                                "android.resource://android.support.v17.leanback.test/raw/video"));
+                    }
+                }
+        );
+
+        // after setup Video Playback the DPAD up will navigate to Video Fragment.
+        PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return detailsFragment.mVideoSupportFragment != null
+                        && detailsFragment.mVideoSupportFragment.getView() != null;
+            }
+        });
+
+        final MediaPlayerGlue glue1 = (MediaPlayerGlue) detailsFragment
+                .mDetailsBackgroundController
+                .getPlaybackGlue();
+        PlaybackGlueHost playbackGlueHost = glue1.getHost();
+
+        // wait a little bit to replace with new Glue
+        SystemClock.sleep(1000);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        final MediaPlayerGlue glue2 = new MediaPlayerGlue(activity);
+                        detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue2);
+                        glue2.setArtist("A Googleer");
+                        glue2.setTitle("Diving with Sharks");
+                        glue2.setMediaSource(Uri.parse(
+                                "android.resource://android.support.v17.leanback.test/raw/video"));
+                    }
+                }
+        );
+
+        // wait for new glue to get its glue host
+        PollingCheck.waitFor(4000, new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                MediaPlayerGlue mediaPlayerGlue = (MediaPlayerGlue) detailsFragment
+                        .mDetailsBackgroundController
+                        .getPlaybackGlue();
+                return mediaPlayerGlue != null && mediaPlayerGlue != glue1
+                        && mediaPlayerGlue.getHost() != null;
+            }
+        });
+
+        final MediaPlayerGlue glue2 = (MediaPlayerGlue) detailsFragment
+                .mDetailsBackgroundController
+                .getPlaybackGlue();
+
+        assertTrue(glue1.getHost() == null);
+        assertTrue(glue2.getHost() == playbackGlueHost);
+    }
+
+    @Test
     public void clearVideo() {
-        launchAndWaitActivity(DetailsSupportFragmentWithNoVideo.class, new Options().uiVisibility(
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentWithNoVideo.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentWithNoVideo detailsFragment =
-                (DetailsSupportFragmentWithNoVideo) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithNoVideo) activity.getTestFragment();
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -698,7 +784,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -774,10 +860,11 @@
 
     @Test
     public void noInitialItem() {
-        launchAndWaitActivity(DetailsSupportFragmentWithNoItem.class, new Options().uiVisibility(
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentWithNoItem.class, new Options().uiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentWithNoItem detailsFragment =
-                (DetailsSupportFragmentWithNoItem) mActivity.getTestFragment();
+                (DetailsSupportFragmentWithNoItem) activity.getTestFragment();
 
         final int recyclerViewHeight = detailsFragment.getRowsSupportFragment().getVerticalGridView()
                 .getHeight();
@@ -825,16 +912,17 @@
 
     @Test
     public void switchToVideoInOnCreate() {
-        launchAndWaitActivity(DetailsSupportFragmentSwitchToVideoInOnCreate.class,
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentSwitchToVideoInOnCreate.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentSwitchToVideoInOnCreate detailsFragment =
-                (DetailsSupportFragmentSwitchToVideoInOnCreate) mActivity.getTestFragment();
+                (DetailsSupportFragmentSwitchToVideoInOnCreate) activity.getTestFragment();
 
         // the pending enter transition flag should be automatically cleared
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTER_TRANSITION_COMPLETE.getStatus());
-        assertNull(TransitionHelper.getEnterTransition(mActivity.getWindow()));
+        assertNull(TransitionHelper.getEnterTransition(activity.getWindow()));
         assertEquals(0, getCoverDrawableAlpha(detailsFragment.mDetailsBackgroundController));
         assertTrue(detailsFragment.getRowsSupportFragment().getView().hasFocus());
         //SystemClock.sleep(5000);
@@ -846,7 +934,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -918,16 +1006,17 @@
 
     @Test
     public void switchToVideoBackToQuit() {
-        launchAndWaitActivity(DetailsSupportFragmentSwitchToVideoInOnCreate.class,
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentSwitchToVideoInOnCreate.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentSwitchToVideoInOnCreate detailsFragment =
-                (DetailsSupportFragmentSwitchToVideoInOnCreate) mActivity.getTestFragment();
+                (DetailsSupportFragmentSwitchToVideoInOnCreate) activity.getTestFragment();
 
         // the pending enter transition flag should be automatically cleared
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTER_TRANSITION_COMPLETE.getStatus());
-        assertNull(TransitionHelper.getEnterTransition(mActivity.getWindow()));
+        assertNull(TransitionHelper.getEnterTransition(activity.getWindow()));
         assertEquals(0, getCoverDrawableAlpha(detailsFragment.mDetailsBackgroundController));
         assertTrue(detailsFragment.getRowsSupportFragment().getView().hasFocus());
         assertFalse(detailsFragment.isShowingTitle());
@@ -938,7 +1027,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        final MediaPlayerGlue glue = new MediaPlayerGlue(mActivity);
+                        final MediaPlayerGlue glue = new MediaPlayerGlue(activity);
                         detailsFragment.mDetailsBackgroundController.setupVideoPlayback(glue);
                         glue.setMode(MediaPlayerGlue.REPEAT_ALL);
                         glue.setArtist("A Googleer");
@@ -967,7 +1056,7 @@
 
         // before any details row is presented, pressing BACK will quit the activity
         sendKeys(KeyEvent.KEYCODE_BACK);
-        PollingCheck.waitFor(4000, new PollingCheck.ActivityDestroy(mActivity));
+        PollingCheck.waitFor(4000, new PollingCheck.ActivityDestroy(activity));
     }
 
     public static class DetailsSupportFragmentSwitchToVideoAndPrepareEntranceTransition
@@ -1010,12 +1099,13 @@
 
     @Test
     public void switchToVideoInOnCreateAndPrepareEntranceTransition() {
-        launchAndWaitActivity(DetailsSupportFragmentSwitchToVideoAndPrepareEntranceTransition.class,
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(
+                DetailsSupportFragmentSwitchToVideoAndPrepareEntranceTransition.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentSwitchToVideoAndPrepareEntranceTransition detailsFragment =
                 (DetailsSupportFragmentSwitchToVideoAndPrepareEntranceTransition)
-                        mActivity.getTestFragment();
+                        activity.getTestFragment();
 
         assertEquals(StateMachine.STATUS_INVOKED,
                 detailsFragment.STATE_ENTRANCE_COMPLETE.getStatus());
@@ -1055,12 +1145,13 @@
 
     @Test
     public void entranceTransitionBlocksSwitchToVideo() {
-        launchAndWaitActivity(DetailsSupportFragmentEntranceTransition.class,
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(DetailsSupportFragmentEntranceTransition.class,
                 new Options().uiVisibility(
                         View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN), 0);
         final DetailsSupportFragmentEntranceTransition detailsFragment =
                 (DetailsSupportFragmentEntranceTransition)
-                        mActivity.getTestFragment();
+                        activity.getTestFragment();
 
         if (Build.VERSION.SDK_INT < 21) {
             // when enter transition is not supported, mCanUseHost is immmediately true
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java
index 7b64e0b..9dd8a49 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java
@@ -59,9 +59,9 @@
 
     @Test
     public void defaultScale() {
-        launchAndWaitActivity(F_defaultScale.class, 1000);
+        SingleFragmentTestActivity activity = launchAndWaitActivity(F_defaultScale.class, 1000);
 
-        final VerticalGridView gridView = ((HeadersFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((HeadersFragment) activity.getTestFragment())
                 .getVerticalGridView();
         ItemBridgeAdapter.ViewHolder vh = (ItemBridgeAdapter.ViewHolder)
                 gridView.findViewHolderForAdapterPosition(0);
@@ -87,9 +87,9 @@
 
     @Test
     public void disableScale() {
-        launchAndWaitActivity(F_disableScale.class, 1000);
+        SingleFragmentTestActivity activity = launchAndWaitActivity(F_disableScale.class, 1000);
 
-        final VerticalGridView gridView = ((HeadersFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((HeadersFragment) activity.getTestFragment())
                 .getVerticalGridView();
         ItemBridgeAdapter.ViewHolder vh = (ItemBridgeAdapter.ViewHolder)
                 gridView.findViewHolderForAdapterPosition(0);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
index f545572..b8f7cc8 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
@@ -62,9 +62,9 @@
 
     @Test
     public void defaultScale() {
-        launchAndWaitActivity(F_defaultScale.class, 1000);
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(F_defaultScale.class, 1000);
 
-        final VerticalGridView gridView = ((HeadersSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((HeadersSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         ItemBridgeAdapter.ViewHolder vh = (ItemBridgeAdapter.ViewHolder)
                 gridView.findViewHolderForAdapterPosition(0);
@@ -90,9 +90,9 @@
 
     @Test
     public void disableScale() {
-        launchAndWaitActivity(F_disableScale.class, 1000);
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(F_disableScale.class, 1000);
 
-        final VerticalGridView gridView = ((HeadersSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((HeadersSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         ItemBridgeAdapter.ViewHolder vh = (ItemBridgeAdapter.ViewHolder)
                 gridView.findViewHolderForAdapterPosition(0);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
index d29feb1..6353ef9 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
@@ -60,13 +60,14 @@
 
     @Test
     public void testDetachCalledWhenDestroyFragment() throws Throwable {
-        launchAndWaitActivity(PlaybackTestFragment.class, 1000);
-        final PlaybackTestFragment fragment = (PlaybackTestFragment) mActivity.getTestFragment();
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestFragment.class, 1000);
+        final PlaybackTestFragment fragment = (PlaybackTestFragment) activity.getTestFragment();
         PlaybackGlue glue = fragment.getGlue();
         activityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                mActivity.finish();
+                activity.finish();
             }
         });
         PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
@@ -80,8 +81,9 @@
 
     @Test
     public void testSelectedListener() throws Throwable {
-        launchAndWaitActivity(PlaybackTestFragment.class, 1000);
-        PlaybackTestFragment fragment = (PlaybackTestFragment) mActivity.getTestFragment();
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestFragment.class, 1000);
+        PlaybackTestFragment fragment = (PlaybackTestFragment) activity.getTestFragment();
 
         assertTrue(fragment.getView().hasFocus());
 
@@ -147,8 +149,9 @@
 
     @Test
     public void testClickedListener() throws Throwable {
-        launchAndWaitActivity(PlaybackTestFragment.class, 1000);
-        PlaybackTestFragment fragment = (PlaybackTestFragment) mActivity.getTestFragment();
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestFragment.class, 1000);
+        PlaybackTestFragment fragment = (PlaybackTestFragment) activity.getTestFragment();
 
         assertTrue(fragment.getView().hasFocus());
 
@@ -229,8 +232,9 @@
     @Suppress
     @Test
     public void alignmentRowToBottom() throws Throwable {
-        launchAndWaitActivity(PlaybackTestFragment.class, 1000);
-        final PlaybackTestFragment fragment = (PlaybackTestFragment) mActivity.getTestFragment();
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestFragment.class, 1000);
+        final PlaybackTestFragment fragment = (PlaybackTestFragment) activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() > 2);
 
@@ -279,9 +283,10 @@
 
     @Test
     public void setupRowAndPresenterWithoutGlue() {
-        launchAndWaitActivity(PurePlaybackFragment.class, 1000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PurePlaybackFragment.class, 1000);
         final PurePlaybackFragment fragment = (PurePlaybackFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() == 1);
         View playRow = fragment.getVerticalGridView().getChildAt(0);
@@ -350,9 +355,10 @@
 
     @Test
     public void setupWithControlGlue() throws Throwable {
-        launchAndWaitActivity(ControlGlueFragment.class, 1000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(ControlGlueFragment.class, 1000);
         final ControlGlueFragment fragment = (ControlGlueFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() == 1);
 
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackOverlayFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackOverlayFragmentTest.java
index 08fa838..f21bd04 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackOverlayFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackOverlayFragmentTest.java
@@ -36,12 +36,13 @@
 
     @Test
     public void workaroundVideoViewStealFocus() {
-        launchAndWaitActivity(PlaybackOverlayTestFragment.class,
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackOverlayTestFragment.class,
                 new Options().activityLayoutId(R.layout.playback_controls_with_video), 0);
         PlaybackOverlayTestFragment fragment = (PlaybackOverlayTestFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
-        assertFalse(mActivity.findViewById(R.id.videoView).hasFocus());
+        assertFalse(activity.findViewById(R.id.videoView).hasFocus());
         assertTrue(fragment.getView().hasFocus());
     }
 
@@ -49,10 +50,11 @@
     @Suppress
     @Test
     public void alignmentRowToBottom() throws Throwable {
-        launchAndWaitActivity(PlaybackOverlayTestFragment.class,
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackOverlayTestFragment.class,
                 new Options().activityLayoutId(R.layout.playback_controls_with_video), 0);
         final PlaybackOverlayTestFragment fragment = (PlaybackOverlayTestFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() > 2);
 
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
index eb8bd65..cbc8222 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
@@ -63,13 +63,14 @@
 
     @Test
     public void testDetachCalledWhenDestroyFragment() throws Throwable {
-        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
-        final PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
+        final PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) activity.getTestFragment();
         PlaybackGlue glue = fragment.getGlue();
         activityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                mActivity.finish();
+                activity.finish();
             }
         });
         PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
@@ -83,8 +84,9 @@
 
     @Test
     public void testSelectedListener() throws Throwable {
-        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
-        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
+        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) activity.getTestFragment();
 
         assertTrue(fragment.getView().hasFocus());
 
@@ -150,8 +152,9 @@
 
     @Test
     public void testClickedListener() throws Throwable {
-        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
-        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
+        PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) activity.getTestFragment();
 
         assertTrue(fragment.getView().hasFocus());
 
@@ -232,8 +235,9 @@
     @Suppress
     @Test
     public void alignmentRowToBottom() throws Throwable {
-        launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
-        final PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) mActivity.getTestFragment();
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(PlaybackTestSupportFragment.class, 1000);
+        final PlaybackTestSupportFragment fragment = (PlaybackTestSupportFragment) activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() > 2);
 
@@ -282,9 +286,10 @@
 
     @Test
     public void setupRowAndPresenterWithoutGlue() {
-        launchAndWaitActivity(PurePlaybackSupportFragment.class, 1000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(PurePlaybackSupportFragment.class, 1000);
         final PurePlaybackSupportFragment fragment = (PurePlaybackSupportFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() == 1);
         View playRow = fragment.getVerticalGridView().getChildAt(0);
@@ -353,9 +358,10 @@
 
     @Test
     public void setupWithControlGlue() throws Throwable {
-        launchAndWaitActivity(ControlGlueFragment.class, 1000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(ControlGlueFragment.class, 1000);
         final ControlGlueFragment fragment = (ControlGlueFragment)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         assertTrue(fragment.getAdapter().size() == 1);
 
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
new file mode 100644
index 0000000..2daba66
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 static org.junit.Assert.assertSame;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.v17.leanback.testutils.PollingCheck;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import org.junit.Before;
+import org.junit.Test;
+
+@SmallTest
+public class ProgressBarManagerTest {
+
+    Context mContext;
+    ProgressBarManager mProgressBarManager;
+    long mWaitShownTimeOutMs;
+    long mWaitHideTimeOutMs;
+
+    @Before
+    public void setUp() {
+        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager = new ProgressBarManager();
+            }
+        });
+        mWaitShownTimeOutMs = Math.max(2000, mProgressBarManager.getInitialDelay() * 3);
+        mWaitHideTimeOutMs = 2000;
+    }
+
+    @Test
+    public void defaultProgressBarView() {
+        final ViewGroup rootView = new FrameLayout(mContext);
+        mProgressBarManager.setRootView(rootView);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.show();
+            }
+        });
+        PollingCheck.waitFor(mWaitShownTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        if (rootView.getChildCount() == 0) return false;
+                        return  rootView.getChildAt(0).getVisibility() == View.VISIBLE;
+                    }
+                });
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.hide();
+            }
+        });
+        PollingCheck.waitFor(mWaitHideTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        return rootView.getChildCount() == 0;
+                    }
+                });
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.show();
+            }
+        });
+        PollingCheck.waitFor(mWaitShownTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        if (rootView.getChildCount() == 0) return false;
+                        return  rootView.getChildAt(0).getVisibility() == View.VISIBLE;
+                    }
+                });
+    }
+
+    @Test
+    public void customProgressBarView() {
+        final ViewGroup rootView = new FrameLayout(mContext);
+        View customProgressBar = new View(mContext);
+        rootView.addView(customProgressBar, 100, 100);
+        mProgressBarManager.setProgressBarView(customProgressBar);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.show();
+            }
+        });
+        PollingCheck.waitFor(mWaitShownTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        if (rootView.getChildCount() == 0) return false;
+                        return  rootView.getChildAt(0).getVisibility() == View.VISIBLE;
+                    }
+                });
+        assertSame(customProgressBar, rootView.getChildAt(0));
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.hide();
+            }
+        });
+        PollingCheck.waitFor(mWaitHideTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        return  rootView.getChildAt(0).getVisibility() != View.VISIBLE;
+                    }
+                });
+        assertSame(customProgressBar, rootView.getChildAt(0));
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mProgressBarManager.show();
+            }
+        });
+        PollingCheck.waitFor(mWaitShownTimeOutMs,
+                new PollingCheck.PollingCheckCondition() {
+                    @Override
+                    public boolean canProceed() {
+                        if (rootView.getChildCount() == 0) return false;
+                        return  rootView.getChildAt(0).getVisibility() == View.VISIBLE;
+                    }
+                });
+    }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java
index 1293530..b379766 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java
@@ -84,11 +84,11 @@
 
     @Test
     public void defaultAlignment() throws InterruptedException {
-        launchAndWaitActivity(F_defaultAlignment.class, 1000);
+        SingleFragmentTestActivity activity = launchAndWaitActivity(F_defaultAlignment.class, 1000);
 
         final Rect rect = new Rect();
 
-        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsFragment) activity.getTestFragment())
                 .getVerticalGridView();
         View row0 = gridView.findViewHolderForAdapterPosition(0).itemView;
         rect.set(0, 0, row0.getWidth(), row0.getHeight());
@@ -129,9 +129,10 @@
 
     @Test
     public void selectBeforeSetAdapter() throws InterruptedException {
-        launchAndWaitActivity(F_selectBeforeSetAdapter.class, 2000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectBeforeSetAdapter.class, 2000);
 
-        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -162,9 +163,10 @@
 
     @Test
     public void selectBeforeAddData() throws InterruptedException {
-        launchAndWaitActivity(F_selectBeforeAddData.class, 2000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectBeforeAddData.class, 2000);
 
-        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -189,9 +191,10 @@
 
     @Test
     public void selectAfterAddData() throws InterruptedException {
-        launchAndWaitActivity(F_selectAfterAddData.class, 2000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectAfterAddData.class, 2000);
 
-        final VerticalGridView gridView = ((RowsFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -219,13 +222,14 @@
 
     @Test
     public void restoreSelection() {
-        launchAndWaitActivity(F_restoreSelection.class, 1000);
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(F_restoreSelection.class, 1000);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(
                 new Runnable() {
                     @Override
                     public void run() {
-                        mActivity.recreate();
+                        activity.recreate();
                     }
                 }
         );
@@ -261,9 +265,10 @@
 
     @Test
     public void prefetchChildItemsBeforeAttach() throws Throwable {
-        launchAndWaitActivity(F_ListRowWithOnClick.class, 1000);
+        SingleFragmentTestActivity activity =
+                launchAndWaitActivity(F_ListRowWithOnClick.class, 1000);
 
-        F_ListRowWithOnClick fragment = (F_ListRowWithOnClick) mActivity.getTestFragment();
+        F_ListRowWithOnClick fragment = (F_ListRowWithOnClick) activity.getTestFragment();
         final VerticalGridView gridView = fragment.getVerticalGridView();
         View lastRow = gridView.getChildAt(gridView.getChildCount() - 1);
         final int lastRowPos = gridView.getChildAdapterPosition(lastRow);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
index 46526d0..a8c0b73 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
@@ -87,11 +87,11 @@
 
     @Test
     public void defaultAlignment() throws InterruptedException {
-        launchAndWaitActivity(F_defaultAlignment.class, 1000);
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(F_defaultAlignment.class, 1000);
 
         final Rect rect = new Rect();
 
-        final VerticalGridView gridView = ((RowsSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         View row0 = gridView.findViewHolderForAdapterPosition(0).itemView;
         rect.set(0, 0, row0.getWidth(), row0.getHeight());
@@ -132,9 +132,10 @@
 
     @Test
     public void selectBeforeSetAdapter() throws InterruptedException {
-        launchAndWaitActivity(F_selectBeforeSetAdapter.class, 2000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectBeforeSetAdapter.class, 2000);
 
-        final VerticalGridView gridView = ((RowsSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -165,9 +166,10 @@
 
     @Test
     public void selectBeforeAddData() throws InterruptedException {
-        launchAndWaitActivity(F_selectBeforeAddData.class, 2000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectBeforeAddData.class, 2000);
 
-        final VerticalGridView gridView = ((RowsSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -192,9 +194,10 @@
 
     @Test
     public void selectAfterAddData() throws InterruptedException {
-        launchAndWaitActivity(F_selectAfterAddData.class, 2000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(F_selectAfterAddData.class, 2000);
 
-        final VerticalGridView gridView = ((RowsSupportFragment) mActivity.getTestFragment())
+        final VerticalGridView gridView = ((RowsSupportFragment) activity.getTestFragment())
                 .getVerticalGridView();
         assertEquals(7, gridView.getSelectedPosition());
         assertNotNull(gridView.findViewHolderForAdapterPosition(7));
@@ -222,13 +225,14 @@
 
     @Test
     public void restoreSelection() {
-        launchAndWaitActivity(F_restoreSelection.class, 1000);
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(F_restoreSelection.class, 1000);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(
                 new Runnable() {
                     @Override
                     public void run() {
-                        mActivity.recreate();
+                        activity.recreate();
                     }
                 }
         );
@@ -264,9 +268,10 @@
 
     @Test
     public void prefetchChildItemsBeforeAttach() throws Throwable {
-        launchAndWaitActivity(F_ListRowWithOnClick.class, 1000);
+        SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(F_ListRowWithOnClick.class, 1000);
 
-        F_ListRowWithOnClick fragment = (F_ListRowWithOnClick) mActivity.getTestFragment();
+        F_ListRowWithOnClick fragment = (F_ListRowWithOnClick) activity.getTestFragment();
         final VerticalGridView gridView = fragment.getVerticalGridView();
         View lastRow = gridView.getChildAt(gridView.getChildCount() - 1);
         final int lastRowPos = gridView.getChildAdapterPosition(lastRow);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java b/v17/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
index 10dc45f..b26d92d 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
@@ -19,18 +19,14 @@
 import android.os.SystemClock;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
-import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 
-import org.junit.After;
 import org.junit.Rule;
 import org.junit.rules.TestName;
 
 public class SingleFragmentTestBase {
 
     private static final long WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS = 60000;
-    private static final String TAG = "SingleFragmentTestBase";
 
     @Rule
     public TestName mUnitTestName = new TestName();
@@ -39,24 +35,6 @@
     public ActivityTestRule<SingleFragmentTestActivity> activityTestRule =
             new ActivityTestRule<>(SingleFragmentTestActivity.class, false, false);
 
-    protected SingleFragmentTestActivity mActivity;
-
-    @After
-    public void afterTest() throws Throwable {
-        final SingleFragmentTestActivity activity = mActivity;
-        if (activity != null) {
-            Log.d(TAG, "wait finish " + activity + " for " + this);
-            mActivity = null;
-            activityTestRule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    activity.finish();
-                }
-            });
-            PollingCheck.waitFor(new PollingCheck.ActivityDestroy(activity));
-        }
-    }
-
     public void sendKeys(int ...keys) {
         for (int i = 0; i < keys.length; i++) {
             InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
@@ -94,23 +72,25 @@
         }
     }
 
-    public void launchAndWaitActivity(Class fragmentClass, long waitTimeMs) {
-        launchAndWaitActivity(fragmentClass.getName(), null, waitTimeMs);
+    public SingleFragmentTestActivity launchAndWaitActivity(Class fragmentClass, long waitTimeMs) {
+        return launchAndWaitActivity(fragmentClass.getName(), null, waitTimeMs);
     }
 
-    public void launchAndWaitActivity(Class fragmentClass, Options options, long waitTimeMs) {
-        launchAndWaitActivity(fragmentClass.getName(), options, waitTimeMs);
+    public SingleFragmentTestActivity launchAndWaitActivity(Class fragmentClass, Options options,
+            long waitTimeMs) {
+        return launchAndWaitActivity(fragmentClass.getName(), options, waitTimeMs);
     }
 
-    public void launchAndWaitActivity(String firstFragmentName, Options options, long waitTimeMs) {
+    public SingleFragmentTestActivity launchAndWaitActivity(String firstFragmentName,
+            Options options, long waitTimeMs) {
         Intent intent = new Intent();
         intent.putExtra(SingleFragmentTestActivity.EXTRA_FRAGMENT_NAME, firstFragmentName);
         if (options != null) {
             options.collect(intent);
         }
-        mActivity = activityTestRule.launchActivity(intent);
-        Log.d(TAG, "launched " + mActivity + " for " + this, new Exception());
+        SingleFragmentTestActivity activity = activityTestRule.launchActivity(intent);
         SystemClock.sleep(waitTimeMs);
+        return activity;
     }
 
     protected void waitForScrollIdle(RecyclerView recyclerView) throws Throwable {
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java b/v17/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
index 24936f8..6c00923 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
@@ -22,18 +22,14 @@
 import android.os.SystemClock;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
-import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 
-import org.junit.After;
 import org.junit.Rule;
 import org.junit.rules.TestName;
 
 public class SingleSupportFragmentTestBase {
 
     private static final long WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS = 60000;
-    private static final String TAG = "SingleSupportFragmentTestBase";
 
     @Rule
     public TestName mUnitTestName = new TestName();
@@ -42,24 +38,6 @@
     public ActivityTestRule<SingleSupportFragmentTestActivity> activityTestRule =
             new ActivityTestRule<>(SingleSupportFragmentTestActivity.class, false, false);
 
-    protected SingleSupportFragmentTestActivity mActivity;
-
-    @After
-    public void afterTest() throws Throwable {
-        final SingleSupportFragmentTestActivity activity = mActivity;
-        if (activity != null) {
-            Log.d(TAG, "wait finish " + activity + " for " + this);
-            mActivity = null;
-            activityTestRule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    activity.finish();
-                }
-            });
-            PollingCheck.waitFor(new PollingCheck.ActivityDestroy(activity));
-        }
-    }
-
     public void sendKeys(int ...keys) {
         for (int i = 0; i < keys.length; i++) {
             InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
@@ -97,23 +75,25 @@
         }
     }
 
-    public void launchAndWaitActivity(Class fragmentClass, long waitTimeMs) {
-        launchAndWaitActivity(fragmentClass.getName(), null, waitTimeMs);
+    public SingleSupportFragmentTestActivity launchAndWaitActivity(Class fragmentClass, long waitTimeMs) {
+        return launchAndWaitActivity(fragmentClass.getName(), null, waitTimeMs);
     }
 
-    public void launchAndWaitActivity(Class fragmentClass, Options options, long waitTimeMs) {
-        launchAndWaitActivity(fragmentClass.getName(), options, waitTimeMs);
+    public SingleSupportFragmentTestActivity launchAndWaitActivity(Class fragmentClass, Options options,
+            long waitTimeMs) {
+        return launchAndWaitActivity(fragmentClass.getName(), options, waitTimeMs);
     }
 
-    public void launchAndWaitActivity(String firstFragmentName, Options options, long waitTimeMs) {
+    public SingleSupportFragmentTestActivity launchAndWaitActivity(String firstFragmentName,
+            Options options, long waitTimeMs) {
         Intent intent = new Intent();
         intent.putExtra(SingleSupportFragmentTestActivity.EXTRA_FRAGMENT_NAME, firstFragmentName);
         if (options != null) {
             options.collect(intent);
         }
-        mActivity = activityTestRule.launchActivity(intent);
-        Log.d(TAG, "launched " + mActivity + " for " + this, new Exception());
+        SingleSupportFragmentTestActivity activity = activityTestRule.launchActivity(intent);
         SystemClock.sleep(waitTimeMs);
+        return activity;
     }
 
     protected void waitForScrollIdle(RecyclerView recyclerView) throws Throwable {
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
index 2a56acd..2c36cda 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
@@ -47,22 +47,22 @@
 
     @Test
     public void immediateRemoveFragment() throws Throwable {
-        launchAndWaitActivity(GridFragment.class, 500);
+        final SingleFragmentTestActivity activity = launchAndWaitActivity(GridFragment.class, 500);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 GridFragment f = new GridFragment();
-                mActivity.getFragmentManager().beginTransaction()
+                activity.getFragmentManager().beginTransaction()
                         .replace(android.R.id.content, f, null).commit();
                 f.startEntranceTransition();
-                mActivity.getFragmentManager().beginTransaction()
+                activity.getFragmentManager().beginTransaction()
                         .replace(android.R.id.content, new Fragment(), null).commit();
             }
         });
 
         Thread.sleep(1000);
-        mActivity.finish();
+        activity.finish();
     }
 
 }
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
index f6d0a1b..9ca930a 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
@@ -50,22 +50,22 @@
 
     @Test
     public void immediateRemoveFragment() throws Throwable {
-        launchAndWaitActivity(GridFragment.class, 500);
+        final SingleSupportFragmentTestActivity activity = launchAndWaitActivity(GridFragment.class, 500);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 GridFragment f = new GridFragment();
-                mActivity.getSupportFragmentManager().beginTransaction()
+                activity.getSupportFragmentManager().beginTransaction()
                         .replace(android.R.id.content, f, null).commit();
                 f.startEntranceTransition();
-                mActivity.getSupportFragmentManager().beginTransaction()
+                activity.getSupportFragmentManager().beginTransaction()
                         .replace(android.R.id.content, new Fragment(), null).commit();
             }
         });
 
         Thread.sleep(1000);
-        mActivity.finish();
+        activity.finish();
     }
 
 }
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java
index 5c8c89e..f15521a 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java
@@ -75,16 +75,17 @@
 
     @Test
     public void setSurfaceViewCallbackBeforeCreate() {
-        launchAndWaitActivity(Fragment_setSurfaceViewCallbackBeforeCreate.class, 1000);
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(Fragment_setSurfaceViewCallbackBeforeCreate.class, 1000);
         Fragment_setSurfaceViewCallbackBeforeCreate fragment1 =
-                (Fragment_setSurfaceViewCallbackBeforeCreate) mActivity.getTestFragment();
+                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
         assertNotNull(fragment1);
         assertTrue(fragment1.mSurfaceCreated);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                mActivity.getFragmentManager().beginTransaction()
+                activity.getFragmentManager().beginTransaction()
                         .replace(R.id.main_frame, new Fragment_setSurfaceViewCallbackBeforeCreate())
                         .commitAllowingStateLoss();
             }
@@ -94,7 +95,7 @@
         assertFalse(fragment1.mSurfaceCreated);
 
         Fragment_setSurfaceViewCallbackBeforeCreate fragment2 =
-                (Fragment_setSurfaceViewCallbackBeforeCreate) mActivity.getTestFragment();
+                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
         assertNotNull(fragment2);
         assertTrue(fragment2.mSurfaceCreated);
         assertNotSame(fragment1, fragment2);
@@ -102,8 +103,8 @@
 
     @Test
     public void setSurfaceViewCallbackAfterCreate() {
-        launchAndWaitActivity(VideoFragment.class, 1000);
-        VideoFragment fragment = (VideoFragment) mActivity.getTestFragment();
+        SingleFragmentTestActivity activity = launchAndWaitActivity(VideoFragment.class, 1000);
+        VideoFragment fragment = (VideoFragment) activity.getTestFragment();
 
         assertNotNull(fragment);
 
@@ -194,9 +195,10 @@
 
     @Test
     public void mediaPlayerGlueInVideoFragment() {
-        launchAndWaitActivity(Fragment_withVideoPlayer.class, 1000);
+        final SingleFragmentTestActivity activity =
+                launchAndWaitActivity(Fragment_withVideoPlayer.class, 1000);
         final Fragment_withVideoPlayer fragment = (Fragment_withVideoPlayer)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -214,7 +216,7 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                mActivity.recreate();
+                activity.recreate();
             }
         });
 
@@ -235,7 +237,7 @@
         assertEquals(0, fragment.mGlueDetachedFromHost);
         assertEquals(1, fragment.mGlueOnReadyForPlaybackCalled);
 
-        mActivity.finish();
+        activity.finish();
         PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
             @Override
             public boolean canProceed() {
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
index dff3c0c..8bca7fc 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
@@ -78,16 +78,17 @@
 
     @Test
     public void setSurfaceViewCallbackBeforeCreate() {
-        launchAndWaitActivity(Fragment_setSurfaceViewCallbackBeforeCreate.class, 1000);
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(Fragment_setSurfaceViewCallbackBeforeCreate.class, 1000);
         Fragment_setSurfaceViewCallbackBeforeCreate fragment1 =
-                (Fragment_setSurfaceViewCallbackBeforeCreate) mActivity.getTestFragment();
+                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
         assertNotNull(fragment1);
         assertTrue(fragment1.mSurfaceCreated);
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                mActivity.getSupportFragmentManager().beginTransaction()
+                activity.getSupportFragmentManager().beginTransaction()
                         .replace(R.id.main_frame, new Fragment_setSurfaceViewCallbackBeforeCreate())
                         .commitAllowingStateLoss();
             }
@@ -97,7 +98,7 @@
         assertFalse(fragment1.mSurfaceCreated);
 
         Fragment_setSurfaceViewCallbackBeforeCreate fragment2 =
-                (Fragment_setSurfaceViewCallbackBeforeCreate) mActivity.getTestFragment();
+                (Fragment_setSurfaceViewCallbackBeforeCreate) activity.getTestFragment();
         assertNotNull(fragment2);
         assertTrue(fragment2.mSurfaceCreated);
         assertNotSame(fragment1, fragment2);
@@ -105,8 +106,8 @@
 
     @Test
     public void setSurfaceViewCallbackAfterCreate() {
-        launchAndWaitActivity(VideoSupportFragment.class, 1000);
-        VideoSupportFragment fragment = (VideoSupportFragment) mActivity.getTestFragment();
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(VideoSupportFragment.class, 1000);
+        VideoSupportFragment fragment = (VideoSupportFragment) activity.getTestFragment();
 
         assertNotNull(fragment);
 
@@ -197,9 +198,10 @@
 
     @Test
     public void mediaPlayerGlueInVideoSupportFragment() {
-        launchAndWaitActivity(Fragment_withVideoPlayer.class, 1000);
+        final SingleSupportFragmentTestActivity activity =
+                launchAndWaitActivity(Fragment_withVideoPlayer.class, 1000);
         final Fragment_withVideoPlayer fragment = (Fragment_withVideoPlayer)
-                mActivity.getTestFragment();
+                activity.getTestFragment();
 
         PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
             @Override
@@ -217,7 +219,7 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                mActivity.recreate();
+                activity.recreate();
             }
         });
 
@@ -238,7 +240,7 @@
         assertEquals(0, fragment.mGlueDetachedFromHost);
         assertEquals(1, fragment.mGlueOnReadyForPlaybackCalled);
 
-        mActivity.finish();
+        activity.finish();
         PollingCheck.waitFor(5000, new PollingCheck.PollingCheckCondition() {
             @Override
             public boolean canProceed() {
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
index f6bdf68..c97617d 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
@@ -34,6 +34,10 @@
 
     private static final String TAG = "GridActivity";
 
+    interface ImportantForAccessibilityListener {
+        void onImportantForAccessibilityChanged(View view, int newValue);
+    }
+
     interface AdapterListener {
         void onBind(RecyclerView.ViewHolder vh, int position);
     }
@@ -100,6 +104,7 @@
     int mNinePatchShadow;
 
     private int mBoundCount;
+    ImportantForAccessibilityListener mImportantForAccessibilityListener;
 
     private View createView() {
 
@@ -380,6 +385,15 @@
                             }
                         }
                     }
+
+                    @Override
+                    public void setImportantForAccessibility(int mode) {
+                        super.setImportantForAccessibility(mode);
+                        if (mImportantForAccessibilityListener != null) {
+                            mImportantForAccessibilityListener.onImportantForAccessibilityChanged(
+                                    this, mode);
+                        }
+                    }
                 };
                 textView.setTextColor(Color.BLACK);
                 textView.setOnFocusChangeListener(mItemFocusChangeListener);
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
index 3f4195d..67fa0cf 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -41,6 +41,7 @@
 import android.support.v17.leanback.test.R;
 import android.support.v17.leanback.testutils.PollingCheck;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v7.widget.DefaultItemAnimator;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
 import android.text.Selection;
@@ -62,6 +63,7 @@
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 
 @LargeTest
 @RunWith(AndroidJUnit4.class)
@@ -416,15 +418,32 @@
      * To wait the ItemAnimator start, you can use waitForLayout() to make sure layout pass has
      * processed adapter change.
      */
-    protected void waitForItemAnimation() {
+    protected void waitForItemAnimation(int timeoutMs) {
         RecyclerView.ItemAnimator.ItemAnimatorFinishedListener listener = mock(
                 RecyclerView.ItemAnimator.ItemAnimatorFinishedListener.class);
         if (mGridView.getItemAnimator().isRunning(listener)) {
-            verify(listener, timeout(WAIT_FOR_ITEM_ANIMATION_FINISH_TIMEOUT_MS).atLeastOnce())
+            verify(listener, timeout(timeoutMs).atLeastOnce())
                     .onAnimationsFinished();
         }
     }
 
+    protected void waitForItemAnimation() {
+        waitForItemAnimation(WAIT_FOR_ITEM_ANIMATION_FINISH_TIMEOUT_MS);
+    }
+
+    /**
+     * wait animation start
+     */
+    protected void waitForItemAnimationStart() throws Throwable {
+        long totalWait = 0;
+        while (!mGridView.getItemAnimator().isRunning()) {
+            Thread.sleep(10);
+            if ((totalWait += 10) > WAIT_FOR_ITEM_ANIMATION_FINISH_TIMEOUT_MS) {
+                throw new RuntimeException("waitForItemAnimationStart Timeout");
+            }
+        }
+    }
+
     /**
      * Run task in UI thread and wait for layout and ItemAnimator finishes.
      */
@@ -471,7 +490,6 @@
         mNumRows = 3;
 
         scrollToEnd(mVerifyLayout);
-        verifyBoundCount(100);
 
         scrollToBegin(mVerifyLayout);
 
@@ -660,7 +678,6 @@
         mNumRows = 3;
 
         scrollToEnd(mVerifyLayout);
-        verifyBoundCount(200);
 
         scrollToBegin(mVerifyLayout);
 
@@ -689,8 +706,6 @@
 
         scrollToEnd(mVerifyLayout);
 
-        verifyBoundCount(200);
-
         scrollToBegin(mVerifyLayout);
 
         verifyBeginAligned();
@@ -715,7 +730,6 @@
         // test append without staggered result cache
         scrollToEnd(mVerifyLayout);
 
-        verifyBoundCount(100);
         int[] endEdges = getEndEdges();
 
         scrollToBegin(mVerifyLayout);
@@ -727,11 +741,9 @@
         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();
@@ -3600,5 +3612,168 @@
         Thread.sleep(500);
         assertEquals(-1, mGridView.getSelectedPosition());
     }
+
+    static void assertNoCollectionItemInfo(AccessibilityNodeInfoCompat info) {
+        AccessibilityNodeInfoCompat.CollectionItemInfoCompat nodeInfoCompat =
+                info.getCollectionItemInfo();
+        if (nodeInfoCompat == null) {
+            return;
+        }
+        assertTrue(nodeInfoCompat.getRowIndex() < 0);
+        assertTrue(nodeInfoCompat.getColumnIndex() < 0);
+    }
+
+    /**
+     * This test would need talkback on.
+     */
+    @Test
+    public void testAccessibilityOfItemsBeingPushedOut() throws Throwable {
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        final int lastPos = mGridView.getChildAdapterPosition(
+                mGridView.getChildAt(mGridView.getChildCount() - 1));
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.getLayoutManager().setItemPrefetchEnabled(false);
+            }
+        });
+        final int numItemsToPushOut = mNumRows;
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // set longer enough so that accessibility service will initialize node
+                // within setImportantForAccessibility().
+                mGridView.getItemAnimator().setRemoveDuration(2000);
+                mGridView.getItemAnimator().setAddDuration(2000);
+                final int[] newItems = new int[numItemsToPushOut];
+                final int newItemValue = mActivity.mItemLengths[0];
+                for (int i = 0; i < newItems.length; i++) {
+                    newItems[i] = newItemValue;
+                }
+                mActivity.addItems(lastPos - numItemsToPushOut + 1, newItems);
+            }
+        });
+        waitForItemAnimation(6000);
+    }
+
+    /**
+     * This test simulates talkback by calling setImportanceForAccessibility at end of animation
+     */
+    @Test
+    public void simulatesAccessibilityOfItemsBeingPushedOut() throws Throwable {
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        final HashSet<View> removeAnimationFinishedViews = new HashSet();
+        mActivity.mImportantForAccessibilityListener =
+                new GridActivity.ImportantForAccessibilityListener() {
+            RecyclerView.LayoutManager mLM = mGridView.getLayoutManager();
+            @Override
+            public void onImportantForAccessibilityChanged(View view, int newValue) {
+                // simulates talkack, having setImportantForAccessibility to call
+                // onInitializeAccessibilityNodeInfoForItem() for the DISAPPEARING items.
+                if (removeAnimationFinishedViews.contains(view)) {
+                    AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
+                    mLM.onInitializeAccessibilityNodeInfoForItem(
+                            null, null, view, info);
+                }
+            }
+        };
+        final int lastPos = mGridView.getChildAdapterPosition(
+                mGridView.getChildAt(mGridView.getChildCount() - 1));
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.setItemAnimator(new DefaultItemAnimator() {
+                    @Override
+                    public void onRemoveFinished(RecyclerView.ViewHolder item) {
+                        removeAnimationFinishedViews.add(item.itemView);
+                    }
+                });
+                mGridView.getLayoutManager().setItemPrefetchEnabled(false);
+            }
+        });
+        final int numItemsToPushOut = mNumRows;
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final int[] newItems = new int[numItemsToPushOut];
+                final int newItemValue = mActivity.mItemLengths[0] + 1;
+                for (int i = 0; i < newItems.length; i++) {
+                    newItems[i] = newItemValue;
+                }
+                mActivity.addItems(lastPos - numItemsToPushOut + 1, newItems);
+            }
+        });
+        while (removeAnimationFinishedViews.size() != numItemsToPushOut) {
+            Thread.sleep(100);
+        }
+    }
+
+    @Test
+    public void testAccessibilityNodeInfoOnRemovedFirstItem() throws Throwable {
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 6);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        final View lastView = mGridView.findViewHolderForAdapterPosition(0).itemView;
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.getItemAnimator().setRemoveDuration(20000);
+                mActivity.removeItems(0, 1);
+            }
+        });
+        waitForItemAnimationStart();
+        AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(lastView);
+        mGridView.getLayoutManager().onInitializeAccessibilityNodeInfoForItem(null, null,
+                lastView, info);
+        assertNoCollectionItemInfo(info);
+    }
+
+    @Test
+    public void testAccessibilityNodeInfoOnRemovedLastItem() throws Throwable {
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 6);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        final View lastView = mGridView.findViewHolderForAdapterPosition(5).itemView;
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.getItemAnimator().setRemoveDuration(20000);
+                mActivity.removeItems(5, 1);
+            }
+        });
+        waitForItemAnimationStart();
+        AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(lastView);
+        mGridView.getLayoutManager().onInitializeAccessibilityNodeInfoForItem(null, null,
+                lastView, info);
+        assertNoCollectionItemInfo(info);
+    }
 }
 
diff --git a/v7/appcompat/res-public/values/public_attrs.xml b/v7/appcompat/res-public/values/public_attrs.xml
index 328a02e..d65faec 100644
--- a/v7/appcompat/res-public/values/public_attrs.xml
+++ b/v7/appcompat/res-public/values/public_attrs.xml
@@ -121,6 +121,8 @@
      <public type="attr" name="homeLayout"/>
      <public type="attr" name="icon"/>
      <public type="attr" name="iconifiedByDefault"/>
+     <public type="attr" name="iconTint"/>
+     <public type="attr" name="iconTintMode"/>
      <public type="attr" name="imageButtonStyle"/>
      <public type="attr" name="indeterminateProgressStyle"/>
      <public type="attr" name="isLightTheme"/>
@@ -192,6 +194,7 @@
      <public type="attr" name="textAppearanceSearchResultTitle"/>
      <public type="attr" name="textAppearanceSmallPopupMenu"/>
      <public type="attr" name="textColorAlertDialogListItem"/>
+     <public type="attr" name="textColorError"/>
      <public type="attr" name="theme"/>
      <public type="attr" name="thickness"/>
      <public type="attr" name="thumbTextPadding"/>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index d5cac20..ffcf2cf 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -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/attrs.xml b/v7/appcompat/res/values/attrs.xml
index 49b7cf8..04ca6ca 100644
--- a/v7/appcompat/res/values/attrs.xml
+++ b/v7/appcompat/res/values/attrs.xml
@@ -403,6 +403,9 @@
         <attr name="tooltipFrameBackground" format="reference" />
         <!-- Foreground color to use for tooltips -->
         <attr name="tooltipForegroundColor" format="reference|color" />
+
+        <!-- Text color for errors. -->
+        <attr name="textColorError" format="reference|color" />
     </declare-styleable>
 
 
@@ -733,6 +736,30 @@
         <!-- The tooltip text associated with the item. -->
         <attr name="tooltipText" format="string"/>
 
+        <!-- Tint to apply to the icon. -->
+        <attr name="iconTint" format="color" />
+
+        <!-- Blending mode used to apply the icon tint. -->
+        <attr name="iconTintMode">
+            <!-- The tint is drawn on top of the icon.
+                 [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] -->
+            <enum name="src_over" value="3" />
+            <!-- The tint is masked by the alpha channel of the icon. The icon’s
+                 color channels are thrown out. [Sa * Da, Sc * Da] -->
+            <enum name="src_in" value="5" />
+            <!-- The tint is drawn above the icon, but with the icon’s alpha
+                 channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc] -->
+            <enum name="src_atop" value="9" />
+            <!-- Multiplies the color and alpha channels of the icon with those of
+                 the tint. [Sa * Da, Sc * Dc] -->
+            <enum name="multiply" value="14" />
+            <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
+            <enum name="screen" value="15" />
+            <!-- Combines the tint and icon color and alpha channels, clamping the
+                 result to valid color values. Saturate(S + D) -->
+            <enum name="add" value="16" />
+        </attr>
+
     </declare-styleable>
 
     <declare-styleable name="Spinner">
diff --git a/v7/appcompat/res/values/colors_material.xml b/v7/appcompat/res/values/colors_material.xml
index a90bf7a..7d63f34 100644
--- a/v7/appcompat/res/values/colors_material.xml
+++ b/v7/appcompat/res/values/colors_material.xml
@@ -99,6 +99,9 @@
     <color name="primary_text_disabled_material_dark">#4Dffffff</color>
     <color name="secondary_text_disabled_material_dark">#36ffffff</color>
 
+    <color name="error_text_material_light">@color/material_red_A700</color>
+    <color name="error_text_material_dark">@color/material_red_A100</color>
+
     <!-- Primary & accent colors -->
     <eat-comment />
 
@@ -117,4 +120,6 @@
     <color name="material_blue_grey_900">#ff263238</color>
     <color name="material_blue_grey_950">#ff21272b</color>
 
+    <color name="material_red_A100">#ff8a80</color>
+    <color name="material_red_A700">#d50000</color>
 </resources>
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index dbdc605..276d8e7 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -281,6 +281,8 @@
         <!-- Tooltip attributes -->
         <item name="tooltipFrameBackground">@drawable/tooltip_frame_light</item>
         <item name="tooltipForegroundColor">@color/foreground_material_light</item>
+
+        <item name="textColorError">@color/error_text_material_dark</item>
     </style>
 
     <!-- Base platform-dependent theme providing an action bar in a light-themed activity. -->
@@ -447,6 +449,8 @@
         <!-- Tooltip attributes -->
         <item name="tooltipFrameBackground">@drawable/tooltip_frame_dark</item>
         <item name="tooltipForegroundColor">@color/foreground_material_dark</item>
+
+        <item name="textColorError">@color/error_text_material_light</item>
     </style>
 
     <style name="Base.Theme.AppCompat" parent="Base.V7.Theme.AppCompat">
diff --git a/v7/appcompat/src/android/support/v7/app/AlertDialog.java b/v7/appcompat/src/android/support/v7/app/AlertDialog.java
index c73e619..bf2d806 100644
--- a/v7/appcompat/src/android/support/v7/app/AlertDialog.java
+++ b/v7/appcompat/src/android/support/v7/app/AlertDialog.java
@@ -50,7 +50,7 @@
  * and add your view to it:
  *
  * <pre>
- * FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
+ * FrameLayout fl = findViewById(android.R.id.custom);
  * fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
  * </pre>
  *
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
index 57e4570..51b3c34 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
@@ -31,6 +31,7 @@
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.NavUtils;
 import android.support.v4.app.TaskStackBuilder;
+import android.support.v4.os.BuildCompat;
 import android.support.v7.view.ActionMode;
 import android.support.v7.widget.Toolbar;
 import android.support.v7.widget.VectorEnabledTintResources;
@@ -63,7 +64,6 @@
 
     private AppCompatDelegate mDelegate;
     private int mThemeId = 0;
-    private boolean mEatKeyUpEvent;
     private Resources mResources;
 
     @Override
@@ -186,7 +186,7 @@
     }
 
     @Override
-    public View findViewById(@IdRes int id) {
+    public <T extends View> T findViewById(@IdRes int id) {
         return getDelegate().findViewById(id);
     }
 
@@ -523,20 +523,8 @@
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        if (event.isCtrlPressed()
-                && event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') {
-            // Capture the Control-< and send focus to the ActionBar
-            final int action = event.getAction();
-            if (action == KeyEvent.ACTION_DOWN) {
-                final ActionBar actionBar = getSupportActionBar();
-                if (actionBar != null && actionBar.isShowing() && actionBar.requestFocus()) {
-                    mEatKeyUpEvent = true;
-                    return true;
-                }
-            } else if (action == KeyEvent.ACTION_UP && mEatKeyUpEvent) {
-                mEatKeyUpEvent = false;
-                return true;
-            }
+        if (getDelegate().checkActionBarFocusKey(event)) {
+            return true;
         }
         // Let support action bars open menus in response to the menu key prioritized over
         // the window handling it
@@ -558,12 +546,13 @@
     }
 
     /**
-     * KeyEvents with non-default modifiers are not dispatched to menu's performShortcut in API 24
+     * KeyEvents with non-default modifiers are not dispatched to menu's performShortcut in API 25
      * or lower. Here, we check if the keypress corresponds to a menuitem's shortcut combination
      * and perform the corresponding action.
      */
     private boolean performMenuItemShortcut(int keycode, KeyEvent event) {
-        if (!KeyEvent.metaStateHasNoModifiers(event.getMetaState())
+        if (!BuildCompat.isAtLeastO() && !event.isCtrlPressed()
+                && !KeyEvent.metaStateHasNoModifiers(event.getMetaState())
                 && event.getRepeatCount() == 0
                 && !KeyEvent.isModifierKey(event.getKeyCode())) {
             final Window currentWindow = getWindow();
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
index 3fe750d..b5144cd 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
@@ -31,11 +31,13 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.app.FragmentActivity;
+import android.support.v4.os.BuildCompat;
 import android.support.v4.view.WindowCompat;
 import android.support.v7.view.ActionMode;
 import android.support.v7.widget.Toolbar;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.view.KeyEvent;
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -194,7 +196,9 @@
 
     private static AppCompatDelegate create(Context context, Window window,
             AppCompatCallback callback) {
-        if (Build.VERSION.SDK_INT >= 24) {
+        if (BuildCompat.isAtLeastO()) {
+            return new AppCompatDelegateImplO(context, window, callback);
+        } else if (Build.VERSION.SDK_INT >= 24) {
             return new AppCompatDelegateImplN(context, window, callback);
         } else if (Build.VERSION.SDK_INT >= 23) {
             return new AppCompatDelegateImplV23(context, window, callback);
@@ -289,7 +293,7 @@
      * @return The view if found or null otherwise.
      */
     @Nullable
-    public abstract View findViewById(@IdRes int id);
+    public abstract <T extends View> T findViewById(@IdRes int id);
 
     /**
      * Should be called instead of {@link Activity#setContentView(android.view.View)}}
@@ -420,6 +424,13 @@
     public abstract void onSaveInstanceState(Bundle outState);
 
     /**
+     * Gives AppCompat an opportunity to send focus to the ActionBar.
+     *
+     * @return false if ActionBar was not focused.
+     */
+    public abstract boolean checkActionBarFocusKey(KeyEvent event);
+
+    /**
      * Allow AppCompat to apply the {@code night} and {@code notnight} resource qualifiers.
      *
      * <p>Doing this enables the
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
index 753dbd2..08271d0 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
@@ -107,6 +107,7 @@
 
     private boolean mIsStarted;
     private boolean mIsDestroyed;
+    private boolean mEatKeyUpEvent;
 
     AppCompatDelegateImplBase(Context context, Window window, AppCompatCallback callback) {
         mContext = context;
@@ -293,6 +294,26 @@
         // no-op
     }
 
+    @Override
+    public boolean checkActionBarFocusKey(KeyEvent event) {
+        if (event.isCtrlPressed()
+                && event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') {
+            // Capture the Control-< and send focus to the ActionBar
+            final int action = event.getAction();
+            if (action == KeyEvent.ACTION_DOWN) {
+                final ActionBar actionBar = getSupportActionBar();
+                if (actionBar != null && actionBar.isShowing() && actionBar.requestFocus()) {
+                    mEatKeyUpEvent = true;
+                    return true;
+                }
+            } else if (action == KeyEvent.ACTION_UP && mEatKeyUpEvent) {
+                mEatKeyUpEvent = false;
+                return true;
+            }
+        }
+        return false;
+    }
+
     abstract void onTitleChanged(CharSequence title);
 
     final CharSequence getTitle() {
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplO.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplO.java
new file mode 100644
index 0000000..9a60612
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplO.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.content.Context;
+import android.support.annotation.RequiresApi;
+import android.view.KeyEvent;
+import android.view.Window;
+
+@RequiresApi(26)
+class AppCompatDelegateImplO extends AppCompatDelegateImplN {
+
+    AppCompatDelegateImplO(Context context, Window window, AppCompatCallback callback) {
+        super(context, window, callback);
+    }
+
+    @Override
+    public boolean checkActionBarFocusKey(KeyEvent event) {
+        // In O+, ActionBar's make use of cluster navigation instead of a specific hotkey
+        return false;
+    }
+}
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
index ed11a5b..1b9dd79 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
@@ -228,9 +228,9 @@
 
     @Nullable
     @Override
-    public View findViewById(@IdRes int id) {
+    public <T extends View> T findViewById(@IdRes int id) {
         ensureSubDecor();
-        return mWindow.findViewById(id);
+        return (T) mWindow.findViewById(id);
     }
 
     @Override
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java b/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
index 2ac7c99..f41e4b0 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
@@ -95,7 +95,7 @@
 
     @Nullable
     @Override
-    public View findViewById(@IdRes int id) {
+    public <T extends View> T findViewById(@IdRes int id) {
         return getDelegate().findViewById(id);
     }
 
diff --git a/v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java b/v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java
index 9ac70af..57ba846 100644
--- a/v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java
+++ b/v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java
@@ -18,11 +18,9 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.Nullable;
 import android.support.v4.view.ViewCompat;
-import android.support.v7.appcompat.R;
 import android.support.v7.view.WindowCallbackWrapper;
 import android.support.v7.view.menu.ListMenuPresenter;
 import android.support.v7.view.menu.MenuBuilder;
@@ -30,8 +28,6 @@
 import android.support.v7.widget.DecorToolbar;
 import android.support.v7.widget.Toolbar;
 import android.support.v7.widget.ToolbarWidgetWrapper;
-import android.util.TypedValue;
-import android.view.ContextThemeWrapper;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -482,12 +478,9 @@
             final KeyCharacterMap kmap = KeyCharacterMap.load(
                     ev != null ? ev.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD);
             menu.setQwertyMode(kmap.getKeyboardType() != KeyCharacterMap.NUMERIC);
-            menu.performShortcut(keyCode, ev, 0);
+            return menu.performShortcut(keyCode, ev, 0);
         }
-        // This action bar always returns true for handling keyboard shortcuts.
-        // This will block the window from preparing a temporary panel to handle
-        // keyboard shortcuts.
-        return true;
+        return false;
     }
 
     @Override
@@ -519,52 +512,6 @@
         }
     }
 
-    View getListMenuView(Menu menu) {
-        ensureListMenuPresenter(menu);
-
-        if (menu == null || mListMenuPresenter == null) {
-            return null;
-        }
-
-        if (mListMenuPresenter.getAdapter().getCount() > 0) {
-            return (View) mListMenuPresenter.getMenuView(mDecorToolbar.getViewGroup());
-        }
-        return null;
-    }
-
-    private void ensureListMenuPresenter(Menu menu) {
-        if (mListMenuPresenter == null && (menu instanceof MenuBuilder)) {
-            MenuBuilder mb = (MenuBuilder) menu;
-
-            Context context = mDecorToolbar.getContext();
-            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);
-            }
-
-            // 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);
-
-            // Finally create the list menu presenter
-            mListMenuPresenter = new ListMenuPresenter(context, R.layout.abc_list_menu_item_layout);
-            mListMenuPresenter.setCallback(new PanelMenuPresenterCallback());
-            mb.addMenuPresenter(mListMenuPresenter);
-        }
-    }
-
     private class ToolbarCallbackWrapper extends WindowCallbackWrapper {
         public ToolbarCallbackWrapper(Window.Callback wrapped) {
             super(wrapped);
@@ -582,13 +529,11 @@
 
         @Override
         public View onCreatePanelView(int featureId) {
-            switch (featureId) {
-                case Window.FEATURE_OPTIONS_PANEL:
-                    final Menu menu = mDecorToolbar.getMenu();
-                    if (onPreparePanel(featureId, null, menu) && onMenuOpened(featureId, menu)) {
-                        return getListMenuView(menu);
-                    }
-                    break;
+            if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+                // This gets called by PhoneWindow.preparePanel. Since this already manages
+                // its own panel, we return a dummy view here to prevent PhoneWindow from
+                // preparing a default one.
+                return new View(mDecorToolbar.getContext());
             }
             return super.onCreatePanelView(featureId);
         }
@@ -633,26 +578,6 @@
         }
     }
 
-    private final class PanelMenuPresenterCallback implements MenuPresenter.Callback {
-        PanelMenuPresenterCallback() {
-        }
-
-        @Override
-        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
-            if (mWindowCallback != null) {
-                mWindowCallback.onPanelClosed(Window.FEATURE_OPTIONS_PANEL, menu);
-            }
-        }
-
-        @Override
-        public boolean onOpenSubMenu(MenuBuilder subMenu) {
-            if (subMenu == null && mWindowCallback != null) {
-                mWindowCallback.onMenuOpened(Window.FEATURE_OPTIONS_PANEL, subMenu);
-            }
-            return true;
-        }
-    }
-
     private final class MenuBuilderCallback implements MenuBuilder.Callback {
 
         MenuBuilderCallback() {
diff --git a/v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java b/v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java
index 003c986..40db06f 100644
--- a/v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java
+++ b/v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java
@@ -21,8 +21,10 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
+import android.graphics.PorterDuff;
 import android.support.annotation.RestrictTo;
 import android.support.v4.internal.view.SupportMenu;
 import android.support.v4.view.ActionProvider;
@@ -30,6 +32,7 @@
 import android.support.v7.appcompat.R;
 import android.support.v7.view.menu.MenuItemImpl;
 import android.support.v7.view.menu.MenuItemWrapperICS;
+import android.support.v7.widget.DrawableUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
@@ -328,6 +331,9 @@
         private CharSequence itemContentDescription;
         private CharSequence itemTooltipText;
 
+        private ColorStateList itemIconTintList = null;
+        private PorterDuff.Mode itemIconTintMode = null;
+
         private static final int defaultGroupId = NO_ID;
         private static final int defaultItemId = NO_ID;
         private static final int defaultItemCategory = 0;
@@ -425,6 +431,20 @@
 
             itemContentDescription = a.getText(R.styleable.MenuItem_contentDescription);
             itemTooltipText = a.getText(R.styleable.MenuItem_tooltipText);
+            if (a.hasValue(R.styleable.MenuItem_iconTintMode)) {
+                itemIconTintMode = DrawableUtils.parseTintMode(a.getInt(
+                        R.styleable.MenuItem_iconTintMode, -1),
+                        itemIconTintMode);
+            } else {
+                // Reset to null so that it's not carried over to the next item
+                itemIconTintMode = null;
+            }
+            if (a.hasValue(R.styleable.MenuItem_iconTint)) {
+                itemIconTintList = a.getColorStateList(R.styleable.MenuItem_iconTint);
+            } else {
+                // Reset to null so that it's not carried over to the next item
+                itemIconTintList = null;
+            }
 
             a.recycle();
 
@@ -494,6 +514,13 @@
             MenuItemCompat.setAlphabeticShortcut(item, itemAlphabeticShortcut,
                     itemAlphabeticModifiers);
             MenuItemCompat.setNumericShortcut(item, itemNumericShortcut, itemNumericModifiers);
+
+            if (itemIconTintMode != null) {
+                MenuItemCompat.setIconTintMode(item, itemIconTintMode);
+            }
+            if (itemIconTintList != null) {
+                MenuItemCompat.setIconTintList(item, itemIconTintList);
+            }
         }
 
         public void addItem() {
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java
index 6df7b3a..1074202 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java
@@ -20,9 +20,13 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.internal.view.SupportMenuItem;
 import android.support.v4.view.ActionProvider;
 import android.view.ContextMenu.ContextMenuInfo;
@@ -60,6 +64,11 @@
     private CharSequence mContentDescription;
     private CharSequence mTooltipText;
 
+    private ColorStateList mIconTintList = null;
+    private PorterDuff.Mode mIconTintMode = null;
+    private boolean mHasIconTint = false;
+    private boolean mHasIconTintMode = false;
+
     private static final int NO_ICON = 0;
 
     private int mFlags = ENABLED;
@@ -209,6 +218,8 @@
     public MenuItem setIcon(Drawable icon) {
         mIconDrawable = icon;
         mIconResId = NO_ICON;
+
+        applyIconTint();
         return this;
     }
 
@@ -216,6 +227,8 @@
     public MenuItem setIcon(int iconRes) {
         mIconResId = iconRes;
         mIconDrawable = ContextCompat.getDrawable(mContext, iconRes);
+
+        applyIconTint();
         return this;
     }
 
@@ -385,4 +398,49 @@
     public CharSequence getTooltipText() {
         return mTooltipText;
     }
+
+    @Override
+    public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
+        mIconTintList = iconTintList;
+        mHasIconTint = true;
+
+        applyIconTint();
+
+        return this;
+    }
+
+    @Override
+    public ColorStateList getIconTintList() {
+        return mIconTintList;
+    }
+
+    @Override
+    public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
+        mIconTintMode = iconTintMode;
+        mHasIconTintMode = true;
+
+        applyIconTint();
+
+        return this;
+    }
+
+    @Override
+    public PorterDuff.Mode getIconTintMode() {
+        return mIconTintMode;
+    }
+
+    private void applyIconTint() {
+        if (mIconDrawable != null && (mHasIconTint || mHasIconTintMode)) {
+            mIconDrawable = DrawableCompat.wrap(mIconDrawable);
+            mIconDrawable = mIconDrawable.mutate();
+
+            if (mHasIconTint) {
+                DrawableCompat.setTintList(mIconDrawable, mIconTintList);
+            }
+
+            if (mHasIconTintMode) {
+                DrawableCompat.setTintMode(mIconDrawable, mIconTintMode);
+            }
+        }
+    }
 }
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java b/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java
index 455eeed..081f304 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java
@@ -91,14 +91,14 @@
 
         ViewCompat.setBackground(this, mBackground);
 
-        mTitleView = (TextView) findViewById(R.id.title);
+        mTitleView = findViewById(R.id.title);
         if (mTextAppearance != -1) {
             mTitleView.setTextAppearance(mTextAppearanceContext,
                     mTextAppearance);
         }
 
-        mShortcutView = (TextView) findViewById(R.id.shortcut);
-        mSubMenuArrowView = (ImageView) findViewById(R.id.submenuarrow);
+        mShortcutView = findViewById(R.id.shortcut);
+        mSubMenuArrowView = findViewById(R.id.submenuarrow);
         if (mSubMenuArrowView != null) {
             mSubMenuArrowView.setImageDrawable(mSubMenuArrow);
         }
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java b/v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java
index 1711d25..05d5746 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java
@@ -21,9 +21,13 @@
 import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.internal.view.SupportMenuItem;
 import android.support.v4.view.ActionProvider;
 import android.support.v7.content.res.AppCompatResources;
@@ -82,6 +86,12 @@
     private CharSequence mContentDescription;
     private CharSequence mTooltipText;
 
+    private ColorStateList mIconTintList = null;
+    private PorterDuff.Mode mIconTintMode = null;
+    private boolean mHasIconTint = false;
+    private boolean mHasIconTintMode = false;
+    private boolean mNeedToApplyIconTint = false;
+
     private int mFlags = ENABLED;
     private static final int CHECKABLE = 0x00000001;
     private static final int CHECKED = 0x00000002;
@@ -474,14 +484,14 @@
     @Override
     public Drawable getIcon() {
         if (mIconDrawable != null) {
-            return mIconDrawable;
+            return applyIconTintIfNecessary(mIconDrawable);
         }
 
         if (mIconResId != NO_ICON) {
             Drawable icon = AppCompatResources.getDrawable(mMenu.getContext(), mIconResId);
             mIconResId = NO_ICON;
             mIconDrawable = icon;
-            return icon;
+            return applyIconTintIfNecessary(icon);
         }
 
         return null;
@@ -491,6 +501,7 @@
     public MenuItem setIcon(Drawable icon) {
         mIconResId = NO_ICON;
         mIconDrawable = icon;
+        mNeedToApplyIconTint = true;
         mMenu.onItemsChanged(false);
 
         return this;
@@ -500,6 +511,7 @@
     public MenuItem setIcon(int iconResId) {
         mIconDrawable = null;
         mIconResId = iconResId;
+        mNeedToApplyIconTint = true;
 
         // If we have a view, we need to push the Drawable to them
         mMenu.onItemsChanged(false);
@@ -507,6 +519,58 @@
         return this;
     }
 
+
+    @Override
+    public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
+        mIconTintList = iconTintList;
+        mHasIconTint = true;
+        mNeedToApplyIconTint = true;
+
+        mMenu.onItemsChanged(false);
+
+        return this;
+    }
+
+    @Override
+    public ColorStateList getIconTintList() {
+        return mIconTintList;
+    }
+
+    @Override
+    public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
+        mIconTintMode = iconTintMode;
+        mHasIconTintMode = true;
+        mNeedToApplyIconTint = true;
+
+        mMenu.onItemsChanged(false);
+
+        return this;
+    }
+
+    @Override
+    public PorterDuff.Mode getIconTintMode() {
+        return mIconTintMode;
+    }
+
+    private Drawable applyIconTintIfNecessary(Drawable icon) {
+        if (icon != null && mNeedToApplyIconTint && (mHasIconTint || mHasIconTintMode)) {
+            icon = DrawableCompat.wrap(icon);
+            icon = icon.mutate();
+
+            if (mHasIconTint) {
+                DrawableCompat.setTintList(icon, mIconTintList);
+            }
+
+            if (mHasIconTintMode) {
+                DrawableCompat.setTintMode(icon, mIconTintMode);
+            }
+
+            mNeedToApplyIconTint = false;
+        }
+
+        return icon;
+    }
+
     @Override
     public boolean isCheckable() {
         return (mFlags & CHECKABLE) == CHECKABLE;
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java b/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java
index 228a955..5a44f1a 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java
@@ -20,6 +20,8 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
@@ -346,6 +348,28 @@
         return mWrappedObject.getTooltipText();
     }
 
+    @Override
+    public MenuItem setIconTintList(ColorStateList tint) {
+        mWrappedObject.setIconTintList(tint);
+        return this;
+    }
+
+    @Override
+    public ColorStateList getIconTintList() {
+        return mWrappedObject.getIconTintList();
+    }
+
+    @Override
+    public MenuItem setIconTintMode(PorterDuff.Mode tintMode) {
+        mWrappedObject.setIconTintMode(tintMode);
+        return this;
+    }
+
+    @Override
+    public PorterDuff.Mode getIconTintMode() {
+        return mWrappedObject.getIconTintMode();
+    }
+
     public void setExclusiveCheckable(boolean checkable) {
         try {
             if (mSetExclusiveCheckableMethod == null) {
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java b/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java
index 4bb9bca..1839a17 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java
@@ -37,25 +37,18 @@
     }
 
     public static Menu wrapSupportMenu(Context context, SupportMenu supportMenu) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-            return new MenuWrapperICS(context, supportMenu);
-        }
-        throw new UnsupportedOperationException();
+        return new MenuWrapperICS(context, supportMenu);
     }
 
     public static MenuItem wrapSupportMenuItem(Context context, SupportMenuItem supportMenuItem) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
             return new MenuItemWrapperJB(context, supportMenuItem);
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+        } else {
             return new MenuItemWrapperICS(context, supportMenuItem);
         }
-        throw new UnsupportedOperationException();
     }
 
     public static SubMenu wrapSupportSubMenu(Context context, SupportSubMenu supportSubMenu) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-            return new SubMenuWrapperICS(context, supportSubMenu);
-        }
-        throw new UnsupportedOperationException();
+        return new SubMenuWrapperICS(context, supportSubMenu);
     }
 }
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java b/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
index 1e4fd35..dff9fed 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
@@ -528,8 +528,8 @@
 
     void pullChildren() {
         if (mContent == null) {
-            mContent = (ContentFrameLayout) findViewById(R.id.action_bar_activity_content);
-            mActionBarTop = (ActionBarContainer) findViewById(R.id.action_bar_container);
+            mContent = findViewById(R.id.action_bar_activity_content);
+            mActionBarTop = findViewById(R.id.action_bar_container);
             mDecorToolbar = getDecorToolbar(findViewById(R.id.action_bar));
         }
     }
diff --git a/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java b/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
index d78aa40..a1fe99f 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
@@ -231,15 +231,15 @@
 
         mCallbacks = new Callbacks();
 
-        mActivityChooserContent = (LinearLayoutCompat) findViewById(R.id.activity_chooser_view_content);
+        mActivityChooserContent = findViewById(R.id.activity_chooser_view_content);
         mActivityChooserContentBackground = mActivityChooserContent.getBackground();
 
-        mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button);
+        mDefaultActivityButton = findViewById(R.id.default_activity_button);
         mDefaultActivityButton.setOnClickListener(mCallbacks);
         mDefaultActivityButton.setOnLongClickListener(mCallbacks);
         mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.image);
 
-        final FrameLayout expandButton = (FrameLayout) findViewById(R.id.expand_activities_button);
+        final FrameLayout expandButton = findViewById(R.id.expand_activities_button);
         expandButton.setOnClickListener(mCallbacks);
         expandButton.setOnTouchListener(new ForwardingListener(expandButton) {
             @Override
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index 34e2f4e..5165574 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -23,7 +23,6 @@
 import static android.support.v7.widget.ThemeUtils.getThemeAttrColor;
 import static android.support.v7.widget.ThemeUtils.getThemeAttrColorStateList;
 
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
@@ -770,7 +769,6 @@
         VdcInflateDelegate() {
         }
 
-        @SuppressLint("NewApi")
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
                 @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
@@ -789,7 +787,6 @@
         AvdcInflateDelegate() {
         }
 
-        @SuppressLint("NewApi")
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
                 @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
index eb8c515..f842a81 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
@@ -62,6 +62,9 @@
     private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
     // Use this to specify that any of the auto-size configuration int values have not been set.
     static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1;
+    // Ported from TextView#VERY_WIDE. Represents a maximum width in pixels the TextView takes when
+    // horizontal scrolling is activated.
+    private static final int VERY_WIDE = 1024 * 1024;
     // Auto-size text type.
     private int mAutoSizeTextType = TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;
     // Specify if auto-size text is needed.
@@ -638,8 +641,12 @@
     private boolean suggestedSizeFitsInSpace(int suggestedSizeInPx, RectF availableSpace) {
         final CharSequence text = mTextView.getText();
         final int maxLines = Build.VERSION.SDK_INT >= 16 ? mTextView.getMaxLines() : -1;
-        final int availableWidth = mTextView.getMeasuredWidth() - mTextView.getTotalPaddingLeft()
-                - mTextView.getTotalPaddingRight();
+        final boolean horizontallyScrolling = invokeAndReturnWithDefault(
+                mTextView, "getHorizontallyScrolling", false);
+        final int availableWidth = horizontallyScrolling
+                ? VERY_WIDE
+                : mTextView.getMeasuredWidth() - mTextView.getTotalPaddingLeft()
+                        - mTextView.getTotalPaddingRight();
         if (mTempTextPaint == null) {
             mTempTextPaint = new TextPaint();
         } else {
diff --git a/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java b/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
index f193e65..808200f 100644
--- a/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
+++ b/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
@@ -178,7 +178,10 @@
         drawable.setState(originalState);
     }
 
-    static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {
+    /**
+     * Parses tint mode.
+     */
+    public static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {
         switch (value) {
             case 3: return PorterDuff.Mode.SRC_OVER;
             case 5: return PorterDuff.Mode.SRC_IN;
diff --git a/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java b/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
index 1f44c27..296f238 100644
--- a/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
+++ b/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
@@ -113,6 +113,7 @@
     private boolean mDropDownVerticalOffsetSet;
     private boolean mIsAnimatedFromAnchor = true;
     private boolean mOverlapAnchor;
+    private boolean mOverlapAnchorSet;
 
     private int mDropDownGravity = Gravity.NO_GRAVITY;
 
@@ -712,7 +713,9 @@
             // only set this if the dropdown is not always visible
             mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible);
             mPopup.setTouchInterceptor(mTouchInterceptor);
-            PopupWindowCompat.setOverlapAnchor(mPopup, mOverlapAnchor);
+            if (mOverlapAnchorSet) {
+                PopupWindowCompat.setOverlapAnchor(mPopup, mOverlapAnchor);
+            }
             if (sSetEpicenterBoundsMethod != null) {
                 try {
                     sSetEpicenterBoundsMethod.invoke(mPopup, mEpicenterBounds);
@@ -1306,6 +1309,7 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     public void setOverlapAnchor(boolean overlapAnchor) {
+        mOverlapAnchorSet = true;
         mOverlapAnchor = overlapAnchor;
     }
 
diff --git a/v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java b/v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java
index 828a792..8c9c864 100644
--- a/v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java
+++ b/v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java
@@ -16,8 +16,6 @@
 
 package android.support.v7.widget;
 
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.content.res.AssetFileDescriptor;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
@@ -27,10 +25,13 @@
 import android.graphics.Movie;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.annotation.RequiresApi;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
 
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -128,16 +129,19 @@
         return mResources.getDrawable(id);
     }
 
+    @RequiresApi(21)
     @Override
     public Drawable getDrawable(int id, Theme theme) throws NotFoundException {
         return mResources.getDrawable(id, theme);
     }
 
+    @RequiresApi(15)
     @Override
     public Drawable getDrawableForDensity(int id, int density) throws NotFoundException {
         return mResources.getDrawableForDensity(id, density);
     }
 
+    @RequiresApi(21)
     @Override
     public Drawable getDrawableForDensity(int id, int density, Theme theme) {
         return mResources.getDrawableForDensity(id, density, theme);
@@ -204,6 +208,7 @@
         mResources.getValue(id, outValue, resolveRefs);
     }
 
+    @RequiresApi(15)
     @Override
     public void getValueForDensity(int id, int density, TypedValue outValue, boolean resolveRefs)
             throws NotFoundException {
diff --git a/v7/appcompat/src/android/support/v7/widget/SearchView.java b/v7/appcompat/src/android/support/v7/widget/SearchView.java
index bdfdb2b..a796af9 100644
--- a/v7/appcompat/src/android/support/v7/widget/SearchView.java
+++ b/v7/appcompat/src/android/support/v7/widget/SearchView.java
@@ -282,17 +282,17 @@
                 R.styleable.SearchView_layout, R.layout.abc_search_view);
         inflater.inflate(layoutResId, this, true);
 
-        mSearchSrcTextView = (SearchAutoComplete) findViewById(R.id.search_src_text);
+        mSearchSrcTextView = findViewById(R.id.search_src_text);
         mSearchSrcTextView.setSearchView(this);
 
         mSearchEditFrame = findViewById(R.id.search_edit_frame);
         mSearchPlate = findViewById(R.id.search_plate);
         mSubmitArea = findViewById(R.id.submit_area);
-        mSearchButton = (ImageView) findViewById(R.id.search_button);
-        mGoButton = (ImageView) findViewById(R.id.search_go_btn);
-        mCloseButton = (ImageView) findViewById(R.id.search_close_btn);
-        mVoiceButton = (ImageView) findViewById(R.id.search_voice_btn);
-        mCollapsedIcon = (ImageView) findViewById(R.id.search_mag_icon);
+        mSearchButton = findViewById(R.id.search_button);
+        mGoButton = findViewById(R.id.search_go_btn);
+        mCloseButton = findViewById(R.id.search_close_btn);
+        mVoiceButton = findViewById(R.id.search_voice_btn);
+        mCollapsedIcon = findViewById(R.id.search_mag_icon);
 
         // Set up icons and backgrounds.
         ViewCompat.setBackground(mSearchPlate,
diff --git a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java b/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
index ca72d27..626307c 100644
--- a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
+++ b/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
@@ -24,6 +24,7 @@
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
@@ -210,6 +211,7 @@
         mWrapped.recycle();
     }
 
+    @RequiresApi(21)
     public int getChangingConfigurations() {
         return mWrapped.getChangingConfigurations();
     }
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/tests/AndroidManifest.xml
index 344e95c..647d153 100644
--- a/v7/appcompat/tests/AndroidManifest.xml
+++ b/v7/appcompat/tests/AndroidManifest.xml
@@ -33,6 +33,10 @@
         <activity android:name="android.support.v7.app.AppCompatMenuItemShortcutsTestActivity"/>
 
         <activity
+            android:name="android.support.v7.app.AppCompatMenuItemIconTintingTestActivity"
+            android:theme="@style/Theme.AppCompat.NoActionBar"/>
+
+        <activity
                 android:name="android.support.v7.app.WindowDecorAppCompatActivity"/>
         <activity
                 android:name="android.support.v7.app.ToolbarAppCompatActivity"
diff --git a/v7/appcompat/tests/res/drawable/icon_black.jpg b/v7/appcompat/tests/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable/icon_black.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_blue.jpg b/v7/appcompat/tests/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_green.jpg b/v7/appcompat/tests/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable/icon_green.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_red.jpg b/v7/appcompat/tests/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable/icon_red.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_yellow.jpg b/v7/appcompat/tests/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml b/v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml
new file mode 100644
index 0000000..707fd46
--- /dev/null
+++ b/v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/tests/res/layout/toolbar_decor_content.xml b/v7/appcompat/tests/res/layout/toolbar_decor_content.xml
index c271f68..f5cd74c 100644
--- a/v7/appcompat/tests/res/layout/toolbar_decor_content.xml
+++ b/v7/appcompat/tests/res/layout/toolbar_decor_content.xml
@@ -21,6 +21,7 @@
 
     <android.support.v7.widget.Toolbar
             android:id="@+id/toolbar"
+            android:keyboardNavigationCluster="true"
             android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize"/>
 
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml b/v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml
new file mode 100644
index 0000000..08ad3a7
--- /dev/null
+++ b/v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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_first"
+        android:icon="@drawable/icon_blue"
+        android:title="@string/menu1"
+        app:iconTint="@android:color/white"
+        app:showAsAction="always"/>
+
+    <item
+        android:id="@+id/menu_second"
+        android:icon="@drawable/icon_black"
+        android:title="@string/menu2"
+        app:iconTintMode="screen"
+        app:showAsAction="always"/>
+
+    <item
+        android:id="@+id/menu_third"
+        android:icon="@drawable/icon_green"
+        android:title="@string/menu3"/>
+
+    <item
+        android:id="@+id/menu_fourth"
+        android:icon="@drawable/icon_red"
+        android:title="@string/menu4"/>
+
+    <item
+        android:id="@+id/menu_fifth"
+        android:icon="@drawable/icon_yellow"
+        android:title="@string/menu5"/>
+
+    <item
+        android:id="@+id/menu_sixth"
+        android:title="@string/menu6"/>
+
+</menu>
\ No newline at end of file
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml b/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml
index 95cdece..befebbe 100644
--- a/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml
+++ b/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml
@@ -34,6 +34,6 @@
     <item android:id="@+id/multiple_modifiers"
           android:onClick="handleMenuItem"
           android:alphabeticShortcut="d"
-          app:alphabeticModifiers="CTRL|SHIFT" />
+          app:alphabeticModifiers="ALT|SHIFT" />
 
 </menu>
diff --git a/v7/appcompat/tests/res/values/strings.xml b/v7/appcompat/tests/res/values/strings.xml
index 396d80e..2a85db4 100644
--- a/v7/appcompat/tests/res/values/strings.xml
+++ b/v7/appcompat/tests/res/values/strings.xml
@@ -86,4 +86,11 @@
 
     <string name="text_link_enabled">With <a href="http://www.google.com">link</a> enabled</string>
     <string name="text_link_disabled">With <a href="http://www.google.com">link</a> disabled</string>
+
+    <string name="menu1">menu one</string>
+    <string name="menu2">menu two</string>
+    <string name="menu3">menu three</string>
+    <string name="menu4">menu four</string>
+    <string name="menu5">menu five</string>
+    <string name="menu6">menu six</string>
 </resources>
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
new file mode 100644
index 0000000..c842c7b
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 static junit.framework.Assert.assertEquals;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.content.res.ResourcesCompat;
+import android.support.v4.graphics.ColorUtils;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.appcompat.test.R;
+import android.support.v7.testutils.TestUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test icon tinting in {@link MenuItem}s
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatMenuItemIconTintingTest {
+    private AppCompatMenuItemIconTintingTestActivity mActivity;
+    private Resources mResources;
+    private Menu mMenu;
+
+    @Rule
+    public ActivityTestRule<AppCompatMenuItemIconTintingTestActivity> mActivityTestRule =
+            new ActivityTestRule<>(AppCompatMenuItemIconTintingTestActivity.class);
+
+    @Before
+    public void setup() {
+        mActivity = mActivityTestRule.getActivity();
+        mResources = mActivity.getResources();
+        mMenu = mActivity.getToolbarMenu();
+    }
+
+    @UiThreadTest
+    @Test
+    public void testIconTinting() throws Throwable {
+        final MenuItem firstItem = mMenu.getItem(0);
+        final MenuItem secondItem = mMenu.getItem(1);
+        final MenuItem thirdItem = mMenu.getItem(2);
+
+        // These are the default set in layout XML
+        assertNull(MenuItemCompat.getIconTintMode(firstItem));
+        assertEquals(Color.WHITE, MenuItemCompat.getIconTintList(firstItem).getDefaultColor());
+
+        assertEquals(PorterDuff.Mode.SCREEN, MenuItemCompat.getIconTintMode(secondItem));
+        assertNull(MenuItemCompat.getIconTintList(secondItem));
+
+        assertNull(MenuItemCompat.getIconTintMode(thirdItem));
+        assertNull(MenuItemCompat.getIconTintList(thirdItem));
+
+        // Change tint color list and mode and verify that they are returned by the getters
+        final ColorStateList colors = ColorStateList.valueOf(Color.RED);
+
+        MenuItemCompat.setIconTintList(firstItem, colors);
+        MenuItemCompat.setIconTintMode(firstItem, PorterDuff.Mode.XOR);
+        assertSame(colors, MenuItemCompat.getIconTintList(firstItem));
+        assertEquals(PorterDuff.Mode.XOR, MenuItemCompat.getIconTintMode(firstItem));
+
+        // Ensure the tint is preserved across drawable changes.
+        firstItem.setIcon(R.drawable.icon_yellow);
+        assertSame(colors, MenuItemCompat.getIconTintList(firstItem));
+        assertEquals(PorterDuff.Mode.XOR, MenuItemCompat.getIconTintMode(firstItem));
+
+        // Change tint color list and mode again and verify that they are returned by the getters
+        final ColorStateList colorsNew = ColorStateList.valueOf(Color.MAGENTA);
+        MenuItemCompat.setIconTintList(firstItem, colorsNew);
+        MenuItemCompat.setIconTintMode(firstItem, PorterDuff.Mode.SRC_IN);
+        assertSame(colorsNew, MenuItemCompat.getIconTintList(firstItem));
+        assertEquals(PorterDuff.Mode.SRC_IN, MenuItemCompat.getIconTintMode(firstItem));
+    }
+
+    private void verifyIconIsColoredAs(String description, @NonNull Drawable icon,
+            @ColorInt int color, int allowedComponentVariance) {
+        TestUtils.assertAllPixelsOfColor(description,
+                icon, icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), true,
+                color, allowedComponentVariance, false);
+    }
+
+
+    /**
+     * This method tests that icon tinting is not applied when the
+     * menu item has no icon.
+     */
+    @UiThreadTest
+    @Test
+    public void testIconTintingWithNoIcon() {
+        final MenuItem sixthItem = mMenu.getItem(5);
+
+        // Note that all the asserts in this test check that the menu item icon
+        // is null. This is because the matching entry in the XML doesn't define any
+        // icon, and there is nothing to tint.
+        assertNull("No icon after XML loading", sixthItem.getIcon());
+
+        // Load a new color state list, set it on the menu item icon and check that the icon
+        // is still null.
+        final ColorStateList sandColor = ResourcesCompat.getColorStateList(
+                mResources, R.color.color_state_list_sand, null);
+        MenuItemCompat.setIconTintList(sixthItem, sandColor);
+        assertNull("No icon after setting icon tint list", sixthItem.getIcon());
+
+        // Set tint mode on the menu item icon and check that the icon is still null.
+        MenuItemCompat.setIconTintMode(sixthItem, PorterDuff.Mode.MULTIPLY);
+        assertNull("No icon after setting icon tint mode", sixthItem.getIcon());
+    }
+
+    /**
+     * This method tests that icon tinting is applied across a number of
+     * <code>ColorStateList</code>s set as icon tint lists on the same menu item.
+     */
+    @UiThreadTest
+    @Test
+    public void testIconTintingAcrossTintListChange() {
+        final MenuItem firstItem = mMenu.getItem(0);
+
+        final @ColorInt int sandDefault = ResourcesCompat.getColor(
+                mResources, R.color.sand_default, null);
+        final @ColorInt int oceanDefault = ResourcesCompat.getColor(
+                mResources, R.color.ocean_default, null);
+
+        // Test the default state for tinting set up in the menu XML file.
+        verifyIconIsColoredAs("Default white tinting", firstItem.getIcon(), Color.WHITE, 0);
+
+        // Load a new color state list, set it on the menu item and check that the icon has
+        // switched to the matching entry in newly set color state list.
+        final ColorStateList sandColor = ResourcesCompat.getColorStateList(
+                mResources, R.color.color_state_list_sand, null);
+        MenuItemCompat.setIconTintList(firstItem, sandColor);
+        verifyIconIsColoredAs("Default white tinting", firstItem.getIcon(), sandDefault, 0);
+
+        // Load another color state list, set it on the menu item and check that the icon has
+        // switched to the matching entry in newly set color state list.
+        final ColorStateList oceanColor = ResourcesCompat.getColorStateList(
+                mResources, R.color.color_state_list_ocean, null);
+        MenuItemCompat.setIconTintList(firstItem, oceanColor);
+        verifyIconIsColoredAs("Default white tinting", firstItem.getIcon(), oceanDefault, 0);
+    }
+
+    /**
+     * This method tests that opaque icon tinting is applied correctly after changing the icon
+     * itself of the menu item.
+     */
+    @UiThreadTest
+    @Test
+    public void testIconOpaqueTintingAcrossIconChange() {
+        final MenuItem secondItem = mMenu.getItem(1);
+
+        // This is the fill color of R.drawable.icon_black set on our menu icon
+        // that we'll be testing in this method
+        final @ColorInt int iconColorBlack = 0xFF000000;
+
+        // At this point we shouldn't have any tinting since it's not defined in the menu XML
+        verifyIconIsColoredAs("Black icon before any tinting", secondItem.getIcon(),
+                iconColorBlack, 0);
+
+        // Now set up the tinting
+        final ColorStateList lilacColor = ResourcesCompat.getColorStateList(
+                mResources, R.color.color_state_list_lilac, null);
+        final @ColorInt int lilacDefault = ResourcesCompat.getColor(
+                mResources, R.color.lilac_default, null);
+        MenuItemCompat.setIconTintList(secondItem, lilacColor);
+        MenuItemCompat.setIconTintMode(secondItem, PorterDuff.Mode.SRC_OVER);
+
+        // Check that the icon is now tinted
+        verifyIconIsColoredAs("Lilac icon after tinting the black icon",
+                secondItem.getIcon(), lilacDefault, 0);
+
+        // Set a different icon on our menu item
+        secondItem.setIcon(R.drawable.test_drawable_red);
+
+        // Check that the icon is still tinted with the same color as before
+        verifyIconIsColoredAs("Lilac icon after changing icon to red",
+                secondItem.getIcon(), lilacDefault, 0);
+    }
+
+    /**
+     * This method tests that translucent icon tinting is applied correctly after changing the icon
+     * itself of the menu item.
+     */
+    @UiThreadTest
+    @Test
+    public void testIconTranslucentTintingAcrossIconChange() {
+        final MenuItem secondItem = mMenu.getItem(1);
+
+        // This is the fill color of R.drawable.icon_black set on our menu icon
+        // that we'll be testing in this method
+        final @ColorInt int iconColorBlack = 0xFF000000;
+
+        // At this point we shouldn't have any tinting since it's not defined in the menu XML
+        verifyIconIsColoredAs("Black icon before any tinting", secondItem.getIcon(),
+                iconColorBlack, 0);
+
+        final ColorStateList emeraldColor = ResourcesCompat.getColorStateList(
+                mResources, R.color.color_state_list_emerald_translucent, null);
+        final @ColorInt int emeraldDefault = ResourcesCompat.getColor(
+                mResources, R.color.emerald_translucent_default, null);
+        // This is the fill color of R.drawable.test_background_red that will be set on our
+        // menu icon that we'll be testing in this method
+        final @ColorInt int iconColorRed = ResourcesCompat.getColor(
+                mResources, R.color.test_red, null);
+
+        // Set up the tinting of our menu item. The tint list is using translucent color, and the
+        // tint mode is going to be src_over, which will create a "mix" of the original icon with
+        // the translucent tint color.
+        MenuItemCompat.setIconTintList(secondItem, emeraldColor);
+        MenuItemCompat.setIconTintMode(secondItem, PorterDuff.Mode.SRC_OVER);
+
+        // From this point on in this method we're allowing a margin of error in checking the
+        // color of the menu icon. This is due to both translucent colors being used
+        // in the color state list and off-by-one discrepancies of SRC_OVER when it's compositing
+        // translucent color on top of solid fill color. This is where the allowed variance
+        // value of 2 comes from - one for compositing and one for color translucency.
+        final int allowedComponentVariance = 2;
+
+        // Test the tinting set up with the just loaded tint list.
+        verifyIconIsColoredAs("Emerald tinting on green icon",
+                secondItem.getIcon(), ColorUtils.compositeColors(emeraldDefault, iconColorBlack),
+                allowedComponentVariance);
+
+        // Set a different icon on our menu item
+        secondItem.setIcon(R.drawable.test_drawable_red);
+
+        // Test the tinting of the new menu icon with the same color state list
+        verifyIconIsColoredAs("Emerald tinting on red icon",
+                secondItem.getIcon(), ColorUtils.compositeColors(emeraldDefault, iconColorRed),
+                allowedComponentVariance);
+    }
+}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
new file mode 100644
index 0000000..b50f992
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.support.v7.appcompat.test.R;
+import android.support.v7.testutils.BaseTestActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+
+public class AppCompatMenuItemIconTintingTestActivity extends BaseTestActivity {
+    private Toolbar mToolbar;
+
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_toolbar_activity;
+    }
+
+    @Override
+    protected void onContentViewSet() {
+        mToolbar = findViewById(R.id.toolbar);
+        setSupportActionBar(mToolbar);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.appcompat_menu_icon_tinting, menu);
+
+        return true;
+    }
+
+    public Menu getToolbarMenu() {
+        return mToolbar.getMenu();
+    }
+}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
index 6d4830a..bf55d69 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
@@ -23,6 +23,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.BuildCompat;
 import android.support.v7.appcompat.test.R;
 import android.view.KeyEvent;
 import android.view.Menu;
@@ -55,31 +56,34 @@
 
     @Test
     public void testPerformShortcut() {
-        final long downTime = SystemClock.uptimeMillis();
-        int keyCodeToSend, metaState;
-        KeyEvent keyEventToSend;
+        // The support library is only needed for API 25 or lower.
+        if (!BuildCompat.isAtLeastO()) {
+            final long downTime = SystemClock.uptimeMillis();
+            int keyCodeToSend, metaState;
+            KeyEvent keyEventToSend;
 
-        // Test shortcut trigger in case of non-default single modifier
-        keyCodeToSend = KeyEvent.KEYCODE_C;
-        metaState = KeyEvent.META_SHIFT_ON;
-        keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
-                keyCodeToSend, 0, metaState);
-        assertTrue(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
-        assertEquals(mActivity.getMenuItemIdTracker(), R.id.single_modifier);
+            // Test shortcut trigger in case of non-default single modifier
+            keyCodeToSend = KeyEvent.KEYCODE_C;
+            metaState = KeyEvent.META_SHIFT_ON;
+            keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
+                    keyCodeToSend, 0, metaState);
+            assertTrue(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
+            assertEquals(mActivity.getMenuItemIdTracker(), R.id.single_modifier);
 
-        // Test shortcut trigger in case of multiple modifiers
-        keyCodeToSend = KeyEvent.KEYCODE_D;
-        metaState = KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON;
-        keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
-                keyCodeToSend, 0, metaState);
-        assertTrue(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
-        assertEquals(mActivity.getMenuItemIdTracker(), R.id.multiple_modifiers);
+            // Test shortcut trigger in case of multiple non-default modifiers
+            keyCodeToSend = KeyEvent.KEYCODE_D;
+            metaState = KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON;
+            keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
+                    keyCodeToSend, 0, metaState);
+            assertTrue(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
+            assertEquals(mActivity.getMenuItemIdTracker(), R.id.multiple_modifiers);
 
-        // Test no shortcut trigger in case of incorrect modifier
-        keyCodeToSend = KeyEvent.KEYCODE_E;
-        metaState = KeyEvent.META_CTRL_ON;
-        keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
-                keyCodeToSend, 0, metaState);
-        assertFalse(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
+            // Test no shortcut trigger in case of incorrect modifier
+            keyCodeToSend = KeyEvent.KEYCODE_E;
+            metaState = KeyEvent.META_CTRL_ON;
+            keyEventToSend = new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN,
+                    keyCodeToSend, 0, metaState);
+            assertFalse(mActivity.onKeyDown(keyCodeToSend, keyEventToSend));
+        }
     }
 }
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
index 0dba273..72fef54 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
@@ -58,9 +58,9 @@
     protected void onContentViewSet() {
         super.onContentViewSet();
 
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-        mDrawer = (ListView) findViewById(R.id.start_drawer);
-        mContent = (TextView) findViewById(R.id.content_text);
+        mDrawerLayout = findViewById(R.id.drawer_layout);
+        mDrawer = findViewById(R.id.start_drawer);
+        mContent = findViewById(R.id.content_text);
 
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
 
@@ -75,7 +75,7 @@
 
         // 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 = findViewById(R.id.toolbar);
         mToolbar.setTitle(R.string.drawer_title);
         setSupportActionBar(mToolbar);
 
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java
index a1c1558..c29021b 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java
@@ -49,10 +49,10 @@
     protected void onContentViewSet() {
         super.onContentViewSet();
 
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-        mStartDrawer = (ListView) findViewById(R.id.start_drawer);
+        mDrawerLayout = findViewById(R.id.drawer_layout);
+        mStartDrawer = findViewById(R.id.start_drawer);
         mEndDrawer = findViewById(R.id.end_drawer);
-        mContent = (TextView) findViewById(R.id.content_text);
+        mContent = findViewById(R.id.content_text);
 
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
 
@@ -67,7 +67,7 @@
 
         // 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 = findViewById(R.id.toolbar);
         mToolbar.setTitle(R.string.drawer_title);
         setSupportActionBar(mToolbar);
 
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
index 4f6310c..c22207c 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
@@ -16,15 +16,20 @@
 
 package android.support.v7.app;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import android.os.SystemClock;
 import android.support.test.filters.SmallTest;
+import android.support.v4.os.BuildCompat;
 import android.support.v7.testutils.BaseTestActivity;
+import android.support.v7.widget.Toolbar;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
+import android.view.MenuItem;
 import android.view.View;
+import android.view.Window;
 
 import org.junit.Test;
 
@@ -48,7 +53,12 @@
         });
 
         getInstrumentation().waitForIdleSync();
-        sendControlChar('<');
+        if (BuildCompat.isAtLeastO()) {
+            // Since O, we rely on keyboard navigation clusters for jumping to actionbar
+            sendMetaKey(KeyEvent.KEYCODE_TAB);
+        } else {
+            sendControlChar('<');
+        }
         getInstrumentation().waitForIdleSync();
 
         // Should jump to the action bar after control-<
@@ -60,7 +70,13 @@
                 assertTrue(toolbar.hasFocus());
             }
         });
-        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
+        if (BuildCompat.isAtLeastO()) {
+            // Since O, we rely on keyboard navigation clusters for jumping out of actionbar since
+            // normal navigation no-longer leaves it.
+            sendMetaKey(KeyEvent.KEYCODE_TAB);
+        } else {
+            getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
+        }
         getInstrumentation().waitForIdleSync();
 
         // Should jump to the first view again.
@@ -70,8 +86,65 @@
                 assertTrue(editText.hasFocus());
             }
         });
-        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
-        getInstrumentation().waitForIdleSync();
+    }
+
+    @Test
+    @SmallTest
+    public void testKeyShortcuts() throws Throwable {
+        final ToolbarAppCompatActivity activity = getActivity();
+
+        final Toolbar toolbar =
+                (Toolbar) activity.findViewById(android.support.v7.appcompat.test.R.id.toolbar);
+
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                toolbar.inflateMenu(android.support.v7.appcompat.test.R.menu.sample_actions);
+            }
+        });
+
+        final Boolean[] shareItemClicked = new Boolean[]{false};
+        toolbar.getMenu().findItem(android.support.v7.appcompat.test.R.id.action_alpha_shortcut)
+                .setOnMenuItemClickListener(
+                new MenuItem.OnMenuItemClickListener() {
+                        @Override
+                        public boolean onMenuItemClick(MenuItem item) {
+                            return shareItemClicked[0] = true;
+                        }
+                    });
+
+        final Window.Callback cb = activity.getWindow().getCallback();
+
+        // Make sure valid menu shortcuts get handled by toolbar menu
+        long now = SystemClock.uptimeMillis();
+        final KeyEvent handledShortcutKey = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_A, 0, KeyEvent.META_CTRL_ON);
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertTrue(cb.dispatchKeyShortcutEvent(handledShortcutKey));
+            }
+        });
+        assertTrue(shareItemClicked[0]);
+
+        final KeyEvent unhandledShortcutKey = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_D, 0, KeyEvent.META_CTRL_ON);
+
+        // Make sure we aren't eating unused shortcuts.
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertFalse(cb.dispatchKeyShortcutEvent(unhandledShortcutKey));
+            }
+        });
+
+        activity.resetCounters();
+
+        // Make sure that unhandled shortcuts don't prepare menus (since toolbar is handling that).
+        getInstrumentation().sendKeySync(unhandledShortcutKey);
+        assertEquals(1, activity.mKeyShortcutCount);
+        assertEquals(0, activity.mPrepareMenuCount);
+        assertEquals(0, activity.mCreateMenuCount);
     }
 
     private void sendControlChar(char key) throws Throwable {
@@ -86,4 +159,15 @@
             getInstrumentation().sendKeySync(controlKey);
         }
     }
+
+    private void sendMetaKey(int keyCode) throws Throwable {
+        long time = SystemClock.uptimeMillis();
+        KeyEvent keyDown = new KeyEvent(time, time, KeyEvent.ACTION_DOWN, keyCode,
+                0, KeyEvent.META_META_ON);
+        getInstrumentation().sendKeySync(keyDown);
+        time = SystemClock.uptimeMillis();
+        KeyEvent keyUp = new KeyEvent(time, time, KeyEvent.ACTION_UP, keyCode,
+                0, KeyEvent.META_META_ON);
+        getInstrumentation().sendKeySync(keyUp);
+    }
 }
diff --git a/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java b/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
index 3213f40..c75c3fe 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
@@ -19,11 +19,17 @@
 import android.support.v7.appcompat.test.R;
 import android.support.v7.testutils.BaseTestActivity;
 import android.support.v7.widget.Toolbar;
+import android.view.KeyEvent;
+import android.view.Menu;
 
 public class ToolbarAppCompatActivity extends BaseTestActivity {
 
     private Toolbar mToolbar;
 
+    public int mCreateMenuCount;
+    public int mPrepareMenuCount;
+    public int mKeyShortcutCount;
+
     @Override
     protected int getContentViewLayoutResId() {
         return R.layout.toolbar_decor_content;
@@ -31,11 +37,33 @@
 
     @Override
     protected void onContentViewSet() {
-        mToolbar = (Toolbar) findViewById(R.id.toolbar);
+        mToolbar = findViewById(R.id.toolbar);
         setSupportActionBar(mToolbar);
     }
 
     public Toolbar getToolbar() {
         return mToolbar;
     }
+
+    @Override
+    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
+        ++mKeyShortcutCount;
+        return super.onKeyShortcut(keyCode, event);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        ++mCreateMenuCount;
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        ++mPrepareMenuCount;
+        return super.onPrepareOptionsMenu(menu);
+    }
+
+    public void resetCounters() {
+        mCreateMenuCount = mPrepareMenuCount = mKeyShortcutCount = 0;
+    }
 }
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
index 81d07bd..f117cc3 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
@@ -409,6 +409,31 @@
     }
 
     @Test
+    public void testAutoSizeCallers_setHorizontallyScrolling() throws Throwable {
+        final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData(
+                R.id.textview_autosize_uniform, false);
+        // Horizontal scrolling is expected to be deactivated for this test.
+        final float initialTextSize = autoSizeTextView.getTextSize();
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                autoSizeTextView.setHorizontallyScrolling(true);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        assertTrue(autoSizeTextView.getTextSize() > initialTextSize);
+
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                autoSizeTextView.setHorizontallyScrolling(false);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        Assert.assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f);
+    }
+
+    @Test
     public void testAutoSize_setEllipsize() throws Throwable {
         final AppCompatTextView textView = (AppCompatTextView) getActivity().findViewById(
                 R.id.textview_autosize_uniform_predef_sizes);
@@ -492,7 +517,6 @@
         // In arrays.xml predefined the step sizes as: 5px, 11dip, 19sp, 29pt, 43mm and 53in.
         // TypedValue can not use the math library and instead rounds the value by adding
         // 0.5f when obtaining styled attributes. Check TypedValue#complexToDimensionPixelSize(...)
-        // These values are valid, sorted and distinct.
         int[] expectedSizesInPx = new int[] {
                 (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 5f, m)),
                 (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 11f, m)),
@@ -501,11 +525,8 @@
                 (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 43f, m)),
                 (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 53f, m))};
 
-        assertArrayEquals(expectedSizesInPx,
-                autoSizeTextViewUniform.getAutoSizeTextAvailableSizes());
-
         boolean containsValueFromExpectedSizes = false;
-        int textSize = (int) autoSizeTextViewUniform.getTextSize();
+        final int textSize = (int) autoSizeTextViewUniform.getTextSize();
         for (int i = 0; i < expectedSizesInPx.length; i++) {
             if (expectedSizesInPx[i] == textSize) {
                 containsValueFromExpectedSizes = true;
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java b/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java
index 7dbee1d..ead82cf 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java
@@ -33,7 +33,9 @@
 import android.provider.BaseColumns;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.MediumTest;
+import android.support.test.filters.Suppress;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.testutils.PollingCheck;
@@ -154,6 +156,8 @@
         verify(mockQueryTextListener, times(1)).onQueryTextChange("Di");
     }
 
+    @Suppress
+    @FlakyTest(bugId = 36702458)
     @Test
     public void testSuggestionSelection() throws Throwable {
         final SearchView.OnSuggestionListener mockSuggestionListener =
diff --git a/v7/cardview/Android.mk b/v7/cardview/Android.mk
index cd3b407..56fa996 100644
--- a/v7/cardview/Android.mk
+++ b/v7/cardview/Android.mk
@@ -25,10 +25,6 @@
 LOCAL_MODULE := android-support-v7-cardview
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,base) \
-    $(call all-java-files-under,gingerbread) \
-    $(call all-java-files-under,jellybean-mr1) \
-    $(call all-java-files-under,api21) \
     $(call all-java-files-under,src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/v7/cardview/build.gradle b/v7/cardview/build.gradle
index f45350e..b5a08ef 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -12,10 +12,6 @@
 
     sourceSets {
         main.java.srcDirs = [
-                'base',
-                'gingerbread',
-                'jellybean-mr1',
-                'api21',
                 'src'
         ]
         main.res.srcDir 'res'
diff --git a/v7/cardview/src/android/support/v7/widget/CardView.java b/v7/cardview/src/android/support/v7/widget/CardView.java
index 17a9cc4..fab9453 100644
--- a/v7/cardview/src/android/support/v7/widget/CardView.java
+++ b/v7/cardview/src/android/support/v7/widget/CardView.java
@@ -80,11 +80,11 @@
 
     static {
         if (Build.VERSION.SDK_INT >= 21) {
-            IMPL = new CardViewApi21();
+            IMPL = new CardViewApi21Impl();
         } else if (Build.VERSION.SDK_INT >= 17) {
-            IMPL = new CardViewJellybeanMr1();
+            IMPL = new CardViewApi17Impl();
         } else {
-            IMPL = new CardViewGingerbread();
+            IMPL = new CardViewBaseImpl();
         }
         IMPL.initStatic();
     }
@@ -187,7 +187,7 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        if (!(IMPL instanceof CardViewApi21)) {
+        if (!(IMPL instanceof CardViewApi21Impl)) {
             final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
             switch (widthMode) {
                 case MeasureSpec.EXACTLY:
diff --git a/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java b/v7/cardview/src/android/support/v7/widget/CardViewApi17Impl.java
similarity index 64%
rename from v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java
rename to v7/cardview/src/android/support/v7/widget/CardViewApi17Impl.java
index a9ed03f..3a1a4e1 100644
--- a/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java
+++ b/v7/cardview/src/android/support/v7/widget/CardViewApi17Impl.java
@@ -21,17 +21,17 @@
 import android.support.annotation.RequiresApi;
 
 @RequiresApi(17)
-class CardViewJellybeanMr1 extends CardViewGingerbread {
+class CardViewApi17Impl extends CardViewBaseImpl {
 
     @Override
     public void initStatic() {
-        RoundRectDrawableWithShadow.sRoundRectHelper
-                = new RoundRectDrawableWithShadow.RoundRectHelper() {
-            @Override
-            public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius,
-                    Paint paint) {
-                canvas.drawRoundRect(bounds, cornerRadius, cornerRadius, paint);
-            }
-        };
+        RoundRectDrawableWithShadow.sRoundRectHelper =
+                new RoundRectDrawableWithShadow.RoundRectHelper() {
+                    @Override
+                    public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius,
+                            Paint paint) {
+                        canvas.drawRoundRect(bounds, cornerRadius, cornerRadius, paint);
+                    }
+                };
     }
-}
\ No newline at end of file
+}
diff --git a/v7/cardview/api21/android/support/v7/widget/CardViewApi21.java b/v7/cardview/src/android/support/v7/widget/CardViewApi21Impl.java
similarity index 98%
rename from v7/cardview/api21/android/support/v7/widget/CardViewApi21.java
rename to v7/cardview/src/android/support/v7/widget/CardViewApi21Impl.java
index 7942895..7af50e5 100644
--- a/v7/cardview/api21/android/support/v7/widget/CardViewApi21.java
+++ b/v7/cardview/src/android/support/v7/widget/CardViewApi21Impl.java
@@ -22,7 +22,7 @@
 import android.view.View;
 
 @RequiresApi(21)
-class CardViewApi21 implements CardViewImpl {
+class CardViewApi21Impl implements CardViewImpl {
 
     @Override
     public void initialize(CardViewDelegate cardView, Context context,
@@ -120,4 +120,4 @@
     private RoundRectDrawable getCardBackground(CardViewDelegate cardView) {
         return ((RoundRectDrawable) cardView.getCardBackground());
     }
-}
\ No newline at end of file
+}
diff --git a/v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java b/v7/cardview/src/android/support/v7/widget/CardViewBaseImpl.java
similarity index 92%
rename from v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java
rename to v7/cardview/src/android/support/v7/widget/CardViewBaseImpl.java
index b779326..8cb38be 100644
--- a/v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java
+++ b/v7/cardview/src/android/support/v7/widget/CardViewBaseImpl.java
@@ -22,12 +22,10 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 
-@RequiresApi(9)
-class CardViewGingerbread implements CardViewImpl {
+class CardViewBaseImpl implements CardViewImpl {
 
-    final RectF sCornerRect = new RectF();
+    private final RectF mCornerRect = new RectF();
 
     @Override
     public void initStatic() {
@@ -45,21 +43,21 @@
                 if (cornerRadius >= 1f) {
                     // increment corner radius to account for half pixels.
                     float roundedCornerRadius = cornerRadius + .5f;
-                    sCornerRect.set(-roundedCornerRadius, -roundedCornerRadius, roundedCornerRadius,
+                    mCornerRect.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.drawArc(mCornerRect, 180, 90, true, paint);
                     canvas.translate(innerWidth, 0);
                     canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.drawArc(mCornerRect, 180, 90, true, paint);
                     canvas.translate(innerHeight, 0);
                     canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.drawArc(mCornerRect, 180, 90, true, paint);
                     canvas.translate(innerWidth, 0);
                     canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.drawArc(mCornerRect, 180, 90, true, paint);
                     canvas.restoreToCount(saved);
                     //draw top and bottom pieces
                     canvas.drawRect(bounds.left + roundedCornerRadius - 1f, bounds.top,
diff --git a/v7/cardview/base/android/support/v7/widget/CardViewDelegate.java b/v7/cardview/src/android/support/v7/widget/CardViewDelegate.java
similarity index 94%
rename from v7/cardview/base/android/support/v7/widget/CardViewDelegate.java
rename to v7/cardview/src/android/support/v7/widget/CardViewDelegate.java
index b710b46..7b1b83a 100644
--- a/v7/cardview/base/android/support/v7/widget/CardViewDelegate.java
+++ b/v7/cardview/src/android/support/v7/widget/CardViewDelegate.java
@@ -16,7 +16,6 @@
 package android.support.v7.widget;
 
 import android.graphics.drawable.Drawable;
-import android.support.annotation.RequiresApi;
 import android.view.View;
 
 /**
@@ -24,7 +23,6 @@
  * <p>
  * Necessary to resolve circular dependency between base CardView and platform implementations.
  */
-@RequiresApi(9)
 interface CardViewDelegate {
     void setCardBackground(Drawable drawable);
     Drawable getCardBackground();
@@ -33,4 +31,4 @@
     void setShadowPadding(int left, int top, int right, int bottom);
     void setMinWidthHeightInternal(int width, int height);
     View getCardView();
-}
\ No newline at end of file
+}
diff --git a/v7/cardview/base/android/support/v7/widget/CardViewImpl.java b/v7/cardview/src/android/support/v7/widget/CardViewImpl.java
similarity index 96%
rename from v7/cardview/base/android/support/v7/widget/CardViewImpl.java
rename to v7/cardview/src/android/support/v7/widget/CardViewImpl.java
index d9439ae..26799da 100644
--- a/v7/cardview/base/android/support/v7/widget/CardViewImpl.java
+++ b/v7/cardview/src/android/support/v7/widget/CardViewImpl.java
@@ -18,12 +18,10 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 
 /**
  * Interface for platform specific CardView implementations.
  */
-@RequiresApi(9)
 interface CardViewImpl {
     void initialize(CardViewDelegate cardView, Context context, ColorStateList backgroundColor,
             float radius, float elevation, float maxElevation);
diff --git a/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java b/v7/cardview/src/android/support/v7/widget/RoundRectDrawable.java
similarity index 97%
rename from v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java
rename to v7/cardview/src/android/support/v7/widget/RoundRectDrawable.java
index 09cc205..b8afdf7 100644
--- a/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java
+++ b/v7/cardview/src/android/support/v7/widget/RoundRectDrawable.java
@@ -15,6 +15,9 @@
  */
 package android.support.v7.widget;
 
+import static android.support.v7.widget.RoundRectDrawableWithShadow.calculateHorizontalPadding;
+import static android.support.v7.widget.RoundRectDrawableWithShadow.calculateVerticalPadding;
+
 import android.content.res.ColorStateList;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -30,9 +33,6 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 
-import static android.support.v7.widget.RoundRectDrawableWithShadow.calculateVerticalPadding;
-import static android.support.v7.widget.RoundRectDrawableWithShadow.calculateHorizontalPadding;
-
 /**
  * Very simple drawable that draws a rounded rectangle background with arbitrary corners and also
  * reports proper outline for Lollipop.
@@ -54,7 +54,7 @@
     private ColorStateList mTint;
     private PorterDuff.Mode mTintMode = PorterDuff.Mode.SRC_IN;
 
-    public RoundRectDrawable(ColorStateList backgroundColor, float radius) {
+    RoundRectDrawable(ColorStateList backgroundColor, float radius) {
         mRadius = radius;
         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
         setBackground(backgroundColor);
@@ -69,8 +69,8 @@
     }
 
     void setPadding(float padding, boolean insetForPadding, boolean insetForRadius) {
-        if (padding == mPadding && mInsetForPadding == insetForPadding &&
-                mInsetForRadius == insetForRadius) {
+        if (padding == mPadding && mInsetForPadding == insetForPadding
+                && mInsetForRadius == insetForRadius) {
             return;
         }
         mPadding = padding;
diff --git a/v7/cardview/gingerbread/android/support/v7/widget/RoundRectDrawableWithShadow.java b/v7/cardview/src/android/support/v7/widget/RoundRectDrawableWithShadow.java
similarity index 90%
rename from v7/cardview/gingerbread/android/support/v7/widget/RoundRectDrawableWithShadow.java
rename to v7/cardview/src/android/support/v7/widget/RoundRectDrawableWithShadow.java
index 3b33ccf..3250f8d 100644
--- a/v7/cardview/gingerbread/android/support/v7/widget/RoundRectDrawableWithShadow.java
+++ b/v7/cardview/src/android/support/v7/widget/RoundRectDrawableWithShadow.java
@@ -30,20 +30,18 @@
 import android.graphics.Shader;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 import android.support.v7.cardview.R;
 
 /**
  * A rounded rectangle drawable which also includes a shadow around.
  */
-@RequiresApi(9)
 class RoundRectDrawableWithShadow extends Drawable {
     // used to calculate content padding
-    final static double COS_45 = Math.cos(Math.toRadians(45));
+    private static final double COS_45 = Math.cos(Math.toRadians(45));
 
-    final static float SHADOW_MULTIPLIER = 1.5f;
+    private static final float SHADOW_MULTIPLIER = 1.5f;
 
-    final int mInsetShadow; // extra shadow to avoid gaps between card and shadow
+    private final int mInsetShadow; // extra shadow to avoid gaps between card and shadow
 
     /*
     * This helper is set by CardView implementations.
@@ -53,29 +51,26 @@
     * */
     static RoundRectHelper sRoundRectHelper;
 
-    Paint mPaint;
+    private Paint mPaint;
 
-    Paint mCornerShadowPaint;
+    private Paint mCornerShadowPaint;
 
-    Paint mEdgeShadowPaint;
+    private Paint mEdgeShadowPaint;
 
-    final RectF mCardBounds;
+    private final RectF mCardBounds;
 
-    float mCornerRadius;
+    private float mCornerRadius;
 
-    Path mCornerShadowPath;
-
-    // updated value with inset
-    float mMaxShadowSize;
+    private Path mCornerShadowPath;
 
     // actual value set by developer
-    float mRawMaxShadowSize;
+    private float mRawMaxShadowSize;
 
     // multiplied value to account for shadow offset
-    float mShadowSize;
+    private float mShadowSize;
 
     // actual value set by developer
-    float mRawShadowSize;
+    private float mRawShadowSize;
 
     private ColorStateList mBackground;
 
@@ -124,7 +119,7 @@
         return i;
     }
 
-    public void setAddPaddingForCorners(boolean addPaddingForCorners) {
+    void setAddPaddingForCorners(boolean addPaddingForCorners) {
         mAddPaddingForCorners = addPaddingForCorners;
         invalidateSelf();
     }
@@ -142,14 +137,14 @@
         mDirty = true;
     }
 
-    void setShadowSize(float shadowSize, float maxShadowSize) {
+    private void setShadowSize(float shadowSize, float maxShadowSize) {
         if (shadowSize < 0f) {
-            throw new IllegalArgumentException("Invalid shadow size " + shadowSize +
-                    ". Must be >= 0");
+            throw new IllegalArgumentException("Invalid shadow size " + shadowSize
+                    + ". Must be >= 0");
         }
         if (maxShadowSize < 0f) {
-            throw new IllegalArgumentException("Invalid max shadow size " + maxShadowSize +
-                    ". Must be >= 0");
+            throw new IllegalArgumentException("Invalid max shadow size " + maxShadowSize
+                    + ". Must be >= 0");
         }
         shadowSize = toEven(shadowSize);
         maxShadowSize = toEven(maxShadowSize);
@@ -164,8 +159,7 @@
         }
         mRawShadowSize = shadowSize;
         mRawMaxShadowSize = maxShadowSize;
-        mShadowSize = (int)(shadowSize * SHADOW_MULTIPLIER + mInsetShadow + .5f);
-        mMaxShadowSize = maxShadowSize + mInsetShadow;
+        mShadowSize = (int) (shadowSize * SHADOW_MULTIPLIER + mInsetShadow + .5f);
         mDirty = true;
         invalidateSelf();
     }
@@ -227,8 +221,7 @@
 
     void setCornerRadius(float radius) {
         if (radius < 0f) {
-            throw new IllegalArgumentException("Invalid radius " + radius +
-                ". Must be >= 0");
+            throw new IllegalArgumentException("Invalid radius " + radius + ". Must be >= 0");
         }
         radius = (int) (radius + .5f);
         if (mCornerRadius == radius) {
@@ -320,8 +313,8 @@
         float startRatio = mCornerRadius / (mCornerRadius + mShadowSize);
         mCornerShadowPaint.setShader(new RadialGradient(0, 0, mCornerRadius + mShadowSize,
                 new int[]{mShadowStartColor, mShadowStartColor, mShadowEndColor},
-                new float[]{0f, startRatio, 1f}
-                , Shader.TileMode.CLAMP));
+                new float[]{0f, startRatio, 1f},
+                Shader.TileMode.CLAMP));
 
         // we offset the content shadowSize/2 pixels up to make it more realistic.
         // this is why edge shadow shader has some extra space
@@ -368,8 +361,8 @@
     }
 
     float getMinWidth() {
-        final float content = 2 *
-                Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow + mRawMaxShadowSize / 2);
+        final float content = 2
+                * Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow + mRawMaxShadowSize / 2);
         return content + (mRawMaxShadowSize + mInsetShadow) * 2;
     }
 
@@ -388,7 +381,7 @@
         return mBackground;
     }
 
-    static interface RoundRectHelper {
+    interface RoundRectHelper {
         void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius, Paint paint);
     }
 }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
index 2e5b983..9f2d396 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
@@ -187,7 +187,7 @@
         mListView.setAdapter(mAdapter);
         mListView.setOnItemClickListener(mAdapter);
         mListView.setEmptyView(findViewById(android.R.id.empty));
-        mTitleView = (TextView) findViewById(R.id.mr_chooser_title);
+        mTitleView = findViewById(R.id.mr_chooser_title);
 
         updateLayout();
     }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 4d40610..3d33d24 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -334,14 +334,14 @@
 
         ClickListener listener = new ClickListener();
 
-        mExpandableAreaLayout = (FrameLayout) findViewById(R.id.mr_expandable_area);
+        mExpandableAreaLayout = findViewById(R.id.mr_expandable_area);
         mExpandableAreaLayout.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 dismiss();
             }
         });
-        mDialogAreaLayout = (LinearLayout) findViewById(R.id.mr_dialog_area);
+        mDialogAreaLayout = findViewById(R.id.mr_dialog_area);
         mDialogAreaLayout.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -349,21 +349,21 @@
             }
         });
         int color = MediaRouterThemeHelper.getButtonTextColor(mContext);
-        mDisconnectButton = (Button) findViewById(BUTTON_DISCONNECT_RES_ID);
+        mDisconnectButton = findViewById(BUTTON_DISCONNECT_RES_ID);
         mDisconnectButton.setText(R.string.mr_controller_disconnect);
         mDisconnectButton.setTextColor(color);
         mDisconnectButton.setOnClickListener(listener);
 
-        mStopCastingButton = (Button) findViewById(BUTTON_STOP_RES_ID);
+        mStopCastingButton = findViewById(BUTTON_STOP_RES_ID);
         mStopCastingButton.setText(R.string.mr_controller_stop_casting);
         mStopCastingButton.setTextColor(color);
         mStopCastingButton.setOnClickListener(listener);
 
-        mRouteNameTextView = (TextView) findViewById(R.id.mr_name);
-        mCloseButton = (ImageButton) findViewById(R.id.mr_close);
+        mRouteNameTextView = findViewById(R.id.mr_name);
+        mCloseButton = findViewById(R.id.mr_close);
         mCloseButton.setOnClickListener(listener);
-        mCustomControlLayout = (FrameLayout) findViewById(R.id.mr_custom_control);
-        mDefaultControlLayout = (FrameLayout) findViewById(R.id.mr_default_control);
+        mCustomControlLayout = findViewById(R.id.mr_custom_control);
+        mDefaultControlLayout = findViewById(R.id.mr_default_control);
 
         // Start the session activity when a content item (album art, title or subtitle) is clicked.
         View.OnClickListener onClickListener = new View.OnClickListener() {
@@ -382,27 +382,27 @@
                 }
             }
         };
-        mArtView = (ImageView) findViewById(R.id.mr_art);
+        mArtView = findViewById(R.id.mr_art);
         mArtView.setOnClickListener(onClickListener);
         findViewById(R.id.mr_control_title_container).setOnClickListener(onClickListener);
 
-        mMediaMainControlLayout = (LinearLayout) findViewById(R.id.mr_media_main_control);
+        mMediaMainControlLayout = findViewById(R.id.mr_media_main_control);
         mDividerView = findViewById(R.id.mr_control_divider);
 
-        mPlaybackControlLayout = (RelativeLayout) findViewById(R.id.mr_playback_control);
-        mTitleView = (TextView) findViewById(R.id.mr_control_title);
-        mSubtitleView = (TextView) findViewById(R.id.mr_control_subtitle);
-        mPlaybackControlButton = (ImageButton) findViewById(R.id.mr_control_playback_ctrl);
+        mPlaybackControlLayout = findViewById(R.id.mr_playback_control);
+        mTitleView = findViewById(R.id.mr_control_title);
+        mSubtitleView = findViewById(R.id.mr_control_subtitle);
+        mPlaybackControlButton = findViewById(R.id.mr_control_playback_ctrl);
         mPlaybackControlButton.setOnClickListener(listener);
 
-        mVolumeControlLayout = (LinearLayout) findViewById(R.id.mr_volume_control);
+        mVolumeControlLayout = findViewById(R.id.mr_volume_control);
         mVolumeControlLayout.setVisibility(View.GONE);
-        mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
+        mVolumeSlider = findViewById(R.id.mr_volume_slider);
         mVolumeSlider.setTag(mRoute);
         mVolumeChangeListener = new VolumeChangeListener();
         mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
 
-        mVolumeGroupList = (OverlayListView) findViewById(R.id.mr_volume_group_list);
+        mVolumeGroupList = findViewById(R.id.mr_volume_group_list);
         mGroupMemberRoutes = new ArrayList<MediaRouter.RouteInfo>();
         mVolumeGroupAdapter = new VolumeGroupAdapter(mVolumeGroupList.getContext(),
                 mGroupMemberRoutes);
@@ -417,7 +417,7 @@
         mVolumeSliderMap.put(mRoute, mVolumeSlider);
 
         mGroupExpandCollapseButton =
-                (MediaRouteExpandCollapseButton) findViewById(R.id.mr_group_expand_collapse);
+                findViewById(R.id.mr_group_expand_collapse);
         mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/v7/preference/res/values/attrs.xml b/v7/preference/res/values/attrs.xml
index b3d28d2..2f8bc11 100644
--- a/v7/preference/res/values/attrs.xml
+++ b/v7/preference/res/values/attrs.xml
@@ -152,6 +152,19 @@
         <!-- Whether the preference allows displaying divider below it -->
         <attr name="allowDividerBelow" format="boolean" />
 
+        <!-- Whether to use single line for the preference title text. By default, preference title
+             will be constrained to one line, so the default value of this attribute is true. -->
+        <attr name="singleLineTitle" format="boolean" />
+        <attr name="android:singleLineTitle" />
+
+        <!-- Whether the space for the preference icon view will be reserved. If set to true, the
+             preference will be offset as if it would have the icon and thus aligned with other
+             preferences having icons. By default, preference icon view visibility will be set to
+             GONE when there is no icon provided, so the default value of this attribute is false.
+             -->
+        <attr name="iconSpaceReserved" format="boolean" />
+        <attr name="android:iconSpaceReserved" />
+
     </declare-styleable>
 
     <!-- Base attributes available to CheckBoxPreference. -->
diff --git a/v7/preference/src/android/support/v7/preference/DropDownPreference.java b/v7/preference/src/android/support/v7/preference/DropDownPreference.java
index 89c9d2e..3638b71 100644
--- a/v7/preference/src/android/support/v7/preference/DropDownPreference.java
+++ b/v7/preference/src/android/support/v7/preference/DropDownPreference.java
@@ -35,7 +35,7 @@
 public class DropDownPreference extends ListPreference {
 
     private final Context mContext;
-    private final ArrayAdapter<String> mAdapter;
+    private final ArrayAdapter mAdapter;
 
     private Spinner mSpinner;
 
diff --git a/v7/preference/src/android/support/v7/preference/Preference.java b/v7/preference/src/android/support/v7/preference/Preference.java
index f960c83..59d4a79 100644
--- a/v7/preference/src/android/support/v7/preference/Preference.java
+++ b/v7/preference/src/android/support/v7/preference/Preference.java
@@ -81,6 +81,8 @@
  * @attr name android:persistent
  * @attr name android:defaultValue
  * @attr name android:shouldDisableView
+ * @attr name android:singleLineTitle
+ * @attr name android:iconSpaceReserved
  */
 public class Preference implements Comparable<Preference> {
     /**
@@ -141,6 +143,8 @@
 
     private boolean mAllowDividerAbove = true;
     private boolean mAllowDividerBelow = true;
+    private boolean mSingleLineTitle = true;
+    private boolean mIconSpaceReserved;
 
     /**
      * @see #setShouldDisableView(boolean)
@@ -308,6 +312,12 @@
                 TypedArrayUtils.getBoolean(a, R.styleable.Preference_shouldDisableView,
                         R.styleable.Preference_android_shouldDisableView, true);
 
+        mSingleLineTitle = TypedArrayUtils.getBoolean(a, R.styleable.Preference_singleLineTitle,
+                R.styleable.Preference_android_singleLineTitle, true);
+
+        mIconSpaceReserved = TypedArrayUtils.getBoolean(a, R.styleable.Preference_iconSpaceReserved,
+                R.styleable.Preference_android_iconSpaceReserved, false);
+
         a.recycle();
     }
 
@@ -551,6 +561,7 @@
             if (!TextUtils.isEmpty(title)) {
                 titleView.setText(title);
                 titleView.setVisibility(View.VISIBLE);
+                titleView.setSingleLine(mSingleLineTitle);
             } else {
                 titleView.setVisibility(View.GONE);
             }
@@ -577,7 +588,11 @@
                     imageView.setImageDrawable(mIcon);
                 }
             }
-            imageView.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
+            if (mIcon != null) {
+                imageView.setVisibility(View.VISIBLE);
+            } else {
+                imageView.setVisibility(mIconSpaceReserved ? View.INVISIBLE : View.GONE);
+            }
         }
 
         View imageFrame = holder.findViewById(R.id.icon_frame);
@@ -965,6 +980,56 @@
     }
 
     /**
+     * Sets whether to constrain the title of this Preference to a single line instead of
+     * letting it wrap onto multiple lines.
+     *
+     * @param singleLineTitle set {@code true} if the title should be constrained to one line
+     *
+     * @attr ref R.styleable#Preference_android_singleLineTitle
+     */
+    public void setSingleLineTitle(boolean singleLineTitle) {
+        mSingleLineTitle = singleLineTitle;
+    }
+
+    /**
+     * Gets whether the title of this preference is constrained to a single line.
+     *
+     * @see #setSingleLineTitle(boolean)
+     * @return {@code true} if the title of this preference is constrained to a single line
+     *
+     * @attr ref R.styleable#Preference_android_singleLineTitle
+     */
+    public boolean isSingleLineTitle() {
+        return mSingleLineTitle;
+    }
+
+    /**
+     * Sets whether to reserve the space of this Preference icon view when no icon is provided. If
+     * set to true, the preference will be offset as if it would have the icon and thus aligned with
+     * other preferences having icons.
+     *
+     * @param iconSpaceReserved set {@code true} if the space for the icon view should be reserved
+     *
+     * @attr ref R.styleable#Preference_android_iconSpaceReserved
+     */
+    public void setIconSpaceReserved(boolean iconSpaceReserved) {
+        mIconSpaceReserved = iconSpaceReserved;
+        notifyChanged();
+    }
+
+    /**
+     * Returns whether the space of this preference icon view is reserved.
+     *
+     * @see #setIconSpaceReserved(boolean)
+     * @return {@code true} if the space of this preference icon view is reserved
+     *
+     * @attr ref R.styleable#Preference_android_iconSpaceReserved
+     */
+    public boolean isIconSpaceReserved() {
+        return mIconSpaceReserved;
+    }
+
+    /**
      * Call this method after the user changes the preference, but before the
      * internal state is set. This allows the client to ignore the user value.
      *
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
index feef983..d1c630f 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
@@ -22,6 +22,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.support.annotation.RestrictTo;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.widget.RecyclerView;
@@ -333,8 +334,8 @@
         Drawable background
                 = a.getDrawable(R.styleable.BackgroundStyle_android_selectableItemBackground);
         if (background == null) {
-            background = parent.getContext().getResources()
-                    .getDrawable(android.R.drawable.list_selector_background);
+            background = ContextCompat.getDrawable(parent.getContext(),
+                    android.R.drawable.list_selector_background);
         }
         a.recycle();
 
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java b/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
index 262fcdf..5a6426a 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
@@ -32,9 +32,7 @@
     private boolean mDividerAllowedAbove;
     private boolean mDividerAllowedBelow;
 
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.TESTS)
-    public PreferenceViewHolder(View itemView) {
+    /* package */ PreferenceViewHolder(View itemView) {
         super(itemView);
 
         // Pre-cache the views that we know in advance we'll want to find
@@ -46,6 +44,12 @@
                 itemView.findViewById(AndroidResources.ANDROID_R_ICON_FRAME));
     }
 
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.TESTS)
+    public static PreferenceViewHolder createInstanceForTests(View itemView) {
+        return new PreferenceViewHolder(itemView);
+    }
+
     /**
      * Returns a cached reference to a subview managed by this object. If the view reference is not
      * yet cached, it falls back to calling {@link View#findViewById(int)} and caches the result.
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index b94876f..274c91e 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -12,6 +12,7 @@
     androidTestCompile (libs.espresso_core) {
         exclude module: 'support-annotations'
     }
+    androidTestCompile libs.junit
     androidTestCompile libs.mockito_core
     androidTestCompile libs.dexmaker
     androidTestCompile libs.dexmaker_mockito
diff --git a/v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java b/v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java
index 3da64bc..80524eb 100644
--- a/v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java
+++ b/v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java
@@ -17,13 +17,13 @@
 
 package android.support.v7.widget;
 
-import android.annotation.SuppressLint;
 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.annotation.NonNull;
+import android.util.Log;
 import android.view.View;
 import android.widget.LinearLayout;
 
@@ -42,6 +42,7 @@
     public static final int HORIZONTAL = LinearLayout.HORIZONTAL;
     public static final int VERTICAL = LinearLayout.VERTICAL;
 
+    private static final String TAG = "DividerItem";
     private static final int[] ATTRS = new int[]{ android.R.attr.listDivider };
 
     private Drawable mDivider;
@@ -63,6 +64,10 @@
     public DividerItemDecoration(Context context, int orientation) {
         final TypedArray a = context.obtainStyledAttributes(ATTRS);
         mDivider = a.getDrawable(0);
+        if (mDivider == null) {
+            Log.w(TAG, "@android:attr/listDivider was not set in the theme used for this "
+                    + "DividerItemDecoration. Please set that attribute all call setDrawable()");
+        }
         a.recycle();
         setOrientation(orientation);
     }
@@ -95,7 +100,7 @@
 
     @Override
     public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
-        if (parent.getLayoutManager() == null) {
+        if (parent.getLayoutManager() == null || mDivider == null) {
             return;
         }
         if (mOrientation == VERTICAL) {
@@ -105,11 +110,11 @@
         }
     }
 
-    @SuppressLint("NewApi")
     private void drawVertical(Canvas canvas, RecyclerView parent) {
         canvas.save();
         final int left;
         final int right;
+        //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
         if (parent.getClipToPadding()) {
             left = parent.getPaddingLeft();
             right = parent.getWidth() - parent.getPaddingRight();
@@ -132,11 +137,11 @@
         canvas.restore();
     }
 
-    @SuppressLint("NewApi")
     private void drawHorizontal(Canvas canvas, RecyclerView parent) {
         canvas.save();
         final int top;
         final int bottom;
+        //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
         if (parent.getClipToPadding()) {
             top = parent.getPaddingTop();
             bottom = parent.getHeight() - parent.getPaddingBottom();
@@ -162,6 +167,10 @@
     @Override
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
             RecyclerView.State state) {
+        if (mDivider == null) {
+            outRect.set(0, 0, 0, 0);
+            return;
+        }
         if (mOrientation == VERTICAL) {
             outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
         } else {
diff --git a/v7/recyclerview/src/android/support/v7/widget/GapWorker.java b/v7/recyclerview/src/android/support/v7/widget/GapWorker.java
index e72d48d..c7e81b5 100644
--- a/v7/recyclerview/src/android/support/v7/widget/GapWorker.java
+++ b/v7/recyclerview/src/android/support/v7/widget/GapWorker.java
@@ -279,21 +279,27 @@
         }
 
         RecyclerView.Recycler recycler = view.mRecycler;
-        RecyclerView.ViewHolder holder = recycler.tryGetViewHolderForPositionByDeadline(
-                position, false, deadlineNs);
+        RecyclerView.ViewHolder holder;
+        try {
+            view.onEnterLayoutOrScroll();
+            holder = recycler.tryGetViewHolderForPositionByDeadline(
+                    position, false, deadlineNs);
 
-        if (holder != null) {
-            if (holder.isBound() && !holder.isInvalid()) {
-                // Only give the view a chance to go into the cache if binding succeeded
-                // Note that we must use public method, since item may need cleanup
-                recycler.recycleView(holder.itemView);
-            } else {
-                // Didn't bind, so we can't cache the view, but it will stay in the pool until
-                // next prefetch/traversal. If a View fails to bind, it means we didn't have
-                // enough time prior to the deadline (and won't for other instances of this
-                // type, during this GapWorker prefetch pass).
-                recycler.addViewHolderToRecycledViewPool(holder, false);
+            if (holder != null) {
+                if (holder.isBound() && !holder.isInvalid()) {
+                    // Only give the view a chance to go into the cache if binding succeeded
+                    // Note that we must use public method, since item may need cleanup
+                    recycler.recycleView(holder.itemView);
+                } else {
+                    // Didn't bind, so we can't cache the view, but it will stay in the pool until
+                    // next prefetch/traversal. If a View fails to bind, it means we didn't have
+                    // enough time prior to the deadline (and won't for other instances of this
+                    // type, during this GapWorker prefetch pass).
+                    recycler.addViewHolderToRecycledViewPool(holder, false);
+                }
             }
+        } finally {
+            view.onExitLayoutOrScroll(false);
         }
         return holder;
     }
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
index e65dcde..a72975d 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
@@ -1284,15 +1284,6 @@
         return mInitialPrefetchItemCount;
     }
 
-
-    /**
-     * @deprecated Use {@link #getInitialPrefetchItemCount()} instead.
-     */
-    @Deprecated
-    public int getInitialItemPrefetchCount() {
-        return getInitialPrefetchItemCount();
-    }
-
     @Override
     public void collectAdjacentPrefetchPositions(int dx, int dy, RecyclerView.State state,
             LayoutPrefetchRegistry layoutPrefetchRegistry) {
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index fe5a454..0d57617 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -740,6 +740,11 @@
                 final View child = RecyclerView.this.getChildAt(index);
                 if (child != null) {
                     dispatchChildDetached(child);
+
+                    // Clear any android.view.animation.Animation that may prevent the item from
+                    // detaching when being removed. If a child is re-added before the
+                    // lazy detach occurs, it will receive invalid attach/detach sequencing.
+                    child.clearAnimation();
                 }
                 if (VERBOSE_TRACING) {
                     TraceCompat.beginSection("RV removeViewAt");
@@ -759,7 +764,13 @@
             public void removeAllViews() {
                 final int count = getChildCount();
                 for (int i = 0; i < count; i++) {
-                    dispatchChildDetached(getChildAt(i));
+                    View child = getChildAt(i);
+                    dispatchChildDetached(child);
+
+                    // Clear any android.view.animation.Animation that may prevent the item from
+                    // detaching when being removed. If a child is re-added before the
+                    // lazy detach occurs, it will receive invalid attach/detach sequencing.
+                    child.clearAnimation();
                 }
                 RecyclerView.this.removeAllViews();
             }
@@ -3166,6 +3177,10 @@
     }
 
     void onExitLayoutOrScroll() {
+        onExitLayoutOrScroll(true);
+    }
+
+    void onExitLayoutOrScroll(boolean enableChangeEvents) {
         mLayoutOrScrollCounter--;
         if (mLayoutOrScrollCounter < 1) {
             if (DEBUG && mLayoutOrScrollCounter < 0) {
@@ -3173,8 +3188,10 @@
                         + "Some calls are not matching");
             }
             mLayoutOrScrollCounter = 0;
-            dispatchContentChangedIfNecessary();
-            dispatchPendingImportantForAccessibilityChanges();
+            if (enableChangeEvents) {
+                dispatchContentChangedIfNecessary();
+                dispatchPendingImportantForAccessibilityChanges();
+            }
         }
     }
 
@@ -3827,6 +3844,12 @@
                         + " is not flagged as tmp detached." + vh);
             }
         }
+
+        // Clear any android.view.animation.Animation that may prevent the item from
+        // detaching when being removed. If a child is re-added before the
+        // lazy detach occurs, it will receive invalid attach/detach sequencing.
+        child.clearAnimation();
+
         dispatchChildDetached(child);
         super.removeDetachedView(child, animate);
     }
diff --git a/v7/recyclerview/tests/res/values/styles.xml b/v7/recyclerview/tests/res/values/styles.xml
index f7aad81..d2b5a82 100644
--- a/v7/recyclerview/tests/res/values/styles.xml
+++ b/v7/recyclerview/tests/res/values/styles.xml
@@ -1,6 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="noAnimTheme" parent="android:Theme">
         <item name="android:windowAnimationStyle">@null</item>
     </style>
+    <style name="nullListDivider" parent="android:Theme">
+        <item name="android:listDivider">@null</item>
+    </style>
 </resources>
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
new file mode 100644
index 0000000..6459522
--- /dev/null
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.graphics.Canvas;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.recyclerview.test.R;
+import android.view.ContextThemeWrapper;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link DividerItemDecoration}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DividerItemDecorationTest {
+    private static final String[] STRINGS = {"Foo", "Bar", "Great"};
+
+    @Test
+    public void testNullListDivider() {
+        final Context context = InstrumentationRegistry.getContext();
+        RecyclerView rv = new RecyclerView(context);
+        rv.setLayoutManager(new LinearLayoutManager(context));
+        rv.setAdapter(new MyAdapter(STRINGS));
+        DividerItemDecoration decoration = new DividerItemDecoration(
+                new ContextThemeWrapper(context, R.style.nullListDivider),
+                DividerItemDecoration.HORIZONTAL);
+        rv.addItemDecoration(decoration);
+        rv.layout(0, 0, 1000, 1000);
+        decoration.onDraw(new Canvas(), rv, null);
+    }
+
+    private static class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
+        private String[] mDataset;
+
+        public static class ViewHolder extends RecyclerView.ViewHolder {
+            TextView mTextView;
+            ViewHolder(TextView v) {
+                super(v);
+                mTextView = v;
+            }
+        }
+
+        MyAdapter(String[] myDataset) {
+            mDataset = myDataset;
+        }
+
+        @Override
+        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new ViewHolder(new TextView(parent.getContext()));
+        }
+
+        @Override
+        public void onBindViewHolder(ViewHolder holder, int position) {
+            holder.mTextView.setText(mDataset[position]);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mDataset.length;
+        }
+    }
+}
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
index f682593..1006e1b 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
@@ -267,6 +267,38 @@
     }
 
     @Test
+    public void prefetchIsComputingLayout() {
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+
+        // 100x100 pixel views
+        RecyclerView.Adapter mockAdapter = mock(RecyclerView.Adapter.class);
+        when(mockAdapter.onCreateViewHolder(any(ViewGroup.class), anyInt()))
+                .thenAnswer(new Answer<RecyclerView.ViewHolder>() {
+                    @Override
+                    public RecyclerView.ViewHolder answer(InvocationOnMock invocation)
+                            throws Throwable {
+                        View view = new View(getContext());
+                        view.setMinimumWidth(100);
+                        view.setMinimumHeight(100);
+                        assertTrue(mRecyclerView.isComputingLayout());
+                        return new RecyclerView.ViewHolder(view) {};
+                    }
+                });
+        when(mockAdapter.getItemCount()).thenReturn(100);
+        mRecyclerView.setAdapter(mockAdapter);
+
+        layout(100, 100);
+
+        verify(mockAdapter, times(1)).onCreateViewHolder(mRecyclerView, 0);
+
+        // prefetch an item, should still observe isComputingLayout in that create
+        mRecyclerView.mPrefetchRegistry.setPrefetchVector(0, 1);
+        mRecyclerView.mGapWorker.prefetch(RecyclerView.FOREVER_NS);
+
+        verify(mockAdapter, times(2)).onCreateViewHolder(mRecyclerView, 0);
+    }
+
+    @Test
     public void prefetchDrag() {
         // event dispatch requires a parent
         ViewGroup parent = new FrameLayout(getContext());
diff --git a/wearable/res/values/attrs.xml b/wearable/res/values/attrs.xml
index bdf3675..5a1f0b7 100644
--- a/wearable/res/values/attrs.xml
+++ b/wearable/res/values/attrs.xml
@@ -21,12 +21,12 @@
 
 <resources>
     <!-- Attributes that can be used with any member view of
-        {@link android.support.wearable.view.BoxInsetLayout}.
+        {@link android.support.wearable.widget.BoxInsetLayout}.
         These attributes are specified with the rest of a view's normal attributes
         (such as {@link android.R.attr#background}, but will be parsed by the view's parent and
         ignored by the child.
         <p>The values defined here correspond to the base layout attribute
-        class {@link android.support.wearable.view.BoxInsetLayout.LayoutParams}. -->
+        class {@link android.support.wearable.widget.BoxInsetLayout.LayoutParams}. -->
     <declare-styleable name="BoxInsetLayout_Layout">
         <!-- The types of insets this view can force on its children. The view will respect the
              defined values of other child attributes such as ones provided by
@@ -49,7 +49,7 @@
     </declare-styleable>
 
     <!-- Attributes that can be used with any
-        {@link android.support.wearable.view.WearableRecyclerView}.
+        {@link android.support.wearable.widget.WearableRecyclerView}.
         These attributes relate to the circular scrolling gesture of the view. -->
     <declare-styleable name="WearableRecyclerView">
         <!-- Taps within this radius and the radius of the screen are considered close enough to the
diff --git a/wearable/src/android/support/wearable/view/BoxInsetLayout.java b/wearable/src/android/support/wearable/widget/BoxInsetLayout.java
similarity index 99%
rename from wearable/src/android/support/wearable/view/BoxInsetLayout.java
rename to wearable/src/android/support/wearable/widget/BoxInsetLayout.java
index d33a942..92c64b6 100644
--- a/wearable/src/android/support/wearable/view/BoxInsetLayout.java
+++ b/wearable/src/android/support/wearable/widget/BoxInsetLayout.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -24,6 +24,7 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
 import android.support.annotation.StyleRes;
 import android.support.annotation.UiThread;
 import android.support.wearable.R;
@@ -412,6 +413,7 @@
     public static class LayoutParams extends FrameLayout.LayoutParams {
 
         /** @hide */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @IntDef({BOX_NONE, BOX_LEFT, BOX_TOP, BOX_RIGHT, BOX_BOTTOM, BOX_ALL})
         @Retention(RetentionPolicy.SOURCE)
         public @interface BoxedEdges {}
diff --git a/wearable/src/android/support/wearable/view/CurvedOffsettingLayoutManager.java b/wearable/src/android/support/wearable/widget/CurvingLayoutCallback.java
similarity index 73%
rename from wearable/src/android/support/wearable/view/CurvedOffsettingLayoutManager.java
rename to wearable/src/android/support/wearable/widget/CurvingLayoutCallback.java
index f4b925f..6b2545e 100644
--- a/wearable/src/android/support/wearable/view/CurvedOffsettingLayoutManager.java
+++ b/wearable/src/android/support/wearable/widget/CurvingLayoutCallback.java
@@ -13,21 +13,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.support.wearable.view;
+
+package android.support.wearable.widget;
 
 import android.content.Context;
 import android.graphics.Path;
 import android.graphics.PathMeasure;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.widget.RecyclerView;
 import android.support.wearable.R;
 import android.view.View;
 
 /**
- * This implementation of {@link WearableRecyclerView.OffsettingLayoutManager} provides basic
- * offsetting logic for updating child layout. For round devices it offsets the children
- * horizontally to make them appear to travel around a circle. For square devices it aligns them in
- * a straight list.
+ * An implementation of the {@link WearableLinearLayoutManager.LayoutCallback} aligning the children
+ * of the associated {@link WearableRecyclerView} along a pre-defined vertical curve.
  */
-public class CurvedOffsettingLayoutManager extends WearableRecyclerView.OffsettingLayoutManager {
+public class CurvingLayoutCallback extends WearableLinearLayoutManager.LayoutCallback {
     private static final float EPSILON = 0.001f;
 
     private final Path mCurvePath;
@@ -42,28 +43,25 @@
     private final float[] mPathTangent = new float[2];
     private final float[] mAnchorOffsetXY = new float[2];
 
-    private WearableRecyclerView mParentView;
+    private RecyclerView mParentView;
     private boolean mIsScreenRound;
     private int mLayoutWidth;
     private int mLayoutHeight;
 
-    public CurvedOffsettingLayoutManager(Context context) {
-        super(context);
+    public CurvingLayoutCallback(Context context) {
         mCurvePath = new Path();
         mPathMeasure = new PathMeasure();
+        mIsScreenRound = context.getResources().getConfiguration().isScreenRound();
+        mXCurveOffset = context.getResources().getDimensionPixelSize(
+                R.dimen.wrv_curve_default_x_offset);
     }
 
     @Override
-    public void updateChild(View child, WearableRecyclerView parent) {
+    public void onLayoutFinished(View child, RecyclerView parent) {
         if (mParentView != parent || (mParentView != null && (
                 mParentView.getWidth() != parent.getWidth()
                         || mParentView.getHeight() != parent.getHeight()))) {
             mParentView = parent;
-            mIsScreenRound =
-                    mParentView.getContext().getResources().getConfiguration().isScreenRound();
-            mXCurveOffset =
-                    mParentView.getResources().getDimensionPixelSize(
-                            R.dimen.wrv_curve_default_x_offset);
             mLayoutWidth = mParentView.getWidth();
             mLayoutHeight = mParentView.getHeight();
         }
@@ -81,11 +79,13 @@
             mPathMeasure.getPosTan(mYScrollProgress * mPathLength, mPathPoints, mPathTangent);
 
             boolean topClusterRisk =
-                    Math.abs(mPathPoints[1] - mCurveBottom) < EPSILON && minCenter < mPathPoints[1];
+                    Math.abs(mPathPoints[1] - mCurveBottom) < EPSILON
+                            && minCenter < mPathPoints[1];
             boolean bottomClusterRisk =
-                    Math.abs(mPathPoints[1] - mCurveTop) < EPSILON && maxCenter > mPathPoints[1];
-            // Continue offsetting the child along the straight-line part of the curve, if it has
-            // not gone off the screen when it reached the end of the original curve.
+                    Math.abs(mPathPoints[1] - mCurveTop) < EPSILON
+                            && maxCenter > mPathPoints[1];
+            // Continue offsetting the child along the straight-line part of the curve, if it
+            // has not gone off the screen when it reached the end of the original curve.
             if (topClusterRisk || bottomClusterRisk) {
                 mPathPoints[1] = verticalAnchor;
                 mPathPoints[0] = (Math.abs(verticalAnchor) * mLineGradient);
@@ -96,21 +96,33 @@
             child.offsetLeftAndRight(newLeft - child.getLeft());
             float verticalTranslation = mPathPoints[1] - verticalAnchor;
             child.setTranslationY(verticalTranslation);
+        } else {
+            child.setTranslationY(0);
         }
     }
 
     /**
-     * Override this method if you wish to adjust the anchor coordinates for each child view during
-     * a layout pass. In the override set the new desired anchor coordinates in the provided array.
-     * The coordinates should be provided in relation to the child view.
+     * Override this method if you wish to adjust the anchor coordinates for each child view
+     * during a layout pass. In the override set the new desired anchor coordinates in
+     * the provided array. The coordinates should be provided in relation to the child view.
      *
      * @param child          The child view to which the anchor coordinates will apply.
-     * @param anchorOffsetXY The anchor coordinates for the provided child view, by default set to
-     *                       a pre-defined constant on the horizontal axis and half of the child
-     *                       height on the vertical axis (vertical center).
+     * @param anchorOffsetXY The anchor coordinates for the provided child view, by default set
+     *                       to a pre-defined constant on the horizontal axis and half of the
+     *                       child height on the vertical axis (vertical center).
      */
     public void adjustAnchorOffsetXY(View child, float[] anchorOffsetXY) {
         return;
+    };
+
+    @VisibleForTesting
+    void setRound(boolean isScreenRound) {
+        mIsScreenRound = isScreenRound;
+    }
+
+    @VisibleForTesting
+    void setOffset(int offset) {
+        mXCurveOffset = offset;
     }
 
     /** Set up the initial layout for round screens. */
diff --git a/wearable/src/android/support/wearable/view/ScrollManager.java b/wearable/src/android/support/wearable/widget/ScrollManager.java
similarity index 99%
rename from wearable/src/android/support/wearable/view/ScrollManager.java
rename to wearable/src/android/support/wearable/widget/ScrollManager.java
index 4699d4b..dd90ad4 100644
--- a/wearable/src/android/support/wearable/view/ScrollManager.java
+++ b/wearable/src/android/support/wearable/widget/ScrollManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
diff --git a/wearable/src/android/support/wearable/view/SwipeDismissFrameLayout.java b/wearable/src/android/support/wearable/widget/SwipeDismissFrameLayout.java
similarity index 88%
rename from wearable/src/android/support/wearable/view/SwipeDismissFrameLayout.java
rename to wearable/src/android/support/wearable/widget/SwipeDismissFrameLayout.java
index ef1ae78..a84766f 100644
--- a/wearable/src/android/support/wearable/view/SwipeDismissFrameLayout.java
+++ b/wearable/src/android/support/wearable/widget/SwipeDismissFrameLayout.java
@@ -14,12 +14,9 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+package android.support.wearable.widget;
 
 import android.content.Context;
-import android.support.annotation.RestrictTo;
 import android.support.annotation.UiThread;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -60,30 +57,39 @@
          * If any one instance of this Callback returns false for a given set of coordinates,
          * swipe-to-dismiss will not be allowed to start in that point.
          *
+         * @param layout The layout associated with this callback.
          * @param xDown The x coordinate of the initial {@link android.view.MotionEvent#ACTION_DOWN}
          *              event for this motion.
          * @param yDown The y coordinate of the initial {@link android.view.MotionEvent#ACTION_DOWN}
          *              event for this motion.
          * @return true if this gesture should be recognized as a swipe to dismiss gesture, false
          * otherwise.
-         *
-         * @hide
          */
-        @RestrictTo(LIBRARY_GROUP)
-        //TODO: Unhide this or rework the functionality to be based on nested scrolling.
-        boolean onPreSwipeStart(float xDown, float yDown) {
+        boolean onPreSwipeStart(SwipeDismissFrameLayout layout, float xDown, float yDown) {
             return true;
         }
 
-        /** Notifies listeners that the view is now being dragged as part of a dismiss gesture. */
-        public void onSwipeStarted() {
+        /**
+         * Notifies listeners that the view is now being dragged as part of a dismiss gesture.
+         *
+         * @param layout The layout associated with this callback.
+        */
+        public void onSwipeStarted(SwipeDismissFrameLayout layout) {
         }
 
-        /** Notifies listeners that the swipe gesture has ended without a dismissal. */
-        public void onSwipeCancelled() {
+        /**
+         * Notifies listeners that the swipe gesture has ended without a dismissal.
+         *
+         * @param layout The layout associated with this callback.
+         */
+        public void onSwipeCanceled(SwipeDismissFrameLayout layout) {
         }
 
-        /** Notifies listeners the dismissal is complete and the view now off screen. */
+        /**
+         * Notifies listeners the dismissal is complete and the view now off screen.
+         *
+         * @param layout The layout associated with this callback.
+         */
         public void onDismissed(SwipeDismissFrameLayout layout) {
         }
     }
@@ -195,7 +201,7 @@
      * Resets this view to the original state. This method cancels any pending animations on this
      * view and resets the alpha as well as x translation values.
      */
-    public void reset() {
+    private void resetTranslationAndAlpha() {
         animate().cancel();
         setTranslationX(0);
         setAlpha(1);
@@ -207,7 +213,7 @@
         @Override
         public boolean onPreSwipe(SwipeDismissLayout layout, float xDown, float yDown) {
             for (Callback callback : mCallbacks) {
-                if (!callback.onPreSwipeStart(xDown, yDown)) {
+                if (!callback.onPreSwipeStart(SwipeDismissFrameLayout.this, xDown, yDown)) {
                     return false;
                 }
             }
@@ -254,16 +260,16 @@
             if (!mStarted) {
                 for (int i = mCallbacks.size() - 1; i >= 0; i--) {
                     Callback callbacks = mCallbacks.get(i);
-                    callbacks.onSwipeStarted();
+                    callbacks.onSwipeStarted(SwipeDismissFrameLayout.this);
                 }
                 mStarted = true;
             }
         }
 
         @Override
-        public void onSwipeCancelled(SwipeDismissLayout layout) {
+        public void onSwipeCanceled(SwipeDismissLayout layout) {
             if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onSwipeCancelled() run swipe cancel animation");
+                Log.d(TAG, "onSwipeCanceled() run swipe cancel animation");
             }
             mStarted = false;
             animate()
@@ -277,8 +283,9 @@
                                 public void run() {
                                     for (int i = mCallbacks.size() - 1; i >= 0; i--) {
                                         Callback callbacks = mCallbacks.get(i);
-                                        callbacks.onSwipeCancelled();
+                                        callbacks.onSwipeCanceled(SwipeDismissFrameLayout.this);
                                     }
+                                    resetTranslationAndAlpha();
                                 }
                             });
         }
diff --git a/wearable/src/android/support/wearable/view/SwipeDismissLayout.java b/wearable/src/android/support/wearable/widget/SwipeDismissLayout.java
similarity index 93%
rename from wearable/src/android/support/wearable/view/SwipeDismissLayout.java
rename to wearable/src/android/support/wearable/widget/SwipeDismissLayout.java
index 3213012..78fef0b 100644
--- a/wearable/src/android/support/wearable/view/SwipeDismissLayout.java
+++ b/wearable/src/android/support/wearable/widget/SwipeDismissLayout.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
@@ -101,7 +101,7 @@
          *
          * @param layout    the layout associated with this listener
          */
-        void onSwipeCancelled(SwipeDismissLayout layout);
+        void onSwipeCanceled(SwipeDismissLayout layout);
     }
 
     // Cached ViewConfiguration and system-wide constant values
@@ -124,6 +124,7 @@
     private boolean mDiscardIntercept;
     private VelocityTracker mVelocityTracker;
     private float mTranslationX;
+    private boolean mDisallowIntercept;
 
     @Nullable
     private OnPreSwipeListener mOnPreSwipeListener;
@@ -207,6 +208,14 @@
     }
 
     @Override
+    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+        mDisallowIntercept = disallowIntercept;
+        if (getParent() != null) {
+            getParent().requestDisallowInterceptTouchEvent(disallowIntercept);
+        }
+    }
+
+    @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         if (!mSwipeable) {
             return super.onInterceptTouchEvent(ev);
@@ -267,7 +276,8 @@
                 break;
         }
 
-        if (mOnPreSwipeListener == null || mOnPreSwipeListener.onPreSwipe(this, mDownX, mDownY)) {
+        if ((mOnPreSwipeListener == null && !mDisallowIntercept)
+                || mOnPreSwipeListener.onPreSwipe(this, mDownX, mDownY)) {
             return (!mDiscardIntercept && mSwiping);
         }
         return false;
@@ -302,6 +312,11 @@
         if (mVelocityTracker == null) {
             return super.onTouchEvent(ev);
         }
+
+        if (mOnPreSwipeListener != null && !mOnPreSwipeListener.onPreSwipe(this, mDownX, mDownY)) {
+            return super.onTouchEvent(ev);
+        }
+
         // offset because the view is translated during swipe
         ev.offsetLocation(mTranslationX, 0);
         switch (ev.getActionMasked()) {
@@ -345,9 +360,9 @@
         }
     }
 
-    void cancel() {
+    private void cancel() {
         if (mProgressListener != null) {
-            mProgressListener.onSwipeCancelled(this);
+            mProgressListener.onSwipeCanceled(this);
         }
     }
 
@@ -364,6 +379,7 @@
         mDismissed = false;
         mDiscardIntercept = false;
         mCanStartSwipe = true;
+        mDisallowIntercept = false;
     }
 
     private void updateSwiping(MotionEvent ev) {
@@ -371,7 +387,11 @@
             float deltaX = ev.getRawX() - mDownX;
             float deltaY = ev.getRawY() - mDownY;
             if (isPotentialSwipe(deltaX, deltaY)) {
-                mSwiping = mCanStartSwipe && Math.abs(deltaY) < Math.abs(deltaX);
+                // There are three conditions on which we want want to start swiping:
+                // 1. The swipe is from left to right AND
+                // 2. It is horizontal AND
+                // 3. We actually can start swiping
+                mSwiping = mCanStartSwipe && Math.abs(deltaY) < Math.abs(deltaX) && deltaX > 0;
                 mCanStartSwipe = mSwiping;
             }
         }
diff --git a/wearable/src/android/support/wearable/widget/WearableLinearLayoutManager.java b/wearable/src/android/support/wearable/widget/WearableLinearLayoutManager.java
new file mode 100644
index 0000000..935ee0c
--- /dev/null
+++ b/wearable/src/android/support/wearable/widget/WearableLinearLayoutManager.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wearable.widget;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+/**
+ * This wear-specific implementation of {@link LinearLayoutManager} provides basic
+ * offsetting logic for updating child layout. For round devices it offsets the children
+ * horizontally to make them appear to travel around a circle. For square devices it aligns them in
+ * a straight list. This functionality is provided by the {@link CurvingLayoutCallback} which is
+ * set when constructing the this class with its default constructor
+ * {@link #WearableLinearLayoutManager(Context)}.
+ */
+public class WearableLinearLayoutManager extends LinearLayoutManager {
+
+    @Nullable
+    private LayoutCallback mLayoutCallback;
+
+    /**
+     * Callback for interacting with layout passes.
+     */
+    public abstract static class LayoutCallback {
+        /**
+         * Override this method to implement custom child layout behavior on scroll. It is called
+         * at the end of each layout pass of the view (including scrolling) and enables you to
+         * modify any property of the child view. Examples include scaling the children based on
+         * their distance from the center of the parent, or changing the translation of the children
+         * to create an illusion of the path they are moving along.
+         *
+         * @param child  the current child to be affected.
+         * @param parent the {@link RecyclerView} parent that this class is attached to.
+         */
+        public abstract void onLayoutFinished(View child, RecyclerView parent);
+    }
+
+    /**
+     * Creates a {@link WearableLinearLayoutManager} for a vertical list.
+     *
+     * @param context Current context, will be used to access resources.
+     * @param layoutCallback Callback to be associated with this {@link WearableLinearLayoutManager}
+     */
+    public WearableLinearLayoutManager(Context context, LayoutCallback layoutCallback) {
+        super(context, VERTICAL, false);
+        mLayoutCallback = layoutCallback;
+    }
+
+    /**
+     * Creates a {@link WearableLinearLayoutManager} for a vertical list.
+     *
+     * @param context Current context, will be used to access resources.
+     */
+    public WearableLinearLayoutManager(Context context) {
+        this(context, new CurvingLayoutCallback(context));
+    }
+
+    /**
+     * Set a particular instance of the layout callback for this
+     * {@link WearableLinearLayoutManager}. The callback will be called on the Ui thread.
+     *
+     * @param layoutCallback
+     */
+    public void setLayoutCallback(@Nullable LayoutCallback layoutCallback) {
+        mLayoutCallback = layoutCallback;
+    }
+
+    /**
+     * @return the current {@link LayoutCallback} associated with this
+     * {@link WearableLinearLayoutManager}.
+     */
+    @Nullable
+    public LayoutCallback getLayoutCallback() {
+        return mLayoutCallback;
+    }
+
+    @Override
+    public int scrollVerticallyBy(
+            int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
+        int scrolled = super.scrollVerticallyBy(dy, recycler, state);
+
+        updateLayout();
+        return scrolled;
+    }
+
+    @Override
+    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+        super.onLayoutChildren(recycler, state);
+        if (getChildCount() == 0) {
+            return;
+        }
+
+        updateLayout();
+    }
+
+    private void updateLayout() {
+        if (mLayoutCallback == null) {
+            return;
+        }
+        final int childCount = getChildCount();
+        for (int count = 0; count < childCount; count++) {
+            View child = getChildAt(count);
+            mLayoutCallback.onLayoutFinished(child, (WearableRecyclerView) child.getParent());
+        }
+    }
+}
diff --git a/wearable/src/android/support/wearable/view/WearableRecyclerView.java b/wearable/src/android/support/wearable/widget/WearableRecyclerView.java
similarity index 82%
rename from wearable/src/android/support/wearable/view/WearableRecyclerView.java
rename to wearable/src/android/support/wearable/widget/WearableRecyclerView.java
index c13230f..0c854da 100644
--- a/wearable/src/android/support/wearable/view/WearableRecyclerView.java
+++ b/wearable/src/android/support/wearable/widget/WearableRecyclerView.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.annotation.TargetApi;
 import android.content.Context;
@@ -22,7 +22,6 @@
 import android.graphics.Point;
 import android.os.Build;
 import android.support.annotation.Nullable;
-import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.wearable.R;
 import android.util.AttributeSet;
@@ -92,7 +91,7 @@
                     a.getBoolean(
                             R.styleable.WearableRecyclerView_circularScrollingGestureEnabled,
                             mCircularScrollingEnabled));
-            setBezelWidthFraction(
+            setBezelFraction(
                     a.getFloat(R.styleable.WearableRecyclerView_bezelWidth,
                             mScrollManager.getBezelWidth()));
             setScrollDegreesPerScreen(
@@ -170,7 +169,7 @@
      * or the are considered for the start of this scrolling gesture.
      *
      * @see #setScrollDegreesPerScreen(float)
-     * @see #setBezelWidthFraction(float)
+     * @see #setBezelFraction(float)
      */
     public void setCircularScrollingGestureEnabled(boolean circularScrollingGestureEnabled) {
         mCircularScrollingEnabled = circularScrollingGestureEnabled;
@@ -215,7 +214,7 @@
      * bezel to be candidates for circular scrolling. Expressed as a fraction of the screen's
      * radius. The default is the whole screen i.e 1.0f.
      */
-    public void setBezelWidthFraction(float fraction) {
+    public void setBezelFraction(float fraction) {
         mScrollManager.setBezelWidth(fraction);
     }
 
@@ -223,9 +222,9 @@
      * Returns the current bezel width for circular scrolling as a fraction of the screen's
      * radius.
      *
-     * @see #setBezelWidthFraction(float)
+     * @see #setBezelFraction(float)
      */
-    public float getBezelWidthFraction() {
+    public float getBezelFraction() {
         return mScrollManager.getBezelWidth();
     }
 
@@ -256,57 +255,7 @@
      * Returns whether the view is currently configured to center the edge children. See {@link
      * #setEdgeItemsCenteringEnabled} for details.
      */
-    public boolean getEdgeItemsCenteringEnabled() {
+    public boolean isEdgeItemsCenteringEnabled() {
         return mEdgeItemsCenteringEnabled;
     }
-
-    /**
-     * This class defines the offsetting logic for updating layout of children in a
-     * WearableRecyclerView.
-     */
-    public abstract static class OffsettingLayoutManager extends LinearLayoutManager {
-        /**
-         * Creates a vertical OffsettingLinearLayoutManager
-         *
-         * @param context Current context, will be used to access resources.
-         */
-        public OffsettingLayoutManager(Context context) {
-            super(context, VERTICAL, false);
-        }
-
-        @Override
-        public int scrollVerticallyBy(
-                int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
-            int scrolled = super.scrollVerticallyBy(dy, recycler, state);
-
-            updateLayout();
-            return scrolled;
-        }
-
-        @Override
-        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
-            super.onLayoutChildren(recycler, state);
-            if (getChildCount() == 0) {
-                return;
-            }
-
-            updateLayout();
-        }
-
-        private void updateLayout() {
-            final int childCount = getChildCount();
-            for (int count = 0; count < childCount; count++) {
-                View child = getChildAt(count);
-                updateChild(child, (WearableRecyclerView) child.getParent());
-            }
-        }
-
-        /**
-         * Override this method if you wish to implement custom child layout behavior on scroll.
-         *
-         * @param child the current child to be affected.
-         * @param parent the {@link WearableRecyclerView} parent that this helper is attached to.
-         */
-        public abstract void updateChild(View child, WearableRecyclerView parent);
-    }
 }
diff --git a/wearable/tests/AndroidManifest.xml b/wearable/tests/AndroidManifest.xml
index 638532d..5cb9908 100644
--- a/wearable/tests/AndroidManifest.xml
+++ b/wearable/tests/AndroidManifest.xml
@@ -25,20 +25,21 @@
     <uses-permission android:name="android.permission.WAKE_LOCK" />
 
     <application android:supportsRtl="true">
-        <activity android:name="android.support.wearable.view.LayoutTestActivity">
+        <activity android:name="android.support.wearable.widget.LayoutTestActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name="android.support.wearable.view.SwipeDismissFrameLayoutTestActivity">
+        <activity android:name="android.support.wearable.widget.SwipeDismissFrameLayoutTestActivity"
+                  android:theme="@style/AppThemeNoSwipe" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
 
-        <activity android:name="android.support.wearable.view.WearableRecyclerViewTestActivity">
+        <activity android:name="android.support.wearable.widget.WearableRecyclerViewTestActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
diff --git a/wearable/tests/res/layout/box_inset_layout_testcase_1.xml b/wearable/tests/res/layout/box_inset_layout_testcase_1.xml
index 3c2bec9..3d194d3 100644
--- a/wearable/tests/res/layout/box_inset_layout_testcase_1.xml
+++ b/wearable/tests/res/layout/box_inset_layout_testcase_1.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<android.support.wearable.widget.BoxInsetLayout 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"
@@ -18,4 +18,4 @@
             android:text="Test Case 1"/>
     </FrameLayout>
 
-</android.support.wearable.view.BoxInsetLayout>
+</android.support.wearable.widget.BoxInsetLayout>
diff --git a/wearable/tests/res/layout/box_inset_layout_testcase_2.xml b/wearable/tests/res/layout/box_inset_layout_testcase_2.xml
index 839667c..e6c065b 100644
--- a/wearable/tests/res/layout/box_inset_layout_testcase_2.xml
+++ b/wearable/tests/res/layout/box_inset_layout_testcase_2.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.wearable.view.BoxInsetLayout
+<android.support.wearable.widget.BoxInsetLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
@@ -63,4 +63,4 @@
     </FrameLayout>
 
 
-</android.support.wearable.view.BoxInsetLayout>
+</android.support.wearable.widget.BoxInsetLayout>
diff --git a/wearable/tests/res/layout/box_inset_layout_testcase_3.xml b/wearable/tests/res/layout/box_inset_layout_testcase_3.xml
index 350de13..5c3faf0 100644
--- a/wearable/tests/res/layout/box_inset_layout_testcase_3.xml
+++ b/wearable/tests/res/layout/box_inset_layout_testcase_3.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.wearable.view.BoxInsetLayout
+<android.support.wearable.widget.BoxInsetLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
@@ -62,4 +62,4 @@
             android:text="Bottom Left"/>
     </FrameLayout>
 
-</android.support.wearable.view.BoxInsetLayout>
+</android.support.wearable.widget.BoxInsetLayout>
diff --git a/wearable/tests/res/layout/box_inset_layout_testcase_4.xml b/wearable/tests/res/layout/box_inset_layout_testcase_4.xml
index a702e4c..7a92d18 100644
--- a/wearable/tests/res/layout/box_inset_layout_testcase_4.xml
+++ b/wearable/tests/res/layout/box_inset_layout_testcase_4.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <android.support.wearable.view.BoxInsetLayout
+    <android.support.wearable.widget.BoxInsetLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
@@ -27,6 +27,6 @@
             app:boxedEdges="left|right" />
 
 
-    </android.support.wearable.view.BoxInsetLayout>
+    </android.support.wearable.widget.BoxInsetLayout>
 
 </ScrollView>
diff --git a/wearable/tests/res/layout/swipe_dismiss_layout_testcase_1.xml b/wearable/tests/res/layout/swipe_dismiss_layout_testcase_1.xml
index 4f2a0b8..3eb9197 100644
--- a/wearable/tests/res/layout/swipe_dismiss_layout_testcase_1.xml
+++ b/wearable/tests/res/layout/swipe_dismiss_layout_testcase_1.xml
@@ -14,7 +14,7 @@
   ~ limitations under the License.
   -->
 
-<android.support.wearable.view.SwipeDismissFrameLayout
+<android.support.wearable.widget.SwipeDismissFrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
@@ -37,4 +37,4 @@
         android:textStyle="bold"
         tools:ignore="HardcodedText,RtlHardcoded" />
 
-</android.support.wearable.view.SwipeDismissFrameLayout>
+</android.support.wearable.widget.SwipeDismissFrameLayout>
diff --git a/wearable/tests/res/layout/swipe_dismiss_layout_testcase_2.xml b/wearable/tests/res/layout/swipe_dismiss_layout_testcase_2.xml
index ab866eb..7a08597 100644
--- a/wearable/tests/res/layout/swipe_dismiss_layout_testcase_2.xml
+++ b/wearable/tests/res/layout/swipe_dismiss_layout_testcase_2.xml
@@ -14,7 +14,7 @@
   ~ limitations under the License.
   -->
 
-<android.support.wearable.view.SwipeDismissFrameLayout
+<android.support.wearable.widget.SwipeDismissFrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -29,4 +29,4 @@
         android:paddingTop="80dp"
         android:id="@+id/recycler_container"/>
 
-</android.support.wearable.view.SwipeDismissFrameLayout>
+</android.support.wearable.widget.SwipeDismissFrameLayout>
diff --git a/wearable/tests/res/layout/wearable_recycler_view_basic.xml b/wearable/tests/res/layout/wearable_recycler_view_basic.xml
index 3f2c255..9af0048 100644
--- a/wearable/tests/res/layout/wearable_recycler_view_basic.xml
+++ b/wearable/tests/res/layout/wearable_recycler_view_basic.xml
@@ -15,10 +15,10 @@
   ~ limitations under the License.
   -->
 
-<android.support.wearable.view.WearableRecyclerView
+<android.support.wearable.widget.WearableRecyclerView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/wrv">
 
-</android.support.wearable.view.WearableRecyclerView>
+</android.support.wearable.widget.WearableRecyclerView>
diff --git a/wearable/tests/res/values/styles.xml b/wearable/tests/res/values/styles.xml
new file mode 100644
index 0000000..6733488
--- /dev/null
+++ b/wearable/tests/res/values/styles.xml
@@ -0,0 +1,21 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="AppThemeNoSwipe" parent="@android:style/Theme.DeviceDefault.Light">
+        <item name="android:windowSwipeToDismiss">false</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/wearable/tests/src/android/support/wearable/view/CurvedOffsettingLayoutManagerTest.java b/wearable/tests/src/android/support/wearable/view/CurvedOffsettingLayoutManagerTest.java
deleted file mode 100644
index 27c9b76..0000000
--- a/wearable/tests/src/android/support/wearable/view/CurvedOffsettingLayoutManagerTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.wearable.view;
-
-import static junit.framework.Assert.assertEquals;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.wearable.test.R;
-import android.support.wearable.view.util.WakeLockRule;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class CurvedOffsettingLayoutManagerTest {
-
-    @Rule
-    public final WakeLockRule wakeLock = new WakeLockRule();
-
-    @Rule
-    public final ActivityTestRule<WearableRecyclerViewTestActivity> mActivityRule =
-            new ActivityTestRule<>(WearableRecyclerViewTestActivity.class, true, true);
-
-    CurvedOffsettingLayoutManager mCurvedOffsettingLayoutManagerUnderTest;
-
-    @Before
-    public void setUp() throws Throwable {
-        MockitoAnnotations.initMocks(this);
-        mCurvedOffsettingLayoutManagerUnderTest =
-                new CurvedOffsettingLayoutManager(mActivityRule.getActivity());
-    }
-
-    @Test
-    public void testOffsetting() throws Throwable {
-        ViewFetchingRunnable customRunnable = new ViewFetchingRunnable(){
-            @Override
-            public void run() {
-                WearableRecyclerView wrv =
-                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
-                wrv.setLayoutParams(new FrameLayout.LayoutParams(390, 390));
-                wrv.invalidate();
-                mIdViewMap.put(R.id.wrv, wrv);
-            }
-        };
-        mActivityRule.runOnUiThread(customRunnable);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        WearableRecyclerView wrv = (WearableRecyclerView) customRunnable.mIdViewMap.get(R.id.wrv);
-        int offset = wrv.getResources().getDimensionPixelSize(R.dimen.wrv_curve_default_x_offset);
-        View child1 = wrv.getChildAt(0);
-        View child2 = wrv.getChildAt(1);
-        View child3 = wrv.getChildAt(2);
-        View child4 = wrv.getChildAt(3);
-        View child5 = wrv.getChildAt(4);
-
-        // When the child is updated by the curved offsetting helper
-        if (child1 != null) {
-            mCurvedOffsettingLayoutManagerUnderTest.updateChild(child1, wrv);
-        }
-        if (child2 != null) {
-            mCurvedOffsettingLayoutManagerUnderTest.updateChild(child2, wrv);
-        }
-        if (child3 != null) {
-            mCurvedOffsettingLayoutManagerUnderTest.updateChild(child3, wrv);
-        }
-        if (child4 != null) {
-            mCurvedOffsettingLayoutManagerUnderTest.updateChild(child4, wrv);
-        }
-        if (child5 != null) {
-            mCurvedOffsettingLayoutManagerUnderTest.updateChild(child5, wrv);
-        }
-        if (wrv.getResources().getConfiguration().isScreenRound()) {
-            // Then the left position and the translation of the child is modified if the screen is
-            // round
-            if (child1 != null) {
-                assertEquals(162 - offset, child1.getLeft(), 1);
-                assertEquals(-9.5, child1.getTranslationY(), 1);
-            }
-            if (child2 != null) {
-                assertEquals(129 - offset, child2.getLeft(), 1);
-                assertEquals(-16.7, child2.getTranslationY(), 1);
-            }
-            if (child3 != null) {
-                assertEquals(99 - offset, child3.getLeft(), 1);
-                assertEquals(-19.9, child3.getTranslationY(), 1);
-            }
-            if (child4 != null) {
-                assertEquals(76 - offset, child4.getLeft(), 1);
-                assertEquals(-17.9, child4.getTranslationY(), 1);
-            }
-            if (child5 != null) {
-                assertEquals(59 - offset, child5.getLeft(), 1);
-                assertEquals(-13, child5.getTranslationY(), 1);
-            }
-        } else {
-            // Then the child is not modified if the screen is not round.
-            if (child1 != null) {
-                assertEquals(0, child1.getLeft());
-                assertEquals(0.0f, child1.getTranslationY());
-            }
-            if (child2 != null) {
-                assertEquals(0, child2.getLeft());
-                assertEquals(0.0f, child2.getTranslationY());
-            }
-            if (child3 != null) {
-                assertEquals(0, child3.getLeft());
-                assertEquals(0.0f, child3.getTranslationY());
-            }
-            if (child4 != null) {
-                assertEquals(0, child4.getLeft());
-                assertEquals(0.0f, child4.getTranslationY());
-            }
-            if (child5 != null) {
-                assertEquals(0, child5.getLeft());
-                assertEquals(0.0f, child5.getTranslationY());
-            }
-        }
-    }
-
-    private abstract class ViewFetchingRunnable implements Runnable {
-        Map<Integer, View> mIdViewMap = new HashMap();
-    }
-}
diff --git a/wearable/tests/src/android/support/wearable/view/BoxInsetLayoutTest.java b/wearable/tests/src/android/support/wearable/widget/BoxInsetLayoutTest.java
similarity index 94%
rename from wearable/tests/src/android/support/wearable/view/BoxInsetLayoutTest.java
rename to wearable/tests/src/android/support/wearable/widget/BoxInsetLayoutTest.java
index 16d92d11..c7daaa3 100644
--- a/wearable/tests/src/android/support/wearable/view/BoxInsetLayoutTest.java
+++ b/wearable/tests/src/android/support/wearable/widget/BoxInsetLayoutTest.java
@@ -14,20 +14,20 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.wearable.view.util.MoreViewAssertions.approximateBottom;
-import static android.support.wearable.view.util.MoreViewAssertions.approximateTop;
-import static android.support.wearable.view.util.MoreViewAssertions.bottom;
-import static android.support.wearable.view.util.MoreViewAssertions.left;
-import static android.support.wearable.view.util.MoreViewAssertions.right;
-import static android.support.wearable.view.util.MoreViewAssertions.screenBottom;
-import static android.support.wearable.view.util.MoreViewAssertions.screenLeft;
-import static android.support.wearable.view.util.MoreViewAssertions.screenRight;
-import static android.support.wearable.view.util.MoreViewAssertions.screenTop;
-import static android.support.wearable.view.util.MoreViewAssertions.top;
+import static android.support.wearable.widget.util.MoreViewAssertions.approximateBottom;
+import static android.support.wearable.widget.util.MoreViewAssertions.approximateTop;
+import static android.support.wearable.widget.util.MoreViewAssertions.bottom;
+import static android.support.wearable.widget.util.MoreViewAssertions.left;
+import static android.support.wearable.widget.util.MoreViewAssertions.right;
+import static android.support.wearable.widget.util.MoreViewAssertions.screenBottom;
+import static android.support.wearable.widget.util.MoreViewAssertions.screenLeft;
+import static android.support.wearable.widget.util.MoreViewAssertions.screenRight;
+import static android.support.wearable.widget.util.MoreViewAssertions.screenTop;
+import static android.support.wearable.widget.util.MoreViewAssertions.top;
 
 import static org.hamcrest.Matchers.closeTo;
 import static org.hamcrest.Matchers.equalTo;
@@ -39,7 +39,7 @@
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.wearable.test.R;
-import android.support.wearable.view.util.WakeLockRule;
+import android.support.wearable.widget.util.WakeLockRule;
 import android.util.DisplayMetrics;
 import android.view.View;
 
diff --git a/wearable/tests/src/android/support/wearable/view/LayoutTestActivity.java b/wearable/tests/src/android/support/wearable/widget/LayoutTestActivity.java
similarity index 96%
rename from wearable/tests/src/android/support/wearable/view/LayoutTestActivity.java
rename to wearable/tests/src/android/support/wearable/widget/LayoutTestActivity.java
index 3fa7396..64d1103 100644
--- a/wearable/tests/src/android/support/wearable/view/LayoutTestActivity.java
+++ b/wearable/tests/src/android/support/wearable/widget/LayoutTestActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.app.Activity;
 import android.content.Intent;
diff --git a/wearable/tests/src/android/support/wearable/view/ScrollManagerTest.java b/wearable/tests/src/android/support/wearable/widget/ScrollManagerTest.java
similarity index 98%
rename from wearable/tests/src/android/support/wearable/view/ScrollManagerTest.java
rename to wearable/tests/src/android/support/wearable/widget/ScrollManagerTest.java
index 73b2bd0..127cd90 100644
--- a/wearable/tests/src/android/support/wearable/view/ScrollManagerTest.java
+++ b/wearable/tests/src/android/support/wearable/widget/ScrollManagerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -26,7 +26,7 @@
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
-import android.support.wearable.view.util.WakeLockRule;
+import android.support.wearable.widget.util.WakeLockRule;
 import android.view.MotionEvent;
 
 import org.junit.Before;
diff --git a/wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTest.java b/wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTest.java
similarity index 77%
rename from wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTest.java
rename to wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTest.java
index b595138..b3b22ac 100644
--- a/wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTest.java
+++ b/wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTest.java
@@ -14,14 +14,16 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.swipeRight;
 import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.wearable.view.util.AsyncViewActions.waitForMatchingView;
-import static android.support.wearable.view.util.MoreViewAssertions.withTranslationX;
+import static android.support.wearable.widget.util.AsyncViewActions.waitForMatchingView;
+import static android.support.wearable.widget.util.MoreViewAssertions
+        .withPositiveVerticalScrollOffset;
+import static android.support.wearable.widget.util.MoreViewAssertions.withTranslationX;
 
 import static org.hamcrest.Matchers.allOf;
 import static org.junit.Assert.assertFalse;
@@ -29,6 +31,7 @@
 
 import android.app.Activity;
 import android.content.Intent;
+import android.graphics.RectF;
 import android.support.annotation.IdRes;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.espresso.ViewAction;
@@ -40,8 +43,10 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.widget.RecyclerView;
 import android.support.wearable.test.R;
-import android.support.wearable.view.util.WakeLockRule;
+import android.support.wearable.widget.util.ArcSwipe;
+import android.support.wearable.widget.util.WakeLockRule;
 import android.view.View;
 
 import org.junit.Rule;
@@ -66,6 +71,7 @@
             );
 
     private int mLayoutWidth;
+    private int mLayoutHeight;
 
     @Test
     @SmallTest
@@ -173,6 +179,7 @@
         onView(withId(R.id.swipe_dismiss_root)).perform(swipeRight());
         // THEN the layout is not dismissed and not hidden
         assertNotHidden(R.id.swipe_dismiss_root);
+        assertNotDismissed(R.id.swipe_dismiss_root);
     }
 
     @Test
@@ -193,20 +200,33 @@
 
     @Test
     @SmallTest
-    public void testSwipeDoesNotDismissViewIfScrollable() {
+    public void testSwipeDoesNotDismissViewIfScrollable() throws Throwable {
         // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
-        setUpSwipeDismissWithRecyclerView();
+        setUpSwipeDismissWithHorizontalRecyclerView();
+        activityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Activity activity = activityRule.getActivity();
+                RecyclerView testLayout = activity.findViewById(R.id.recycler_container);
+                // Scroll to a position from which the child is scrollable.
+                testLayout.scrollToPosition(50);
+            }
+        });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         // WHEN we perform a swipe to dismiss from the center of the screen.
         onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromCenter());
         // THEN the layout is not dismissed and not hidden
         assertNotHidden(R.id.swipe_dismiss_root);
+        assertNotDismissed(R.id.swipe_dismiss_root);
     }
 
+
     @Test
     @SmallTest
     public void testEdgeSwipeDoesDismissViewIfScrollable() {
         // GIVEN a freshly setup SwipeDismissFrameLayout with dismiss turned off.
-        setUpSwipeDismissWithRecyclerView();
+        setUpSwipeDismissWithHorizontalRecyclerView();
         // WHEN we perform a swipe to dismiss from the left edge of the screen.
         onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
         // THEN the layout is dismissed and hidden
@@ -224,6 +244,7 @@
         onView(withId(R.id.swipe_dismiss_root)).perform(swipeRightFromLeftEdge());
         // THEN the layout is not dismissed and not hidden
         assertNotHidden(R.id.swipe_dismiss_root);
+        assertNotDismissed(R.id.swipe_dismiss_root);
     }
 
     @Test
@@ -250,6 +271,22 @@
      assertPeeking(R.id.top_drawer);
      }*/
 
+    @Test
+    @SmallTest
+    public void testArcSwipeDoesNotTriggerDismiss() throws Throwable {
+        // GIVEN a freshly setup SwipeDismissFrameLayout with vertically scrollable content
+        setUpSwipeDismissWithVerticalRecyclerView();
+        int center = mLayoutHeight / 2;
+        int halfBound = mLayoutWidth / 2;
+        RectF bounds = new RectF(0, center - halfBound, mLayoutWidth, center + halfBound);
+        // WHEN the view is scrolled on an arc from top to bottom.
+        onView(withId(R.id.swipe_dismiss_root)).perform(swipeTopFromBottomOnArc(bounds));
+        // THEN the layout is not dismissed and not hidden.
+        assertNotHidden(R.id.swipe_dismiss_root);
+        // AND the content view is scrolled.
+        assertScrolledY(R.id.recycler_container);
+    }
+
     /**
      * Set ups the simplest possible layout for test cases - a {@link SwipeDismissFrameLayout} with
      * a single static child.
@@ -263,17 +300,32 @@
         setDismissCallback();
     }
 
+
     /**
      * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
-     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a
-     * {@link android.support.v7.widget.RecyclerView} as a child, ready to accept an adapter.
+     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a horizontal {@link
+     * android.support.v7.widget.RecyclerView} as a child, ready to accept an adapter.
      */
-    private void setUpSwipeDismissWithRecyclerView() {
-        activityRule.launchActivity(
-                new Intent()
-                        .putExtra(
-                                LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                                R.layout.swipe_dismiss_layout_testcase_2));
+    private void setUpSwipeDismissWithHorizontalRecyclerView() {
+        Intent launchIntent = new Intent();
+        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.swipe_dismiss_layout_testcase_2);
+        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, true);
+        activityRule.launchActivity(launchIntent);
+        setDismissCallback();
+    }
+
+    /**
+     * Sets up a slightly more involved layout for testing swipe-to-dismiss with scrollable
+     * containers. This layout contains a {@link SwipeDismissFrameLayout} with a vertical {@link
+     * WearableRecyclerView} as a child, ready to accept an adapter.
+     */
+    private void setUpSwipeDismissWithVerticalRecyclerView() {
+        Intent launchIntent = new Intent();
+        launchIntent.putExtra(LayoutTestActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.swipe_dismiss_layout_testcase_2);
+        launchIntent.putExtra(SwipeDismissFrameLayoutTestActivity.EXTRA_LAYOUT_HORIZONTAL, false);
+        activityRule.launchActivity(launchIntent);
         setDismissCallback();
     }
 
@@ -290,7 +342,8 @@
         setCallback(
                 new DismissCallback() {
                     @Override
-                    public boolean onPreSwipeStart(float x, float y) {
+                    public boolean onPreSwipeStart(SwipeDismissFrameLayout layout, float x,
+                            float y) {
                         float normalizedX = x - mLayoutWidth / 2;
                         float normalizedY = y - mLayoutWidth / 2;
                         float squareX = normalizedX * normalizedX;
@@ -350,6 +403,7 @@
         SwipeDismissFrameLayout testLayout =
                 (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
         mLayoutWidth = testLayout.getWidth();
+        mLayoutHeight = testLayout.getHeight();
         testLayout.addCallback(callback);
     }
 
@@ -361,8 +415,16 @@
                                 MAX_WAIT_TIME));
     }
 
+    private static void assertNotDismissed(@IdRes int layoutId) {
+        onView(withId(layoutId))
+                .perform(
+                        waitForMatchingView(
+                                allOf(withId(layoutId), withTranslationX(0)),
+                                MAX_WAIT_TIME));
+    }
+
     /**
-     * private void assertPeeking(@IdRes int layoutId) {
+     * private static void assertPeeking(@IdRes int layoutId) {
      * onView(withId(layoutId))
      * .perform(
      * waitForMatchingView(
@@ -370,7 +432,7 @@
      * }
      */
 
-    private void assertHidden(@IdRes int layoutId) {
+    private static void assertHidden(@IdRes int layoutId) {
         onView(withId(layoutId))
                 .perform(
                         waitForMatchingView(
@@ -379,7 +441,7 @@
                                 MAX_WAIT_TIME));
     }
 
-    private void assertNotHidden(@IdRes int layoutId) {
+    private static void assertNotHidden(@IdRes int layoutId) {
         onView(withId(layoutId))
                 .perform(
                         waitForMatchingView(
@@ -388,6 +450,14 @@
                                 MAX_WAIT_TIME));
     }
 
+    private static void assertScrolledY(@IdRes int layoutId) {
+        onView(withId(layoutId))
+                .perform(
+                        waitForMatchingView(
+                                allOf(withId(layoutId), withPositiveVerticalScrollOffset()),
+                                MAX_WAIT_TIME));
+    }
+
     private static ViewAction swipeRightFromCenter() {
         return new GeneralSwipeAction(
                 Swipe.SLOW, GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT, Press.FINGER);
@@ -399,13 +469,14 @@
                 Press.FINGER);
     }
 
-    private static ViewAction swipeBottomFromCenter() {
+    private static ViewAction swipeTopFromBottomOnArc(RectF bounds) {
         return new GeneralSwipeAction(
-                Swipe.SLOW, GeneralLocation.TOP_CENTER, GeneralLocation.BOTTOM_CENTER,
+                new ArcSwipe(ArcSwipe.Gesture.SLOW_ANTICLOCKWISE, bounds),
+                GeneralLocation.BOTTOM_CENTER,
+                GeneralLocation.TOP_CENTER,
                 Press.FINGER);
     }
 
-
     /** Helper class hiding the view after a successful swipe-to-dismiss. */
     private static class DismissCallback extends SwipeDismissFrameLayout.Callback {
 
diff --git a/wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTestActivity.java b/wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTestActivity.java
similarity index 82%
rename from wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTestActivity.java
rename to wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTestActivity.java
index 6c9a9c1..b58ecb1 100644
--- a/wearable/tests/src/android/support/wearable/view/SwipeDismissFrameLayoutTestActivity.java
+++ b/wearable/tests/src/android/support/wearable/widget/SwipeDismissFrameLayoutTestActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.os.Bundle;
 import android.support.v7.widget.LinearLayoutManager;
@@ -27,23 +27,29 @@
 
 public class SwipeDismissFrameLayoutTestActivity extends LayoutTestActivity {
 
+    public static final String EXTRA_LAYOUT_HORIZONTAL = "layout_horizontal";
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         int layoutId = getIntent().getIntExtra(EXTRA_LAYOUT_RESOURCE_ID, -1);
+        boolean horizontal = getIntent().getBooleanExtra(EXTRA_LAYOUT_HORIZONTAL, false);
 
         if (layoutId == R.layout.swipe_dismiss_layout_testcase_2) {
-            createScrollableContent();
+            createScrollableContent(horizontal);
         }
     }
 
-    private void createScrollableContent() {
+    private void createScrollableContent(boolean horizontal) {
         RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_container);
         if (recyclerView == null) {
             throw new NullPointerException("There has to be a relevant container defined");
         }
         recyclerView.setLayoutManager(
-                new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
+                new LinearLayoutManager(
+                        this,
+                        horizontal ? LinearLayoutManager.HORIZONTAL : LinearLayoutManager.VERTICAL,
+                        false));
         recyclerView.setAdapter(new MyRecyclerViewAdapter());
     }
 
diff --git a/wearable/tests/src/android/support/wearable/view/SwipeDismissPreferenceFragment.java b/wearable/tests/src/android/support/wearable/widget/SwipeDismissPreferenceFragment.java
similarity index 92%
rename from wearable/tests/src/android/support/wearable/view/SwipeDismissPreferenceFragment.java
rename to wearable/tests/src/android/support/wearable/widget/SwipeDismissPreferenceFragment.java
index 12414c9..913d943 100644
--- a/wearable/tests/src/android/support/wearable/view/SwipeDismissPreferenceFragment.java
+++ b/wearable/tests/src/android/support/wearable/widget/SwipeDismissPreferenceFragment.java
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.os.Bundle;
 import android.preference.PreferenceFragment;
-import android.support.wearable.view.SwipeDismissFrameLayout.Callback;
+import android.support.wearable.widget.SwipeDismissFrameLayout.Callback;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -38,12 +38,12 @@
     private final Callback mCallback =
             new Callback() {
                 @Override
-                public void onSwipeStarted() {
+                public void onSwipeStarted(SwipeDismissFrameLayout layout) {
                     SwipeDismissPreferenceFragment.this.onSwipeStart();
                 }
 
                 @Override
-                public void onSwipeCancelled() {
+                public void onSwipeCanceled(SwipeDismissFrameLayout layout) {
                     SwipeDismissPreferenceFragment.this.onSwipeCancelled();
                 }
 
diff --git a/wearable/tests/src/android/support/wearable/widget/WearableLinearLayoutManagerTest.java b/wearable/tests/src/android/support/wearable/widget/WearableLinearLayoutManagerTest.java
new file mode 100644
index 0000000..058e72f
--- /dev/null
+++ b/wearable/tests/src/android/support/wearable/widget/WearableLinearLayoutManagerTest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.wearable.widget;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.app.Activity;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.wearable.test.R;
+import android.support.wearable.widget.util.WakeLockRule;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class WearableLinearLayoutManagerTest {
+
+    @Rule
+    public final WakeLockRule wakeLock = new WakeLockRule();
+
+    @Rule
+    public final ActivityTestRule<WearableRecyclerViewTestActivity> mActivityRule =
+            new ActivityTestRule<>(WearableRecyclerViewTestActivity.class, true, true);
+
+    WearableLinearLayoutManager mWearableLinearLayoutManagerUnderTest;
+
+    @Before
+    public void setUp() throws Throwable {
+        Activity activity = mActivityRule.getActivity();
+        CurvingLayoutCallback mCurvingCallback = new CurvingLayoutCallback(activity);
+        mCurvingCallback.setOffset(10);
+        mWearableLinearLayoutManagerUnderTest =
+                new WearableLinearLayoutManager(mActivityRule.getActivity(), mCurvingCallback);
+    }
+
+    @Test
+    public void testRoundOffsetting() throws Throwable {
+        ((CurvingLayoutCallback) mWearableLinearLayoutManagerUnderTest.getLayoutCallback())
+                .setRound(true);
+        final AtomicReference<WearableRecyclerView> wrvReference = new AtomicReference<>();
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WearableRecyclerView wrv =
+                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
+                // Set a fixed layout so that the test adapts to different device screens.
+                wrv.setLayoutParams(new FrameLayout.LayoutParams(390, 390));
+            }
+        });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WearableRecyclerView wrv =
+                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
+                wrv.setLayoutManager(mWearableLinearLayoutManagerUnderTest);
+                wrvReference.set(wrv);
+            }
+        });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        WearableRecyclerView wrv = wrvReference.get();
+
+        View child1 = wrv.getChildAt(0);
+        View child2 = wrv.getChildAt(1);
+        View child3 = wrv.getChildAt(2);
+        View child4 = wrv.getChildAt(3);
+        View child5 = wrv.getChildAt(4);
+
+        // The left position and the translation of the child is modified if the screen is round.
+        // Check if the 5th child is not null as some devices will not be able to display 5 views.
+        assertEquals(136, child1.getLeft());
+        assertEquals(-6.3, child1.getTranslationY(), 0.1);
+
+        assertEquals(91, child2.getLeft(), 1);
+        assertEquals(-15.21, child2.getTranslationY(), 0.1);
+
+        assertEquals(58, child3.getLeft(), 1);
+        assertEquals(-13.5, child3.getTranslationY(), 0.1);
+
+        assertEquals(42, child4.getLeft(), 1);
+        assertEquals(-4.5, child4.getTranslationY(), 0.1);
+
+        if (child5 != null) {
+            assertEquals(43, child5.getLeft(), 1);
+            assertEquals(6.7, child5.getTranslationY(), 0.1);
+        }
+    }
+
+    @Test
+    public void testStraightOffsetting() throws Throwable {
+        ((CurvingLayoutCallback) mWearableLinearLayoutManagerUnderTest.getLayoutCallback())
+                .setRound(
+                false);
+        final AtomicReference<WearableRecyclerView> wrvReference = new AtomicReference<>();
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WearableRecyclerView wrv =
+                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
+                wrv.setLayoutManager(mWearableLinearLayoutManagerUnderTest);
+                wrvReference.set(wrv);
+            }
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        WearableRecyclerView wrv = wrvReference.get();
+
+        View child1 = wrv.getChildAt(0);
+        View child2 = wrv.getChildAt(1);
+        View child3 = wrv.getChildAt(2);
+        View child4 = wrv.getChildAt(3);
+        View child5 = wrv.getChildAt(4);
+
+        // The left position and the translation of the child is not modified if the screen is
+        // straight. Check if the 5th child is not null as some devices will not be able to display
+        // 5 views.
+        assertEquals(0, child1.getLeft());
+        assertEquals(0.0f, child1.getTranslationY(), 0);
+
+        assertEquals(0, child2.getLeft());
+        assertEquals(0.0f, child2.getTranslationY(), 0);
+
+        assertEquals(0, child3.getLeft());
+        assertEquals(0.0f, child3.getTranslationY(), 0);
+
+        assertEquals(0, child4.getLeft());
+        assertEquals(0.0f, child4.getTranslationY(), 0);
+
+        if (child5 != null) {
+            assertEquals(0, child5.getLeft());
+            assertEquals(0.0f, child5.getTranslationY(), 0);
+        }
+    }
+}
diff --git a/wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTest.java b/wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTest.java
similarity index 91%
rename from wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTest.java
rename to wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTest.java
index 88d6afe..0eb5c10 100644
--- a/wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTest.java
+++ b/wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTest.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.wearable.view.util.AsyncViewActions.waitForMatchingView;
-import static android.support.wearable.view.util.MoreViewAssertions.withNoVerticalScrollOffset;
-import static android.support.wearable.view.util.MoreViewAssertions.withPositiveVerticalScrollOffset;
+import static android.support.wearable.widget.util.AsyncViewActions.waitForMatchingView;
+import static android.support.wearable.widget.util.MoreViewAssertions.withNoVerticalScrollOffset;
+import static android.support.wearable.widget.util.MoreViewAssertions.withPositiveVerticalScrollOffset;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -42,7 +42,7 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v7.widget.RecyclerView;
 import android.support.wearable.test.R;
-import android.support.wearable.view.util.WakeLockRule;
+import android.support.wearable.widget.util.WakeLockRule;
 import android.view.View;
 
 import org.junit.Before;
@@ -58,7 +58,7 @@
 
     private static final long MAX_WAIT_TIME = 10000;
     @Mock
-    WearableRecyclerView.OffsettingLayoutManager mMockOffsettingLayoutManager;
+    WearableRecyclerView.LayoutManager mMockChildLayoutManager;
 
     @Rule
     public final WakeLockRule wakeLock = new WakeLockRule();
@@ -75,11 +75,11 @@
     @Test
     public void testCaseInitState() {
         WearableRecyclerView wrv = new WearableRecyclerView(mActivityRule.getActivity());
-        wrv.setLayoutManager(new CurvedOffsettingLayoutManager(wrv.getContext()));
+        wrv.setLayoutManager(new WearableLinearLayoutManager(wrv.getContext()));
 
-        assertFalse(wrv.getEdgeItemsCenteringEnabled());
+        assertFalse(wrv.isEdgeItemsCenteringEnabled());
         assertFalse(wrv.isCircularScrollingGestureEnabled());
-        assertEquals(1.0f, wrv.getBezelWidthFraction());
+        assertEquals(1.0f, wrv.getBezelFraction());
         assertEquals(180.0f, wrv.getScrollDegreesPerScreen());
     }
 
@@ -184,7 +184,7 @@
             public void run() {
                 WearableRecyclerView wrv =
                         (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
-                wrv.setLayoutManager(new CurvedOffsettingLayoutManager(wrv.getContext()));
+                wrv.setLayoutManager(new WearableLinearLayoutManager(wrv.getContext()));
             }
         });
 
diff --git a/wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTestActivity.java b/wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTestActivity.java
similarity index 88%
rename from wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTestActivity.java
rename to wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTestActivity.java
index 040d84b..cad8608 100644
--- a/wearable/tests/src/android/support/wearable/view/WearableRecyclerViewTestActivity.java
+++ b/wearable/tests/src/android/support/wearable/widget/WearableRecyclerViewTestActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view;
+package android.support.wearable.widget;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -29,8 +29,8 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.wearable_recycler_view_basic);
         WearableRecyclerView wrv =
-                (WearableRecyclerView) findViewById(android.support.wearable.test.R.id.wrv);
-        wrv.setLayoutManager(new CurvedOffsettingLayoutManager(this));
+                findViewById(android.support.wearable.test.R.id.wrv);
+        wrv.setLayoutManager(new WearableLinearLayoutManager(this));
         wrv.setAdapter(new TestAdapter());
     }
 
@@ -47,6 +47,7 @@
         @Override
         public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
             TextView view = new TextView(parent.getContext());
+            view.setLayoutParams(new RecyclerView.LayoutParams(200, 50));
             return new ViewHolder(view);
         }
 
diff --git a/wearable/tests/src/android/support/wearable/widget/util/ArcSwipe.java b/wearable/tests/src/android/support/wearable/widget/util/ArcSwipe.java
new file mode 100644
index 0000000..49e0a27
--- /dev/null
+++ b/wearable/tests/src/android/support/wearable/widget/util/ArcSwipe.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.wearable.widget.util;
+
+import android.graphics.Path;
+import android.graphics.PathMeasure;
+import android.graphics.RectF;
+import android.os.SystemClock;
+import android.support.annotation.VisibleForTesting;
+import android.support.test.espresso.UiController;
+import android.support.test.espresso.action.MotionEvents;
+import android.support.test.espresso.action.Swiper;
+import android.support.v4.util.Preconditions;
+import android.util.Log;
+import android.view.MotionEvent;
+
+/**
+ * Swiper for gestures meant to be performed on an arc - part of a circle - not a straight line.
+ * This class assumes a square bounding box with the radius of the circle being half the height of
+ * the box.
+ */
+public class ArcSwipe implements Swiper {
+
+    /** Enum describing the exact gesture which will perform the curved swipe. */
+    public enum Gesture {
+        /** Swipes quickly between the co-ordinates, clockwise. */
+        FAST_CLOCKWISE(SWIPE_FAST_DURATION_MS, true),
+        /** Swipes deliberately slowly between the co-ordinates, clockwise. */
+        SLOW_CLOCKWISE(SWIPE_SLOW_DURATION_MS, true),
+        /** Swipes quickly between the co-ordinates, anticlockwise. */
+        FAST_ANTICLOCKWISE(SWIPE_FAST_DURATION_MS, false),
+        /** Swipes deliberately slowly between the co-ordinates, anticlockwise. */
+        SLOW_ANTICLOCKWISE(SWIPE_SLOW_DURATION_MS, false);
+
+        private final int mDuration;
+        private final boolean mClockwise;
+
+        Gesture(int duration, boolean clockwise) {
+            mDuration = duration;
+            mClockwise = clockwise;
+        }
+    }
+
+    /** The number of motion events to send for each swipe. */
+    private static final int SWIPE_EVENT_COUNT = 10;
+
+    /** Length of time a "fast" swipe should last for, in milliseconds. */
+    private static final int SWIPE_FAST_DURATION_MS = 100;
+
+    /** Length of time a "slow" swipe should last for, in milliseconds. */
+    private static final int SWIPE_SLOW_DURATION_MS = 1500;
+
+    private static final String TAG = ArcSwipe.class.getSimpleName();
+    private final RectF mBounds;
+    private final Gesture mGesture;
+
+    public ArcSwipe(Gesture gesture, RectF bounds) {
+        Preconditions.checkArgument(bounds.height() == bounds.width());
+        mGesture = gesture;
+        mBounds = bounds;
+    }
+
+    @Override
+    public Swiper.Status sendSwipe(
+            UiController uiController,
+            float[] startCoordinates,
+            float[] endCoordinates,
+            float[] precision) {
+        return sendArcSwipe(
+                uiController,
+                startCoordinates,
+                endCoordinates,
+                precision,
+                mGesture.mDuration,
+                mGesture.mClockwise);
+    }
+
+    private float[][] interpolate(float[] start, float[] end, int steps, boolean isClockwise) {
+        float startAngle = getAngle(start[0], start[1]);
+        float endAngle = getAngle(end[0], end[1]);
+
+        Path path = new Path();
+        PathMeasure pathMeasure = new PathMeasure();
+        path.moveTo(start[0], start[1]);
+        path.arcTo(mBounds, startAngle, getSweepAngle(startAngle, endAngle, isClockwise));
+        pathMeasure.setPath(path, false);
+        float pathLength = pathMeasure.getLength();
+
+        float[][] res = new float[steps][2];
+        float[] mPathTangent = new float[2];
+
+        for (int i = 1; i < steps + 1; i++) {
+            pathMeasure.getPosTan((pathLength * i) / (steps + 2f), res[i - 1], mPathTangent);
+        }
+
+        return res;
+    }
+
+    private Swiper.Status sendArcSwipe(
+            UiController uiController,
+            float[] startCoordinates,
+            float[] endCoordinates,
+            float[] precision,
+            int duration,
+            boolean isClockwise) {
+
+        float[][] steps = interpolate(startCoordinates, endCoordinates, SWIPE_EVENT_COUNT,
+                isClockwise);
+        final int delayBetweenMovements = duration / steps.length;
+
+        MotionEvent downEvent = MotionEvents.sendDown(uiController, startCoordinates,
+                precision).down;
+        try {
+            for (int i = 0; i < steps.length; i++) {
+                if (!MotionEvents.sendMovement(uiController, downEvent, steps[i])) {
+                    Log.e(TAG,
+                            "Injection of move event as part of the swipe failed. Sending cancel "
+                                    + "event.");
+                    MotionEvents.sendCancel(uiController, downEvent);
+                    return Swiper.Status.FAILURE;
+                }
+
+                long desiredTime = downEvent.getDownTime() + delayBetweenMovements * i;
+                long timeUntilDesired = desiredTime - SystemClock.uptimeMillis();
+                if (timeUntilDesired > 10) {
+                    uiController.loopMainThreadForAtLeast(timeUntilDesired);
+                }
+            }
+
+            if (!MotionEvents.sendUp(uiController, downEvent, endCoordinates)) {
+                Log.e(TAG,
+                        "Injection of up event as part of the swipe failed. Sending cancel event.");
+                MotionEvents.sendCancel(uiController, downEvent);
+                return Swiper.Status.FAILURE;
+            }
+        } finally {
+            downEvent.recycle();
+        }
+        return Swiper.Status.SUCCESS;
+    }
+
+    @VisibleForTesting
+    float getAngle(double x, double y) {
+        double relativeX = x - (mBounds.width() / 2);
+        double relativeY = y - (mBounds.height() / 2);
+        double rowAngle = Math.atan2(relativeX, relativeY);
+        double angle = -Math.toDegrees(rowAngle) - 180;
+        if (angle < 0) {
+            angle += 360;
+        }
+        return (float) angle;
+    }
+
+    @VisibleForTesting
+    float getSweepAngle(float startAngle, float endAngle, boolean isClockwise) {
+        float sweepAngle = endAngle - startAngle;
+        if (sweepAngle < 0) {
+            sweepAngle += 360;
+        }
+        return isClockwise ? sweepAngle : (360 - sweepAngle);
+    }
+}
diff --git a/wearable/tests/src/android/support/wearable/widget/util/ArcSwipeTest.java b/wearable/tests/src/android/support/wearable/widget/util/ArcSwipeTest.java
new file mode 100644
index 0000000..0b958e3
--- /dev/null
+++ b/wearable/tests/src/android/support/wearable/widget/util/ArcSwipeTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.wearable.widget.util;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.graphics.RectF;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit tests for {@link ArcSwipe}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ArcSwipeTest {
+    private ArcSwipe mArcSwipeUnderTest;
+    private final RectF mFakeBounds = new RectF(0, 0, 400, 400);
+
+    @Before
+    public void setup() {
+        mArcSwipeUnderTest = new ArcSwipe(ArcSwipe.Gesture.FAST_CLOCKWISE, mFakeBounds);
+    }
+
+    @Test
+    public void testSweepAngleClockwise() {
+        assertEquals(0, mArcSwipeUnderTest.getSweepAngle(0, 0, true), 0.0f);
+        assertEquals(360, mArcSwipeUnderTest.getSweepAngle(0, 360, true), 0.0f);
+        assertEquals(90, mArcSwipeUnderTest.getSweepAngle(0, 90, true), 0.0f);
+        assertEquals(90, mArcSwipeUnderTest.getSweepAngle(90, 180, true), 0.0f);
+        assertEquals(225, mArcSwipeUnderTest.getSweepAngle(45, 270, true), 0.0f);
+        assertEquals(270, mArcSwipeUnderTest.getSweepAngle(90, 0, true), 0.0f);
+        assertEquals(170, mArcSwipeUnderTest.getSweepAngle(280, 90, true), 0.0f);
+    }
+
+    @Test
+    public void testSweepAngleAntiClockwise() {
+        assertEquals(360, mArcSwipeUnderTest.getSweepAngle(0, 0, false), 0.0f);
+        assertEquals(0, mArcSwipeUnderTest.getSweepAngle(0, 360, false), 0.0f);
+        assertEquals(270, mArcSwipeUnderTest.getSweepAngle(0, 90, false), 0.0f);
+        assertEquals(270, mArcSwipeUnderTest.getSweepAngle(90, 180, false), 0.0f);
+        assertEquals(135, mArcSwipeUnderTest.getSweepAngle(45, 270, false), 0.0f);
+        assertEquals(90, mArcSwipeUnderTest.getSweepAngle(90, 0, false), 0.0f);
+        assertEquals(190, mArcSwipeUnderTest.getSweepAngle(280, 90, false), 0.0f);
+    }
+
+    @Test
+    public void testGetAngle() {
+        assertEquals(0, mArcSwipeUnderTest.getAngle(200, 0), 0.0f);
+        assertEquals(90, mArcSwipeUnderTest.getAngle(400, 200), 0.0f);
+        assertEquals(180, mArcSwipeUnderTest.getAngle(200, 400), 0.0f);
+        assertEquals(270, mArcSwipeUnderTest.getAngle(0, 200), 0.0f);
+    }
+}
diff --git a/wearable/tests/src/android/support/wearable/view/util/AsyncViewActions.java b/wearable/tests/src/android/support/wearable/widget/util/AsyncViewActions.java
similarity index 98%
rename from wearable/tests/src/android/support/wearable/view/util/AsyncViewActions.java
rename to wearable/tests/src/android/support/wearable/widget/util/AsyncViewActions.java
index c4e02da..7f2f6f2 100644
--- a/wearable/tests/src/android/support/wearable/view/util/AsyncViewActions.java
+++ b/wearable/tests/src/android/support/wearable/widget/util/AsyncViewActions.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view.util;
+package android.support.wearable.widget.util;
 
 import android.support.test.espresso.PerformException;
 import android.support.test.espresso.UiController;
diff --git a/wearable/tests/src/android/support/wearable/view/util/MoreViewAssertions.java b/wearable/tests/src/android/support/wearable/widget/util/MoreViewAssertions.java
similarity index 92%
rename from wearable/tests/src/android/support/wearable/view/util/MoreViewAssertions.java
rename to wearable/tests/src/android/support/wearable/widget/util/MoreViewAssertions.java
index 79586ea..fef3b5c 100644
--- a/wearable/tests/src/android/support/wearable/view/util/MoreViewAssertions.java
+++ b/wearable/tests/src/android/support/wearable/widget/util/MoreViewAssertions.java
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view.util;
+package android.support.wearable.widget.util;
 
 import static android.support.test.espresso.matcher.ViewMatchers.assertThat;
 
 import android.support.test.espresso.NoMatchingViewException;
 import android.support.test.espresso.ViewAssertion;
 import android.support.test.espresso.util.HumanReadables;
-import android.support.wearable.view.WearableRecyclerView;
+import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
 import org.hamcrest.Description;
@@ -177,29 +177,29 @@
         };
     }
 
-    public static Matcher<WearableRecyclerView> withPositiveVerticalScrollOffset() {
-        return new TypeSafeMatcher<WearableRecyclerView>() {
+    public static Matcher<RecyclerView> withPositiveVerticalScrollOffset() {
+        return new TypeSafeMatcher<RecyclerView>() {
             @Override
             public void describeTo(Description description) {
                 description.appendText("with positive y scroll offset");
             }
 
             @Override
-            public boolean matchesSafely(WearableRecyclerView view) {
+            public boolean matchesSafely(RecyclerView view) {
                 return view.computeVerticalScrollOffset() > 0;
             }
         };
     }
 
-    public static Matcher<WearableRecyclerView> withNoVerticalScrollOffset() {
-        return new TypeSafeMatcher<WearableRecyclerView>() {
+    public static Matcher<RecyclerView> withNoVerticalScrollOffset() {
+        return new TypeSafeMatcher<RecyclerView>() {
             @Override
             public void describeTo(Description description) {
                 description.appendText("with no y scroll offset");
             }
 
             @Override
-            public boolean matchesSafely(WearableRecyclerView view) {
+            public boolean matchesSafely(RecyclerView view) {
                 return view.computeVerticalScrollOffset() == 0;
             }
         };
diff --git a/wearable/tests/src/android/support/wearable/view/util/WakeLockRule.java b/wearable/tests/src/android/support/wearable/widget/util/WakeLockRule.java
similarity index 97%
rename from wearable/tests/src/android/support/wearable/view/util/WakeLockRule.java
rename to wearable/tests/src/android/support/wearable/widget/util/WakeLockRule.java
index 9b806f4..5ec2d09 100644
--- a/wearable/tests/src/android/support/wearable/view/util/WakeLockRule.java
+++ b/wearable/tests/src/android/support/wearable/widget/util/WakeLockRule.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.wearable.view.util;
+package android.support.wearable.widget.util;
 
 import android.content.Context;
 import android.os.PowerManager;