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><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><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 @@
* </intent-filter>
* </receiver>
* </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>
+ * <service android:name="com.example.android.MediaPlaybackService" >
+ * <intent-filter>
+ * <action android:name="android.intent.action.MEDIA_BUTTON" />
+ * </intent-filter>
+ * </service>
+ * </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;