Merge "Added missing <p> tags in RoundedDrawable" into oc-support-26.0-dev
diff --git a/.gitignore b/.gitignore
index 9c6e6eb..abfef7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,5 @@
*.iml
**/out
buildSrc/build
-lifecycle/common/build
\ No newline at end of file
+lifecycle/common/build
+jacoco.exec
\ No newline at end of file
diff --git a/api/25.4.0.ignore b/api/25.4.0.ignore
index e63593a..97d6ff8 100644
--- a/api/25.4.0.ignore
+++ b/api/25.4.0.ignore
@@ -6,3 +6,4 @@
24c3865
a684458
7c9f9f7
+18b5692
\ No newline at end of file
diff --git a/api/26.0.0-SNAPSHOT.txt b/api/26.0.0-SNAPSHOT.txt
index 3a87841..fe0c575 100644
--- a/api/26.0.0-SNAPSHOT.txt
+++ b/api/26.0.0-SNAPSHOT.txt
@@ -1951,7 +1951,9 @@
ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet);
ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int);
ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public int getEmojiReplaceStrategy();
method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+ method public void setEmojiReplaceStrategy(int);
}
public class EmojiTextView extends android.widget.TextView {
@@ -6535,6 +6537,10 @@
method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
}
+ public static class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
public static abstract interface NotificationCompat.Extender {
method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
}
@@ -7511,6 +7517,27 @@
}
+package android.support.v4.media.app {
+
+ public class NotificationCompat {
+ }
+
+ public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.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 static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+ }
+
+}
+
package android.support.v4.media.session {
public class MediaButtonReceiver extends android.content.BroadcastReceiver {
@@ -8251,6 +8278,10 @@
method public void trimToSize(int);
}
+ public class ObjectsCompat {
+ method public static boolean equals(java.lang.Object, java.lang.Object);
+ }
+
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);
@@ -8327,14 +8358,6 @@
}
-package android.support.v4.utils {
-
- public class ObjectUtils {
- method public static boolean objectEquals(java.lang.Object, java.lang.Object);
- }
-
-}
-
package android.support.v4.view {
public abstract class AbsSavedState implements android.os.Parcelable {
@@ -10482,30 +10505,30 @@
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 deprecated class NotificationCompat extends android.support.v4.app.NotificationCompat {
+ ctor public deprecated NotificationCompat();
+ method public static deprecated android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
}
public static deprecated class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
ctor public deprecated NotificationCompat.Builder(android.content.Context);
}
- public static class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
- ctor public NotificationCompat.DecoratedCustomViewStyle();
+ public static deprecated class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle {
+ ctor public deprecated NotificationCompat.DecoratedCustomViewStyle();
}
- public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v7.app.NotificationCompat.MediaStyle {
- ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
+ public static deprecated class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle {
+ ctor public deprecated 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);
+ public static deprecated class NotificationCompat.MediaStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+ ctor public deprecated NotificationCompat.MediaStyle();
+ ctor public deprecated NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
}
}
diff --git a/api/26.0.0.txt b/api/26.0.0.txt
new file mode 100644
index 0000000..fe0c575
--- /dev/null
+++ b/api/26.0.0.txt
@@ -0,0 +1,13266 @@
+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 float getMinimumVisibleChange();
+ 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 setMinimumVisibleChange(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 float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
+ field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
+ field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
+ field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
+ 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 extends android.support.animation.FloatPropertyCompat {
+ }
+
+ public final class FlingAnimation extends android.support.animation.DynamicAnimation {
+ ctor public FlingAnimation(android.support.animation.FloatValueHolder);
+ ctor public FlingAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+ method public float getFriction();
+ method public android.support.animation.FlingAnimation setFriction(float);
+ method public android.support.animation.FlingAnimation setMaxValue(float);
+ method public android.support.animation.FlingAnimation setMinValue(float);
+ method public android.support.animation.FlingAnimation setStartVelocity(float);
+ }
+
+ public abstract class FloatPropertyCompat<T> {
+ ctor public FloatPropertyCompat(java.lang.String);
+ method public static <T> android.support.animation.FloatPropertyCompat<T> createFloatPropertyCompat(android.util.FloatProperty<T>);
+ method public abstract float getValue(T);
+ method public abstract void setValue(T, float);
+ }
+
+ public final class FloatValueHolder {
+ ctor public FloatValueHolder();
+ ctor public FloatValueHolder(float);
+ method public float getValue();
+ method public void setValue(float);
+ }
+
+ public final class SpringAnimation extends android.support.animation.DynamicAnimation {
+ ctor public SpringAnimation(android.support.animation.FloatValueHolder);
+ ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+ ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>, 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 protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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 void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, 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, int);
+ method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
+ 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 onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+ 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 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 protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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.NestedScrollingParent2 {
+ 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 protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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 onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, 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 deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+ method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
+ method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+ method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
+ method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+ method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, 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 deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+ method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+ method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
+ 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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+ 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 android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ 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 void flipHorizontally();
+ method public void flipVertically();
+ 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 resetOrientation();
+ method public void rotate(int);
+ method public void saveAttributes() throws java.io.IOException;
+ method public void setAltitude(double);
+ method public void setAttribute(java.lang.String, java.lang.String);
+ method public void setGpsInfo(android.location.Location);
+ 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 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 getInternalProviderId();
+ 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 isLocked();
+ method public boolean isSearchable();
+ method public boolean isTransient();
+ 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 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);
+ 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 setTransient(boolean);
+ 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 {
+ method public boolean equals(java.lang.Object);
+ method public static android.support.media.tv.PreviewProgram fromCursor(android.database.Cursor);
+ method public long getChannelId();
+ method public int getWeight();
+ method public android.content.ContentValues toContentValues();
+ method public java.lang.String toString();
+ }
+
+ public static final class PreviewProgram.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 implements java.lang.Comparable {
+ method public int compareTo(android.support.media.tv.Program);
+ method public boolean equals(java.lang.Object);
+ 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 int hashCode();
+ method public boolean isRecordingProhibited();
+ method public android.content.ContentValues toContentValues();
+ method public java.lang.String toString();
+ }
+
+ public static class Program.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);
+ method public static boolean isRecordedProgramUri(android.net.Uri);
+ 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_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.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_LOCKED = "locked";
+ 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_TRANSIENT = "transient";
+ 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.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.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 {
+ 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.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.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_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 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 {
+ method public boolean equals(java.lang.Object);
+ method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
+ method public long getLastEngagementTimeUtcMillis();
+ method public int getWatchNextType();
+ method public android.content.ContentValues toContentValues();
+ method public java.lang.String toString();
+ }
+
+ public static final class WatchNextProgram.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(int);
+ }
+
+}
+
+package android.support.percent {
+
+ public deprecated 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);
+ method protected android.support.percent.PercentFrameLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.percent.PercentFrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ }
+
+ public static deprecated 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 deprecated 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 deprecated 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 deprecated interface PercentLayoutHelper.PercentLayoutParams {
+ method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+ }
+
+ public deprecated 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);
+ method protected android.support.percent.PercentRelativeLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.percent.PercentRelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ }
+
+ public static deprecated 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 java.lang.String getAssetSignature();
+ 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 java.lang.CharSequence process(java.lang.CharSequence, int, int, int);
+ method public java.lang.CharSequence process(java.lang.CharSequence, int, int, 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_FAILED = 2; // 0x2
+ field public static final int LOAD_STATE_LOADING = 0; // 0x0
+ field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+ field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+ field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+ field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+ }
+
+ public static abstract class EmojiCompat.Config {
+ ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataRepoLoader);
+ method protected final android.support.text.emoji.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+ method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+ method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
+ method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+ 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 interface EmojiCompat.MetadataRepoLoader {
+ method public abstract void load(android.support.text.emoji.EmojiCompat.MetadataRepoLoaderCallback);
+ }
+
+ public static abstract class EmojiCompat.MetadataRepoLoaderCallback {
+ ctor public EmojiCompat.MetadataRepoLoaderCallback();
+ method public abstract void onFailed(java.lang.Throwable);
+ method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
+ }
+
+ 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 class FontRequestEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+ ctor public FontRequestEmojiCompatConfig(android.content.Context, android.support.v4.provider.FontRequest);
+ method public android.support.text.emoji.FontRequestEmojiCompatConfig setHandler(android.os.Handler);
+ method public android.support.text.emoji.FontRequestEmojiCompatConfig setRetryPolicy(android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy);
+ }
+
+ public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy {
+ ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+ method public long getRetryDelay();
+ }
+
+ public static abstract class FontRequestEmojiCompatConfig.RetryPolicy {
+ ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+ method public abstract long getRetryDelay();
+ }
+
+ 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);
+ method public int getMaxEmojiCount();
+ method public void setMaxEmojiCount(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);
+ method public int getMaxEmojiCount();
+ method public void setMaxEmojiCount(int);
+ }
+
+ public final class EmojiEditTextHelper {
+ ctor public EmojiEditTextHelper(android.widget.EditText);
+ method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+ method public int getMaxEmojiCount();
+ method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ method public void setMaxEmojiCount(int);
+ }
+
+ public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+ ctor public EmojiExtractTextLayout(android.content.Context);
+ ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet);
+ ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public int getEmojiReplaceStrategy();
+ method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+ method public void setEmojiReplaceStrategy(int);
+ }
+
+ 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();
+ ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
+ 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 boolean getResizeClip();
+ 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 ChangeImageTransform extends android.support.transition.Transition {
+ ctor public ChangeImageTransform();
+ ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
+ method public void captureEndValues(android.support.transition.TransitionValues);
+ method public void captureStartValues(android.support.transition.TransitionValues);
+ }
+
+ public class ChangeScroll extends android.support.transition.Transition {
+ ctor public ChangeScroll();
+ ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
+ method public void captureEndValues(android.support.transition.TransitionValues);
+ method public void captureStartValues(android.support.transition.TransitionValues);
+ }
+
+ public class ChangeTransform extends android.support.transition.Transition {
+ ctor public ChangeTransform();
+ ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
+ method public void captureEndValues(android.support.transition.TransitionValues);
+ method public void captureStartValues(android.support.transition.TransitionValues);
+ method public boolean getReparent();
+ method public boolean getReparentWithOverlay();
+ method public void setReparent(boolean);
+ method public void setReparentWithOverlay(boolean);
+ }
+
+ 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();
+ ctor public PathMotion(android.content.Context, android.util.AttributeSet);
+ 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.content.Context, android.util.AttributeSet);
+ 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 class SidePropagation extends android.support.transition.VisibilityPropagation {
+ ctor public SidePropagation();
+ method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+ method public void setPropagationSpeed(float);
+ method public void setSide(int);
+ }
+
+ public class Slide extends android.support.transition.Visibility {
+ ctor public Slide();
+ ctor public Slide(int);
+ ctor public Slide(android.content.Context, android.util.AttributeSet);
+ method public int getSlideEdge();
+ method public void setSlideEdge(int);
+ }
+
+ 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 boolean isTransitionRequired(android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+ 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 TransitionListenerAdapter implements android.support.transition.Transition.TransitionListener {
+ ctor public TransitionListenerAdapter();
+ method public void onTransitionCancel(android.support.transition.Transition);
+ method public void onTransitionEnd(android.support.transition.Transition);
+ method public void onTransitionPause(android.support.transition.Transition);
+ method public void onTransitionResume(android.support.transition.Transition);
+ method public void onTransitionStart(android.support.transition.Transition);
+ }
+
+ public class TransitionManager {
+ ctor public TransitionManager();
+ method public static void beginDelayedTransition(android.view.ViewGroup);
+ method public static void beginDelayedTransition(android.view.ViewGroup, android.support.transition.Transition);
+ method public static void endTransitions(android.view.ViewGroup);
+ 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 addListener(android.support.transition.Transition.TransitionListener);
+ method public android.support.transition.TransitionSet addTarget(android.view.View);
+ method public android.support.transition.TransitionSet addTarget(int);
+ method public android.support.transition.TransitionSet addTarget(java.lang.String);
+ method public android.support.transition.TransitionSet addTarget(java.lang.Class);
+ 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 removeListener(android.support.transition.Transition.TransitionListener);
+ method public android.support.transition.TransitionSet removeTarget(int);
+ method public android.support.transition.TransitionSet removeTarget(android.view.View);
+ method public android.support.transition.TransitionSet removeTarget(java.lang.Class);
+ method public android.support.transition.TransitionSet removeTarget(java.lang.String);
+ method public android.support.transition.TransitionSet removeTransition(android.support.transition.Transition);
+ method public android.support.transition.TransitionSet setDuration(long);
+ method public android.support.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
+ method public android.support.transition.TransitionSet setOrdering(int);
+ method public android.support.transition.TransitionSet setStartDelay(long);
+ 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 deprecated void setup();
+ 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);
+ }
+
+ public class BaseFragment extends android.support.v17.leanback.app.BrandedFragment {
+ method protected java.lang.Object createEntranceTransition();
+ method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+ method protected void onEntranceTransitionEnd();
+ method protected void onEntranceTransitionPrepare();
+ method protected void onEntranceTransitionStart();
+ method public void prepareEntranceTransition();
+ method protected void runEntranceTransition(java.lang.Object);
+ method public void startEntranceTransition();
+ }
+
+ 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.ItemBridgeAdapter getBridgeAdapter();
+ 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.ItemBridgeAdapter getBridgeAdapter();
+ 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 BaseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+ method protected java.lang.Object createEntranceTransition();
+ method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+ method protected void onEntranceTransitionEnd();
+ method protected void onEntranceTransitionPrepare();
+ method protected void onEntranceTransitionStart();
+ method public void prepareEntranceTransition();
+ method protected void runEntranceTransition(java.lang.Object);
+ method public void startEntranceTransition();
+ }
+
+ 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.BaseFragment {
+ ctor public BrowseFragment();
+ method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+ 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 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.BaseSupportFragment {
+ ctor public BrowseSupportFragment();
+ method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+ 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 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.BaseFragment {
+ ctor public DetailsFragment();
+ 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 onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+ method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.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 boolean canNavigateToVideoFragment();
+ 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 android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+ 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);
+ method public final void switchToRows();
+ method public final void switchToVideo();
+ }
+
+ public class DetailsSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+ ctor public DetailsSupportFragment();
+ 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 onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+ method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.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 boolean canNavigateToVideoSupportFragment();
+ 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 android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+ 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);
+ method public final void switchToRows();
+ method public final void switchToVideo();
+ }
+
+ 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 openInEditMode(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 openInEditMode(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();
+ method protected void pausePlayback();
+ method protected void skipToNext();
+ method protected void skipToPrevious();
+ method protected void startPlayback(int);
+ }
+
+ public abstract class OnboardingFragment extends android.app.Fragment {
+ ctor public OnboardingFragment();
+ method public final int getArrowBackgroundColor();
+ method public final int getArrowColor();
+ 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 java.lang.CharSequence getStartButtonText();
+ method public final int getTitleViewTextColor();
+ method protected final boolean isLogoAnimationFinished();
+ method protected void moveToNextPage();
+ method protected void moveToPreviousPage();
+ 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 onLogoAnimationFinished();
+ method protected void onPageChanged(int, int);
+ method public int onProvideTheme();
+ method public void setArrowBackgroundColor(int);
+ method public void setArrowColor(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 setStartButtonText(java.lang.CharSequence);
+ 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 public final int getArrowColor();
+ 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 java.lang.CharSequence getStartButtonText();
+ method public final int getTitleViewTextColor();
+ method protected final boolean isLogoAnimationFinished();
+ method protected void moveToNextPage();
+ method protected void moveToPreviousPage();
+ 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 onLogoAnimationFinished();
+ method protected void onPageChanged(int, int);
+ method public int onProvideTheme();
+ method public void setArrowBackgroundColor(int);
+ method public void setArrowColor(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 setStartButtonText(java.lang.CharSequence);
+ method public void setTitleViewTextColor(int);
+ method protected final void startEnterAnimation(boolean);
+ }
+
+ 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 deprecated void fadeOut();
+ method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+ method public int getBackgroundType();
+ method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+ method public void hideControlsOverlay(boolean);
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public boolean isControlsOverlayVisible();
+ method public deprecated boolean isFadingEnabled();
+ method public void notifyPlaybackRowChanged();
+ method protected void onBufferingStateChanged(boolean);
+ method protected void onError(int, java.lang.CharSequence);
+ method protected void onVideoSizeChanged(int, int);
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setBackgroundType(int);
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method public deprecated 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 setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ method public void showControlsOverlay(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 implements android.support.v17.leanback.widget.PlaybackSeekUi {
+ ctor public PlaybackFragmentGlueHost(android.support.v17.leanback.app.PlaybackFragment);
+ method public void fadeOut();
+ method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ }
+
+ 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 deprecated void fadeOut();
+ method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+ method public int getBackgroundType();
+ method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+ method public void hideControlsOverlay(boolean);
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public boolean isControlsOverlayVisible();
+ method public deprecated boolean isFadingEnabled();
+ method public void notifyPlaybackRowChanged();
+ method protected void onBufferingStateChanged(boolean);
+ method protected void onError(int, java.lang.CharSequence);
+ method protected void onVideoSizeChanged(int, int);
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setBackgroundType(int);
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method public deprecated 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 setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ method public void showControlsOverlay(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 implements android.support.v17.leanback.widget.PlaybackSeekUi {
+ ctor public PlaybackSupportFragmentGlueHost(android.support.v17.leanback.app.PlaybackSupportFragment);
+ method public void fadeOut();
+ method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ }
+
+ 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.BaseFragment {
+ ctor public VerticalGridFragment();
+ method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+ method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+ method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+ method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+ method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+ method public void setSelectedPosition(int);
+ }
+
+ public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+ ctor public VerticalGridSupportFragment();
+ method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+ method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+ method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+ method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+ method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+ method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+ method public void setSelectedPosition(int);
+ }
+
+ 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 class MediaPlayerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+ ctor public MediaPlayerAdapter(android.content.Context);
+ method protected boolean onError(int, int);
+ method protected boolean onInfo(int, int);
+ method protected void onSeekComplete();
+ method public void pause();
+ method public void play();
+ method public void release();
+ method public void reset();
+ method public boolean setDataSource(android.net.Uri);
+ }
+
+ public class PlaybackBannerControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+ ctor public PlaybackBannerControlGlue(android.content.Context, int[], T);
+ ctor public PlaybackBannerControlGlue(android.content.Context, int[], int[], T);
+ method public int[] getFastForwardSpeeds();
+ method public int[] getRewindSpeeds();
+ method public long getSupportedActions();
+ method public void onActionClicked(android.support.v17.leanback.widget.Action);
+ method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+ method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+ 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 PlaybackBaseControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+ ctor public PlaybackBaseControlGlue(android.content.Context, T);
+ method public android.graphics.drawable.Drawable getArt();
+ method public final long getBufferedPosition();
+ method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+ method public long getCurrentPosition();
+ method public final long getDuration();
+ method public android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+ method public final T getPlayerAdapter();
+ method public java.lang.CharSequence getSubtitle();
+ method public java.lang.CharSequence getTitle();
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public final boolean isPlaying();
+ method public final boolean isPrepared();
+ method protected static void notifyItemChanged(android.support.v17.leanback.widget.ArrayObjectAdapter, java.lang.Object);
+ method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+ method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+ method protected abstract android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+ method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+ method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
+ method protected void onPlayCompleted();
+ method protected void onPlayStateChanged();
+ method protected void onPreparedStateChanged();
+ method public final void seekTo(long);
+ method public void setArt(android.graphics.drawable.Drawable);
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+ method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+ method public void setSubtitle(java.lang.CharSequence);
+ method public void setTitle(java.lang.CharSequence);
+ }
+
+ 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 deprecated 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 android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+ 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 deprecated void setControlsRowPresenter(android.support.v17.leanback.widget.PlaybackControlsRowPresenter);
+ method public void setFadingEnabled(boolean);
+ method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+ 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 void addPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+ method public android.content.Context getContext();
+ method public android.support.v17.leanback.media.PlaybackGlueHost getHost();
+ method protected java.util.List<android.support.v17.leanback.media.PlaybackGlue.PlayerCallback> getPlayerCallbacks();
+ method public boolean isPlaying();
+ method public boolean isPrepared();
+ method public deprecated 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 void removePlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+ method public final void setHost(android.support.v17.leanback.media.PlaybackGlueHost);
+ method public deprecated void setPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+ }
+
+ public static abstract class PlaybackGlue.PlayerCallback {
+ ctor public PlaybackGlue.PlayerCallback();
+ method public void onPlayCompleted(android.support.v17.leanback.media.PlaybackGlue);
+ method public void onPlayStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+ method public void onPreparedStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+ method public deprecated void onReadyForPlayback();
+ }
+
+ public abstract class PlaybackGlueHost {
+ ctor public PlaybackGlueHost();
+ method public deprecated void fadeOut();
+ method public android.support.v17.leanback.media.PlaybackGlueHost.PlayerCallback getPlayerCallback();
+ method public void hideControlsOverlay(boolean);
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public boolean isControlsOverlayVisible();
+ method public void notifyPlaybackRowChanged();
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method public deprecated 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);
+ method public void showControlsOverlay(boolean);
+ }
+
+ 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 static class PlaybackGlueHost.PlayerCallback {
+ ctor public PlaybackGlueHost.PlayerCallback();
+ method public void onBufferingStateChanged(boolean);
+ method public void onError(int, java.lang.CharSequence);
+ method public void onVideoSizeChanged(int, int);
+ }
+
+ public class PlaybackTransportControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+ ctor public PlaybackTransportControlGlue(android.content.Context, T);
+ method public final android.support.v17.leanback.widget.PlaybackSeekDataProvider getSeekProvider();
+ method public final boolean isSeekEnabled();
+ method public void onActionClicked(android.support.v17.leanback.widget.Action);
+ method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+ method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+ method public final void setSeekEnabled(boolean);
+ method public final void setSeekProvider(android.support.v17.leanback.widget.PlaybackSeekDataProvider);
+ }
+
+ public abstract class PlayerAdapter {
+ ctor public PlayerAdapter();
+ method public long getBufferedPosition();
+ method public final android.support.v17.leanback.media.PlayerAdapter.Callback getCallback();
+ method public long getCurrentPosition();
+ method public long getDuration();
+ method public boolean isPlaying();
+ method public boolean isPrepared();
+ method public void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+ method public void onDetachedFromHost();
+ method public abstract void pause();
+ method public abstract void play();
+ method public void seekTo(long);
+ method public final void setCallback(android.support.v17.leanback.media.PlayerAdapter.Callback);
+ method public void setProgressUpdatingEnabled(boolean);
+ }
+
+ public static class PlayerAdapter.Callback {
+ ctor public PlayerAdapter.Callback();
+ method public void onBufferedPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onBufferingStateChanged(android.support.v17.leanback.media.PlayerAdapter, boolean);
+ method public void onCurrentPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onDurationChanged(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onError(android.support.v17.leanback.media.PlayerAdapter, int, java.lang.String);
+ method public void onPlayCompleted(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onPlayStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onPreparedStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+ method public void onVideoSizeChanged(android.support.v17.leanback.media.PlayerAdapter, int, int);
+ }
+
+ 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 protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateDefaultLayoutParams();
+ method public android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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 class BaseGridView extends android.support.v7.widget.RecyclerView {
+ method public void addOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+ method public void animateIn();
+ method public void animateOut();
+ method public int getChildDrawingOrder(int, int);
+ method public deprecated int getHorizontalMargin();
+ method public int getHorizontalSpacing();
+ method public int getInitialPrefetchItemCount();
+ method public int getItemAlignmentOffset();
+ method public float getItemAlignmentOffsetPercent();
+ method public int getItemAlignmentViewId();
+ method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
+ method public final int getSaveChildrenLimitNumber();
+ method public final int getSaveChildrenPolicy();
+ method public int getSelectedPosition();
+ method public deprecated int getVerticalMargin();
+ method public int getVerticalSpacing();
+ method public void getViewSelectedOffsets(android.view.View, int[]);
+ method public int getWindowAlignment();
+ method public int getWindowAlignmentOffset();
+ method public float getWindowAlignmentOffsetPercent();
+ method public boolean hasPreviousViewInSameRow(int);
+ method public boolean isChildLayoutAnimated();
+ method public boolean isFocusDrawingOrderEnabled();
+ method public final boolean isFocusSearchDisabled();
+ method public boolean isItemAlignmentOffsetWithPadding();
+ method public boolean isScrollEnabled();
+ method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+ method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+ method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+ method public void removeOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+ method public void setAnimateChildLayout(boolean);
+ method public void setChildrenVisibility(int);
+ method public void setFocusDrawingOrderEnabled(boolean);
+ method public final void setFocusSearchDisabled(boolean);
+ method public void setGravity(int);
+ method public void setHasOverlappingRendering(boolean);
+ method public deprecated void setHorizontalMargin(int);
+ method public void setHorizontalSpacing(int);
+ method public void setInitialPrefetchItemCount(int);
+ method public void setItemAlignmentOffset(int);
+ method public void setItemAlignmentOffsetPercent(float);
+ method public void setItemAlignmentOffsetWithPadding(boolean);
+ method public void setItemAlignmentViewId(int);
+ method public deprecated void setItemMargin(int);
+ method public void setItemSpacing(int);
+ method public void setLayoutEnabled(boolean);
+ method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
+ method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
+ method public void setOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+ method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
+ method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
+ method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
+ method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
+ method public void setPruneChild(boolean);
+ method public final void setSaveChildrenLimitNumber(int);
+ method public final void setSaveChildrenPolicy(int);
+ method public void setScrollEnabled(boolean);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, int);
+ method public void setSelectedPosition(int, android.support.v17.leanback.widget.ViewHolderTask);
+ method public void setSelectedPositionSmooth(int);
+ method public void setSelectedPositionSmooth(int, android.support.v17.leanback.widget.ViewHolderTask);
+ method public deprecated void setVerticalMargin(int);
+ method public void setVerticalSpacing(int);
+ method public void setWindowAlignment(int);
+ method public void setWindowAlignmentOffset(int);
+ method public void setWindowAlignmentOffsetPercent(float);
+ method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+ method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+ field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+ field public static final int SAVE_ALL_CHILD = 3; // 0x3
+ field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+ field public static final int SAVE_NO_CHILD = 0; // 0x0
+ field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+ field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+ field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+ field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+ field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+ field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+ }
+
+ public static abstract interface BaseGridView.OnKeyInterceptListener {
+ method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
+ }
+
+ public static abstract interface BaseGridView.OnMotionInterceptListener {
+ method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
+ }
+
+ public static abstract interface BaseGridView.OnTouchInterceptListener {
+ method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
+ }
+
+ public static abstract interface BaseGridView.OnUnhandledKeyListener {
+ method public abstract boolean onUnhandledKey(android.view.KeyEvent);
+ }
+
+ public 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 deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+ method public static deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView, boolean);
+ method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter);
+ method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, 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 openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+ 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.v17.leanback.widget.BaseGridView {
+ 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 protected void applySelectLevelToChild(android.support.v17.leanback.widget.ListRowPresenter.ViewHolder, android.view.View);
+ 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 long getBufferedPosition();
+ method public deprecated int getBufferedProgress();
+ method public deprecated long getBufferedProgressLong();
+ method public long getCurrentPosition();
+ method public deprecated int getCurrentTime();
+ method public deprecated long getCurrentTimeLong();
+ method public long getDuration();
+ 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 deprecated int getTotalTime();
+ method public deprecated long getTotalTimeLong();
+ method public void setBufferedPosition(long);
+ method public deprecated void setBufferedProgress(int);
+ method public deprecated void setBufferedProgressLong(long);
+ method public void setCurrentPosition(long);
+ method public deprecated void setCurrentTime(int);
+ method public deprecated void setCurrentTimeLong(long);
+ method public void setDuration(long);
+ method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+ method public final void setImageDrawable(android.graphics.drawable.Drawable);
+ method public void setOnPlaybackProgressChangedListener(android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback);
+ method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+ method public deprecated void setTotalTime(int);
+ method public deprecated 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 final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field public static deprecated int OFF;
+ field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field public static deprecated int OFF;
+ field public static deprecated 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.OnPlaybackProgressCallback {
+ ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
+ method public void onBufferedPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+ method public void onCurrentPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+ method public void onDurationChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+ }
+
+ 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 final int INDEX_PAUSE = 1; // 0x1
+ field public static final int INDEX_PLAY = 0; // 0x0
+ field public static deprecated int PAUSE;
+ field public static deprecated 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 deprecated int ALL;
+ field public static final int INDEX_ALL = 1; // 0x1
+ field public static final int INDEX_NONE = 0; // 0x0
+ field public static final int INDEX_ONE = 2; // 0x2
+ field public static deprecated int NONE;
+ field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field public static deprecated int OFF;
+ field public static deprecated 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 final int INDEX_OUTLINE = 1; // 0x1
+ field public static final int INDEX_SOLID = 0; // 0x0
+ field public static deprecated int OUTLINE;
+ field public static deprecated 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 class PlaybackSeekDataProvider {
+ ctor public PlaybackSeekDataProvider();
+ method public long[] getSeekPositions();
+ method public void getThumbnail(int, android.support.v17.leanback.widget.PlaybackSeekDataProvider.ResultCallback);
+ method public void reset();
+ }
+
+ public static class PlaybackSeekDataProvider.ResultCallback {
+ ctor public PlaybackSeekDataProvider.ResultCallback();
+ method public void onThumbnailLoaded(android.graphics.Bitmap, int);
+ }
+
+ public abstract interface PlaybackSeekUi {
+ method public abstract void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ }
+
+ public static class PlaybackSeekUi.Client {
+ ctor public PlaybackSeekUi.Client();
+ method public android.support.v17.leanback.widget.PlaybackSeekDataProvider getPlaybackSeekDataProvider();
+ method public boolean isSeekEnabled();
+ method public void onSeekFinished(boolean);
+ method public void onSeekPositionChanged(long);
+ method public void onSeekStarted();
+ }
+
+ public class PlaybackTransportRowPresenter extends android.support.v17.leanback.widget.PlaybackRowPresenter {
+ ctor public PlaybackTransportRowPresenter();
+ method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+ method public float getDefaultSeekIncrement();
+ method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+ method public int getProgressColor();
+ method protected void onProgressBarClicked(android.support.v17.leanback.widget.PlaybackTransportRowPresenter.ViewHolder);
+ method public void setDefaultSeekIncrement(float);
+ method public void setDescriptionPresenter(android.support.v17.leanback.widget.Presenter);
+ method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+ method public void setProgressColor(int);
+ }
+
+ public class PlaybackTransportRowPresenter.ViewHolder extends android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder implements android.support.v17.leanback.widget.PlaybackSeekUi {
+ ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+ method public final android.widget.TextView getCurrentPositionView();
+ method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDescriptionViewHolder();
+ method public final android.widget.TextView getDurationView();
+ method protected void onSetCurrentPositionLabel(long);
+ method protected void onSetDurationLabel(long);
+ method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+ }
+
+ 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.v17.leanback.widget.BaseGridView {
+ 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 deprecated 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 deprecated 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 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();
+ 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 android.animation.Animator onCreateAnimator(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 android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+ 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 public void onMultiWindowModeChanged(boolean);
+ method public void onPictureInPictureModeChanged(boolean);
+ 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 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();
+ 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 onFragmentPreCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+ 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 deprecated void setup();
+ method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
+ method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
+ }
+
+ public abstract class FragmentTransaction {
+ ctor public FragmentTransaction();
+ method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
+ method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
+ method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
+ method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
+ method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
+ method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
+ method public abstract int commit();
+ method public abstract int commitAllowingStateLoss();
+ method public abstract void commitNow();
+ method public abstract void commitNowAllowingStateLoss();
+ method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
+ method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
+ method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
+ method public abstract boolean isAddToBackStackAllowed();
+ method public abstract boolean isEmpty();
+ method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
+ method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
+ method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
+ method public abstract android.support.v4.app.FragmentTransaction runOnCommit(java.lang.Runnable);
+ method public abstract deprecated 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 setReorderingAllowed(boolean);
+ 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 FrameMetricsAggregator {
+ ctor public FrameMetricsAggregator();
+ ctor public FrameMetricsAggregator(int);
+ method public void add(android.app.Activity);
+ method public android.util.SparseIntArray[] getMetrics();
+ method public android.util.SparseIntArray[] remove(android.app.Activity);
+ method public android.util.SparseIntArray[] reset();
+ method public android.util.SparseIntArray[] stop();
+ field public static final int ANIMATION_DURATION = 256; // 0x100
+ field public static final int ANIMATION_INDEX = 8; // 0x8
+ field public static final int COMMAND_DURATION = 32; // 0x20
+ field public static final int COMMAND_INDEX = 5; // 0x5
+ field public static final int DELAY_DURATION = 128; // 0x80
+ field public static final int DELAY_INDEX = 7; // 0x7
+ field public static final int DRAW_DURATION = 8; // 0x8
+ field public static final int DRAW_INDEX = 3; // 0x3
+ field public static final int EVERY_DURATION = 511; // 0x1ff
+ field public static final int INPUT_DURATION = 2; // 0x2
+ field public static final int INPUT_INDEX = 1; // 0x1
+ field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+ field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+ field public static final int SWAP_DURATION = 64; // 0x40
+ field public static final int SWAP_INDEX = 6; // 0x6
+ field public static final int SYNC_DURATION = 16; // 0x10
+ field public static final int SYNC_INDEX = 4; // 0x4
+ field public static final int TOTAL_DURATION = 1; // 0x1
+ field public static final int TOTAL_INDEX = 0; // 0x0
+ }
+
+ public abstract class JobIntentService extends android.app.Service {
+ ctor public JobIntentService();
+ method public static void enqueueWork(android.content.Context, java.lang.Class, int, android.content.Intent);
+ method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+ method public boolean isStopped();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method protected abstract void onHandleWork(android.content.Intent);
+ method public boolean onStopCurrentWork();
+ method public void setInterruptIfStopped(boolean);
+ }
+
+ 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 int getBadgeIconType(android.app.Notification);
+ method public static java.lang.String getCategory(android.app.Notification);
+ method public static java.lang.String getChannelId(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 int getGroupAlertBehavior(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 getTimeoutAfter(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";
+ 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 GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 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, java.lang.String);
+ ctor public deprecated 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 setBadgeIconType(int);
+ method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+ method public android.support.v4.app.NotificationCompat.Builder setChannelId(java.lang.String);
+ method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+ method public android.support.v4.app.NotificationCompat.Builder setColorized(boolean);
+ 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 setGroupAlertBehavior(int);
+ 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 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);
+ 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 setTimeoutAfter(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);
+ 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 class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ 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 android.os.Bundle getExtras();
+ 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);
+ method public static void startForegroundService(android.content.Context, android.content.Intent);
+ }
+
+ 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 java.lang.String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+ 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 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 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);
+ }
+
+}
+
+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 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);
+ 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;
+ method public static android.graphics.Typeface getFont(android.content.Context, int) 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 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();
+ 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 setDither(boolean);
+ 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 class AudioAttributesCompat {
+ method public int getContentType();
+ method public int getFlags();
+ method public int getLegacyStreamType();
+ method public int getUsage();
+ method public int getVolumeControlStream();
+ method public java.lang.Object unwrap();
+ method public static android.support.v4.media.AudioAttributesCompat wrap(java.lang.Object);
+ field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
+ field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
+ field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
+ field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
+ field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
+ field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
+ field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
+ field public static final int USAGE_ALARM = 4; // 0x4
+ field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
+ field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
+ field public static final int USAGE_ASSISTANCE_SONIFICATION = 13; // 0xd
+ field public static final int USAGE_ASSISTANT = 16; // 0x10
+ field public static final int USAGE_GAME = 14; // 0xe
+ field public static final int USAGE_MEDIA = 1; // 0x1
+ field public static final int USAGE_NOTIFICATION = 5; // 0x5
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9; // 0x9
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8; // 0x8
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7; // 0x7
+ field public static final int USAGE_NOTIFICATION_EVENT = 10; // 0xa
+ field public static final int USAGE_NOTIFICATION_RINGTONE = 6; // 0x6
+ field public static final int USAGE_UNKNOWN = 0; // 0x0
+ field public static final int USAGE_VOICE_COMMUNICATION = 2; // 0x2
+ field public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; // 0x3
+ }
+
+ public static class AudioAttributesCompat.Builder {
+ ctor public AudioAttributesCompat.Builder();
+ ctor public AudioAttributesCompat.Builder(android.support.v4.media.AudioAttributesCompat);
+ method public android.support.v4.media.AudioAttributesCompat build();
+ method public android.support.v4.media.AudioAttributesCompat.Builder setContentType(int);
+ method public android.support.v4.media.AudioAttributesCompat.Builder setFlags(int);
+ method public android.support.v4.media.AudioAttributesCompat.Builder setLegacyStreamType(int);
+ method public android.support.v4.media.AudioAttributesCompat.Builder setUsage(int);
+ }
+
+ 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 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);
+ method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+ field public static final java.lang.String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
+ field public static final java.lang.String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
+ field public static final java.lang.String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
+ field public static final java.lang.String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
+ 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.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);
+ 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 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);
+ 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 sendError(android.os.Bundle);
+ method public void sendProgressUpdate(android.os.Bundle);
+ 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";
+ field public static final java.lang.String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
+ field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
+ field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
+ field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
+ }
+
+ 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_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
+ 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 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.app {
+
+ public class NotificationCompat {
+ }
+
+ public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.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 static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+ method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+ }
+
+}
+
+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 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 int getShuffleMode();
+ method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+ method public boolean isCaptioningEnabled();
+ method public deprecated 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 deprecated 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 deprecated void onShuffleModeChanged(boolean);
+ method public void onShuffleModeChanged(int);
+ }
+
+ 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 setRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+ method public abstract void setRepeatMode(int);
+ method public abstract void setShuffleMode(int);
+ method public abstract deprecated void setShuffleModeEnabled(boolean);
+ method public abstract void skipToNext();
+ method public abstract void skipToPrevious();
+ method public abstract void skipToQueueItem(long);
+ method public abstract void stop();
+ field public static final java.lang.String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+ }
+
+ 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 setShuffleMode(int);
+ method public deprecated 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_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
+ field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
+ field public static final java.lang.String ACTION_UNFOLLOW = "android.support.v4.media.session.action.UNFOLLOW";
+ field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE";
+ field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE_VALUE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE_VALUE";
+ 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
+ field public static final int MEDIA_ATTRIBUTE_ALBUM = 1; // 0x1
+ field public static final int MEDIA_ATTRIBUTE_ARTIST = 0; // 0x0
+ field public static final int MEDIA_ATTRIBUTE_PLAYLIST = 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 deprecated 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 onSetRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+ method public void onSetRepeatMode(int);
+ method public void onSetShuffleMode(int);
+ method public deprecated 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_GROUP = 3; // 0x3
+ 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 SHUFFLE_MODE_ALL = 1; // 0x1
+ field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
+ field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
+ 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 deprecated boolean isAtLeastN();
+ method public static deprecated boolean isAtLeastNMR1();
+ method public static deprecated boolean isAtLeastO();
+ method public static boolean isAtLeastOMR1();
+ method public static boolean isAtLeastP();
+ }
+
+ 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 ConfigurationCompat {
+ method public static android.support.v4.os.LocaleListCompat getLocales(android.content.res.Configuration);
+ }
+
+ 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 final class LocaleListCompat {
+ method public static android.support.v4.os.LocaleListCompat create(java.util.Locale...);
+ method public static android.support.v4.os.LocaleListCompat forLanguageTags(java.lang.String);
+ method public java.util.Locale get(int);
+ method public static android.support.v4.os.LocaleListCompat getAdjustedDefault();
+ method public static android.support.v4.os.LocaleListCompat getDefault();
+ method public static android.support.v4.os.LocaleListCompat getEmptyLocaleList();
+ method public java.util.Locale getFirstMatch(java.lang.String[]);
+ method public int indexOf(java.util.Locale);
+ method public boolean isEmpty();
+ method public int size();
+ method public java.lang.String toLanguageTags();
+ method public java.lang.Object unwrap();
+ method public static android.support.v4.os.LocaleListCompat wrap(java.lang.Object);
+ }
+
+ 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);
+ }
+
+ public final class FontRequest {
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, int);
+ method public java.util.List<java.util.List<byte[]>> getCertificates();
+ method public int getCertificatesArrayResId();
+ method public java.lang.String getProviderAuthority();
+ method public java.lang.String getProviderPackage();
+ method public java.lang.String getQuery();
+ }
+
+ public class FontsContractCompat {
+ method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontsContractCompat.FontInfo[]);
+ method public static android.support.v4.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFont(android.content.Context, android.support.v4.provider.FontRequest, android.support.v4.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+ }
+
+ public static final class FontsContractCompat.Columns {
+ ctor public FontsContractCompat.Columns();
+ field public static final java.lang.String FILE_ID = "file_id";
+ 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";
+ }
+
+ public static class FontsContractCompat.FontFamilyResult {
+ method public android.support.v4.provider.FontsContractCompat.FontInfo[] getFonts();
+ method public int getStatusCode();
+ field public static final int STATUS_OK = 0; // 0x0
+ field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+ field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+ }
+
+ public static class FontsContractCompat.FontInfo {
+ method public int getResultCode();
+ method public int getTtcIndex();
+ method public android.net.Uri getUri();
+ method public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static class FontsContractCompat.FontRequestCallback {
+ ctor public FontsContractCompat.FontRequestCallback();
+ method public void onTypefaceRequestFailed(int);
+ method public 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.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 deprecated 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);
+ }
+
+}
+
+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 ObjectsCompat {
+ method public static boolean equals(java.lang.Object, java.lang.Object);
+ }
+
+ 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_ROTARY_ENCODER = 4194304; // 0x400000
+ 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 static int getAlphabeticModifiers(android.view.MenuItem);
+ method public static java.lang.CharSequence getContentDescription(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);
+ 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 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);
+ 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 int AXIS_SCROLL = 26; // 0x1a
+ 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 abstract interface NestedScrollingChild2 implements android.support.v4.view.NestedScrollingChild {
+ method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public abstract boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ method public abstract boolean hasNestedScrollingParent(int);
+ method public abstract boolean startNestedScroll(int, int);
+ method public abstract void stopNestedScroll(int);
+ }
+
+ 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 dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ method public boolean hasNestedScrollingParent();
+ method public boolean hasNestedScrollingParent(int);
+ 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 boolean startNestedScroll(int, int);
+ method public void stopNestedScroll();
+ method public void stopNestedScroll(int);
+ }
+
+ 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 abstract interface NestedScrollingParent2 implements android.support.v4.view.NestedScrollingParent {
+ method public abstract void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public abstract void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public abstract void onStopNestedScroll(android.view.View, int);
+ }
+
+ 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 onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
+ 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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+ 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 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 {
+ 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 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);
+ 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 dispatchNestedPreScroll(android.view.View, int, int, int[], int[], int);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+ method public static boolean dispatchNestedScroll(android.view.View, int, 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 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);
+ 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 hasExplicitFocusable(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View, int);
+ 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 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);
+ 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 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);
+ 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 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);
+ 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 boolean startNestedScroll(android.view.View, int, int);
+ method public static void stopNestedScroll(android.view.View);
+ method public static void stopNestedScroll(android.view.View, int);
+ 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
+ field public static final int TYPE_NON_TOUCH = 1; // 0x1
+ field public static final int TYPE_TOUCH = 0; // 0x0
+ }
+
+ public final deprecated class ViewConfigurationCompat {
+ method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+ method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ 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 onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+ method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+ method public static boolean onStartNestedScroll(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, int);
+ method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+ method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+ 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 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 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 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 {
+ 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 boolean equals(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 int hashCode();
+ 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 class CircularProgressDrawable extends android.graphics.drawable.Drawable {
+ ctor public CircularProgressDrawable(android.content.Context);
+ method public void draw(android.graphics.Canvas);
+ method public boolean getArrowEnabled();
+ method public float getArrowHeight();
+ method public float getArrowScale();
+ method public float getArrowWidth();
+ method public int getBackgroundColor();
+ method public float getCenterRadius();
+ method public int[] getColorSchemeColors();
+ method public float getEndTrim();
+ method public int getOpacity();
+ method public float getProgressRotation();
+ method public float getStartTrim();
+ method public android.graphics.Paint.Cap getStrokeCap();
+ method public float getStrokeWidth();
+ method public boolean isRunning();
+ method public void setAlpha(int);
+ method public void setArrowDimensions(float, float);
+ method public void setArrowEnabled(boolean);
+ method public void setArrowScale(float);
+ method public void setBackgroundColor(int);
+ method public void setCenterRadius(float);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setColorSchemeColors(int...);
+ method public void setProgressRotation(float);
+ method public void setStartEndTrim(float, float);
+ method public void setStrokeCap(android.graphics.Paint.Cap);
+ method public void setStrokeWidth(float);
+ method public void setStyle(int);
+ method public void start();
+ method public void stop();
+ field public static final int DEFAULT = 1; // 0x1
+ field public static final int LARGE = 0; // 0x0
+ }
+
+ 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 class ImageViewCompat {
+ method public static android.content.res.ColorStateList getImageTintList(android.widget.ImageView);
+ method public static android.graphics.PorterDuff.Mode getImageTintMode(android.widget.ImageView);
+ method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList);
+ method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode);
+ }
+
+ public final class ListPopupWindowCompat {
+ 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 {
+ 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 boolean canScrollList(android.widget.ListView, int);
+ method public static void scrollListBy(android.widget.ListView, int);
+ }
+
+ public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 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 dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fling(int);
+ method public boolean fullScroll(int);
+ method public int getMaxScrollAmount();
+ method public boolean hasNestedScrollingParent(int);
+ 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);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(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 int getAutoSizeMaxTextSize(android.widget.TextView);
+ method public static int getAutoSizeMinTextSize(android.widget.TextView);
+ method public static int getAutoSizeStepGranularity(android.widget.TextView);
+ method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+ method public static int getAutoSizeTextType(android.widget.TextView);
+ 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 setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+ 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);
+ field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+ field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+ }
+
+ 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 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 supportInvalidateOptionsMenu();
+ 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 <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();
+ 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 deprecated class NotificationCompat extends android.support.v4.app.NotificationCompat {
+ ctor public deprecated NotificationCompat();
+ method public static deprecated android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+ }
+
+ public static deprecated class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
+ ctor public deprecated NotificationCompat.Builder(android.content.Context);
+ }
+
+ public static deprecated class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle {
+ ctor public deprecated NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ public static deprecated class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle {
+ ctor public deprecated NotificationCompat.DecoratedMediaCustomViewStyle();
+ }
+
+ public static deprecated class NotificationCompat.MediaStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+ ctor public deprecated NotificationCompat.MediaStyle();
+ ctor public deprecated NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+ method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+ method public deprecated 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 java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
+ method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+ 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 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);
+ 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 boolean persistStringSet(java.util.Set<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 setIconSpaceReserved(boolean);
+ 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 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);
+ 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 PreferenceDataStore {
+ ctor public PreferenceDataStore();
+ method public boolean getBoolean(java.lang.String, boolean);
+ method public float getFloat(java.lang.String, float);
+ method public int getInt(java.lang.String, int);
+ method public long getLong(java.lang.String, long);
+ method public java.lang.String getString(java.lang.String, java.lang.String);
+ method public java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
+ method public void putBoolean(java.lang.String, boolean);
+ method public void putFloat(java.lang.String, float);
+ method public void putInt(java.lang.String, int);
+ method public void putLong(java.lang.String, long);
+ method public void putString(java.lang.String, java.lang.String);
+ method public void putStringSet(java.lang.String, java.util.Set<java.lang.String>);
+ }
+
+ 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.PreferenceDataStore getPreferenceDataStore();
+ 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 void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+ 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 protected android.support.v7.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+ method public android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setTextAppearance(android.content.Context, 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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setSupportAllCaps(boolean);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ 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);
+ method public void setTextAppearance(android.content.Context, 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setTextAppearance(android.content.Context, 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ }
+
+ 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ }
+
+ 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setTextAppearance(android.content.Context, 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ }
+
+ 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);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setTextAppearance(android.content.Context, 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 protected android.support.v7.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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 protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateDefaultLayoutParams();
+ method public android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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 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 protected android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+ 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.NestedScrollingChild2 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 dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ 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 hasNestedScrollingParent(int);
+ 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 boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(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 getRemainingScrollHorizontal();
+ method public int getRemainingScrollVertical();
+ 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.RecyclerView.SmoothScroller createScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+ method protected deprecated 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 protected android.support.v7.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+ method public android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ 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.wear.widget {
+
+ 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 public android.support.wear.widget.BoxInsetLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ 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.wear.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
+ 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 CircularProgressLayout extends android.widget.FrameLayout {
+ ctor public CircularProgressLayout(android.content.Context);
+ ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet);
+ ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public int getBackgroundColor();
+ method public int[] getColorSchemeColors();
+ method public android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener getOnTimerFinishedListener();
+ method public android.support.v4.widget.CircularProgressDrawable getProgressDrawable();
+ method public float getStartingRotation();
+ method public float getStrokeWidth();
+ method public long getTotalTime();
+ method public boolean isIndeterminate();
+ method public boolean isTimerRunning();
+ method public void setColorSchemeColors(int...);
+ method public void setIndeterminate(boolean);
+ method public void setOnTimerFinishedListener(android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener);
+ method public void setStartingRotation(float);
+ method public void setStrokeWidth(float);
+ method public void setTotalTime(long);
+ method public void startTimer();
+ method public void stopTimer();
+ }
+
+ public static abstract interface CircularProgressLayout.OnTimerFinishedListener {
+ method public abstract void onTimerFinished(android.support.wear.widget.CircularProgressLayout);
+ }
+
+ public class CurvingLayoutCallback extends android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback {
+ ctor public CurvingLayoutCallback(android.content.Context);
+ method public void adjustAnchorOffsetXY(android.view.View, float[]);
+ method public void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+ }
+
+ public class RoundedDrawable extends android.graphics.drawable.Drawable {
+ ctor public RoundedDrawable();
+ method public void draw(android.graphics.Canvas);
+ method public int getBackgroundColor();
+ method public android.graphics.drawable.Drawable getDrawable();
+ method public int getOpacity();
+ method public int getRadius();
+ method public boolean isClipEnabled();
+ method public void setAlpha(int);
+ method public void setBackgroundColor(int);
+ method public void setClipEnabled(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDrawable(android.graphics.drawable.Drawable);
+ method public void setRadius(int);
+ }
+
+ 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.wear.widget.SwipeDismissFrameLayout.Callback);
+ method public void removeCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+ }
+
+ public static abstract class SwipeDismissFrameLayout.Callback {
+ ctor public SwipeDismissFrameLayout.Callback();
+ method public void onDismissed(android.support.wear.widget.SwipeDismissFrameLayout);
+ method public void onSwipeCanceled(android.support.wear.widget.SwipeDismissFrameLayout);
+ method public void onSwipeStarted(android.support.wear.widget.SwipeDismissFrameLayout);
+ }
+
+ public class WearableLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+ ctor public WearableLinearLayoutManager(android.content.Context, android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+ ctor public WearableLinearLayoutManager(android.content.Context);
+ method public android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback getLayoutCallback();
+ method public void setLayoutCallback(android.support.wear.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 {
+ 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 getBezelFraction();
+ method public float getScrollDegreesPerScreen();
+ method public boolean isCircularScrollingGestureEnabled();
+ method public boolean isEdgeItemsCenteringEnabled();
+ method public void setBezelFraction(float);
+ method public void setCircularScrollingGestureEnabled(boolean);
+ method public void setEdgeItemsCenteringEnabled(boolean);
+ method public void setScrollDegreesPerScreen(float);
+ }
+
+}
+
+package android.support.wear.widget.drawer {
+
+ public class WearableActionDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+ ctor public WearableActionDrawerView(android.content.Context);
+ ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet);
+ ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int);
+ ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.view.Menu getMenu();
+ method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
+ method public void setTitle(java.lang.CharSequence);
+ }
+
+ public class WearableDrawerController {
+ method public void closeDrawer();
+ method public void openDrawer();
+ method public void peekDrawer();
+ }
+
+ public class WearableDrawerLayout extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingParent android.view.View.OnLayoutChangeListener {
+ ctor public WearableDrawerLayout(android.content.Context);
+ ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet);
+ ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public void onFlingComplete(android.view.View);
+ method public void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
+ method public void setDrawerStateCallback(android.support.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback);
+ }
+
+ public static class WearableDrawerLayout.DrawerStateCallback {
+ ctor public WearableDrawerLayout.DrawerStateCallback();
+ method public void onDrawerClosed(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+ method public void onDrawerOpened(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+ method public void onDrawerStateChanged(android.support.wear.widget.drawer.WearableDrawerLayout, int);
+ }
+
+ public class WearableDrawerView extends android.widget.FrameLayout {
+ ctor public WearableDrawerView(android.content.Context);
+ ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet);
+ ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int);
+ ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.support.wear.widget.drawer.WearableDrawerController getController();
+ method public android.view.View getDrawerContent();
+ method public int getDrawerState();
+ method public boolean isAutoPeekEnabled();
+ method public boolean isClosed();
+ method public boolean isLocked();
+ method public boolean isLockedWhenClosed();
+ method public boolean isOpenOnlyAtTopEnabled();
+ method public boolean isOpened();
+ method public boolean isPeekOnScrollDownEnabled();
+ method public boolean isPeeking();
+ method public void onDrawerClosed();
+ method public void onDrawerOpened();
+ method public void onDrawerStateChanged(int);
+ method public void onPeekContainerClicked(android.view.View);
+ method public void setDrawerContent(android.view.View);
+ method public void setIsAutoPeekEnabled(boolean);
+ method public void setIsLocked(boolean);
+ method public void setLockedWhenClosed(boolean);
+ method public void setOpenOnlyAtTopEnabled(boolean);
+ method public void setPeekContent(android.view.View);
+ method public void setPeekOnScrollDownEnabled(boolean);
+ 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 class WearableNavigationDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+ ctor public WearableNavigationDrawerView(android.content.Context);
+ ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet);
+ ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int);
+ ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+ method public void addOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+ method public int getNavigationStyle();
+ method public void removeOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+ method public void setAdapter(android.support.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter);
+ method public void setCurrentItem(int, boolean);
+ field public static final int MULTI_PAGE = 1; // 0x1
+ field public static final int SINGLE_PAGE = 0; // 0x0
+ }
+
+ public static abstract interface WearableNavigationDrawerView.OnItemSelectedListener {
+ method public abstract void onItemSelected(int);
+ }
+
+ public static abstract class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
+ ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
+ method public abstract int getCount();
+ method public abstract android.graphics.drawable.Drawable getItemDrawable(int);
+ method public abstract java.lang.CharSequence getItemText(int);
+ method public void notifyDataSetChanged();
+ }
+
+}
+
diff --git a/app-toolkit/common/build.gradle b/app-toolkit/common/build.gradle
new file mode 100644
index 0000000..2f54c2a
--- /dev/null
+++ b/app-toolkit/common/build.gradle
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+apply plugin: 'java'
+apply plugin: 'maven'
+
+sourceCompatibility = 1.7
+
+dependencies {
+ compile libs.support.annotations
+
+ testCompile libs.junit
+ testCompile libs.mockito_core
+}
+
+archivesBaseName = "common"
+
+createAndroidCheckstyle(project)
diff --git a/app-toolkit/common/src/main/java/android/arch/core/internal/FastSafeIterableMap.java b/app-toolkit/common/src/main/java/android/arch/core/internal/FastSafeIterableMap.java
new file mode 100644
index 0000000..dbd4d5f
--- /dev/null
+++ b/app-toolkit/common/src/main/java/android/arch/core/internal/FastSafeIterableMap.java
@@ -0,0 +1,80 @@
+/*
+ * 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.arch.core.internal;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Poor's man LinkedHashMap, which supports modifications during iterations.
+ * Takes more memory that {@link SafeIterableMap}
+ * It is NOT thread safe.
+ *
+ * @param <K> Key type
+ * @param <V> Value type
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class FastSafeIterableMap<K, V> extends SafeIterableMap<K, V> {
+
+ private HashMap<K, Entry<K, V>> mHashMap = new HashMap<>();
+
+ @Override
+ protected Entry<K, V> get(K k) {
+ return mHashMap.get(k);
+ }
+
+ @Override
+ public V putIfAbsent(@NonNull K key, @NonNull V v) {
+ Entry<K, V> current = get(key);
+ if (current != null) {
+ return current.mValue;
+ }
+ mHashMap.put(key, put(key, v));
+ return null;
+ }
+
+ @Override
+ public V remove(@NonNull K key) {
+ V removed = super.remove(key);
+ mHashMap.remove(key);
+ return removed;
+ }
+
+ /**
+ * Returns {@code true} if this map contains a mapping for the specified
+ * key.
+ */
+ public boolean contains(K key) {
+ return mHashMap.containsKey(key);
+ }
+
+ /**
+ * Return an entry added to prior to an entry associated with the given key.
+ *
+ * @param k the key
+ */
+ public Map.Entry<K, V> ceil(K k) {
+ if (contains(k)) {
+ return mHashMap.get(k).mPrevious;
+ }
+ return null;
+ }
+}
diff --git a/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java b/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java
new file mode 100644
index 0000000..16a7607
--- /dev/null
+++ b/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java
@@ -0,0 +1,383 @@
+/*
+ * 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.arch.core.internal;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+/**
+ * LinkedList, which pretends to be a map and supports modifications during iterations.
+ * It is NOT thread safe.
+ *
+ * @param <K> Key type
+ * @param <V> Value type
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {
+
+ private Entry<K, V> mStart;
+ private Entry<K, V> mEnd;
+ // using WeakHashMap over List<WeakReference>, so we don't have to manually remove
+ // WeakReferences that have null in them.
+ private WeakHashMap<SupportRemove<K, V>, Boolean> mIterators = new WeakHashMap<>();
+ private int mSize = 0;
+
+ protected Entry<K, V> get(K k) {
+ Entry<K, V> currentNode = mStart;
+ while (currentNode != null) {
+ if (currentNode.mKey.equals(k)) {
+ break;
+ }
+ currentNode = currentNode.mNext;
+ }
+ return currentNode;
+ }
+
+ /**
+ * If the specified key is not already associated
+ * with a value, associates it with the given value.
+ *
+ * @param key key with which the specified value is to be associated
+ * @param v value to be associated with the specified key
+ * @return the previous value associated with the specified key,
+ * or {@code null} if there was no mapping for the key
+ */
+ public V putIfAbsent(@NonNull K key, @NonNull V v) {
+ Entry<K, V> entry = get(key);
+ if (entry != null) {
+ return entry.mValue;
+ }
+ put(key, v);
+ return null;
+ }
+
+ protected Entry<K, V> put(@NonNull K key, @NonNull V v) {
+ Entry<K, V> newEntry = new Entry<>(key, v);
+ mSize++;
+ if (mEnd == null) {
+ mStart = newEntry;
+ mEnd = mStart;
+ return newEntry;
+ }
+
+ mEnd.mNext = newEntry;
+ newEntry.mPrevious = mEnd;
+ mEnd = newEntry;
+ return newEntry;
+
+ }
+
+ /**
+ * Removes the mapping for a key from this map if it is present.
+ *
+ * @param key key whose mapping is to be removed from the map
+ * @return the previous value associated with the specified key,
+ * or {@code null} if there was no mapping for the key
+ */
+ public V remove(@NonNull K key) {
+ Entry<K, V> toRemove = get(key);
+ if (toRemove == null) {
+ return null;
+ }
+ mSize--;
+ if (!mIterators.isEmpty()) {
+ for (SupportRemove<K, V> iter : mIterators.keySet()) {
+ iter.supportRemove(toRemove);
+ }
+ }
+
+ if (toRemove.mPrevious != null) {
+ toRemove.mPrevious.mNext = toRemove.mNext;
+ } else {
+ mStart = toRemove.mNext;
+ }
+
+ if (toRemove.mNext != null) {
+ toRemove.mNext.mPrevious = toRemove.mPrevious;
+ } else {
+ mEnd = toRemove.mPrevious;
+ }
+
+ toRemove.mNext = null;
+ toRemove.mPrevious = null;
+ return toRemove.mValue;
+ }
+
+ /**
+ * @return the number of elements in this map
+ */
+ public int size() {
+ return mSize;
+ }
+
+ /**
+ * @return an ascending iterator, which doesn't include new elements added during an
+ * iteration.
+ */
+ @NonNull
+ @Override
+ public Iterator<Map.Entry<K, V>> iterator() {
+ ListIterator<K, V> iterator = new AscendingIterator<>(mStart, mEnd);
+ mIterators.put(iterator, false);
+ return iterator;
+ }
+
+ /**
+ * @return an descending iterator, which doesn't include new elements added during an
+ * iteration.
+ */
+ public Iterator<Map.Entry<K, V>> descendingIterator() {
+ DescendingIterator<K, V> iterator = new DescendingIterator<>(mEnd, mStart);
+ mIterators.put(iterator, false);
+ return iterator;
+ }
+
+ /**
+ * return an iterator with additions.
+ */
+ public IteratorWithAdditions iteratorWithAdditions() {
+ @SuppressWarnings("unchecked")
+ IteratorWithAdditions iterator = new IteratorWithAdditions();
+ mIterators.put(iterator, false);
+ return iterator;
+ }
+
+ /**
+ * @return eldest added entry or null
+ */
+ public Map.Entry<K, V> eldest() {
+ return mStart;
+ }
+
+ /**
+ * @return newest added entry or null
+ */
+ public Map.Entry<K, V> newest() {
+ return mEnd;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof SafeIterableMap)) {
+ return false;
+ }
+ SafeIterableMap map = (SafeIterableMap) obj;
+ if (this.size() != map.size()) {
+ return false;
+ }
+ Iterator<Map.Entry<K, V>> iterator1 = iterator();
+ Iterator iterator2 = map.iterator();
+ while (iterator1.hasNext() && iterator2.hasNext()) {
+ Map.Entry<K, V> next1 = iterator1.next();
+ Object next2 = iterator2.next();
+ if ((next1 == null && next2 != null)
+ || (next1 != null && !next1.equals(next2))) {
+ return false;
+ }
+ }
+ return !iterator1.hasNext() && !iterator2.hasNext();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("[");
+ Iterator<Map.Entry<K, V>> iterator = iterator();
+ while (iterator.hasNext()) {
+ builder.append(iterator.next().toString());
+ if (iterator.hasNext()) {
+ builder.append(", ");
+ }
+ }
+ builder.append("]");
+ return builder.toString();
+ }
+
+ private abstract static class ListIterator<K, V> implements Iterator<Map.Entry<K, V>>,
+ SupportRemove<K, V> {
+ Entry<K, V> mExpectedEnd;
+ Entry<K, V> mNext;
+
+ ListIterator(Entry<K, V> start, Entry<K, V> expectedEnd) {
+ this.mExpectedEnd = expectedEnd;
+ this.mNext = start;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return mNext != null;
+ }
+
+ @Override
+ public void supportRemove(@NonNull Entry<K, V> entry) {
+ if (mExpectedEnd == entry && entry == mNext) {
+ mNext = null;
+ mExpectedEnd = null;
+ }
+
+ if (mExpectedEnd == entry) {
+ mExpectedEnd = backward(mExpectedEnd);
+ }
+
+ if (mNext == entry) {
+ mNext = nextNode();
+ }
+ }
+
+ private Entry<K, V> nextNode() {
+ if (mNext == mExpectedEnd || mExpectedEnd == null) {
+ return null;
+ }
+ return forward(mNext);
+ }
+
+ @Override
+ public Map.Entry<K, V> next() {
+ Map.Entry<K, V> result = mNext;
+ mNext = nextNode();
+ return result;
+ }
+
+ abstract Entry<K, V> forward(Entry<K, V> entry);
+
+ abstract Entry<K, V> backward(Entry<K, V> entry);
+ }
+
+ static class AscendingIterator<K, V> extends ListIterator<K, V> {
+ AscendingIterator(Entry<K, V> start, Entry<K, V> expectedEnd) {
+ super(start, expectedEnd);
+ }
+
+ @Override
+ Entry<K, V> forward(Entry<K, V> entry) {
+ return entry.mNext;
+ }
+
+ @Override
+ Entry<K, V> backward(Entry<K, V> entry) {
+ return entry.mPrevious;
+ }
+ }
+
+ private static class DescendingIterator<K, V> extends ListIterator<K, V> {
+
+ DescendingIterator(Entry<K, V> start, Entry<K, V> expectedEnd) {
+ super(start, expectedEnd);
+ }
+
+ @Override
+ Entry<K, V> forward(Entry<K, V> entry) {
+ return entry.mPrevious;
+ }
+
+ @Override
+ Entry<K, V> backward(Entry<K, V> entry) {
+ return entry.mNext;
+ }
+ }
+
+ private class IteratorWithAdditions implements Iterator<Map.Entry<K, V>>, SupportRemove<K, V> {
+ private Entry<K, V> mCurrent;
+ private boolean mFirstStep = true;
+
+ @Override
+ public void supportRemove(@NonNull Entry<K, V> entry) {
+ if (entry == mCurrent) {
+ mCurrent = mCurrent.mPrevious;
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (mFirstStep) {
+ return mStart != null;
+ }
+ return mCurrent != null && mCurrent.mNext != null;
+ }
+
+ @Override
+ public Map.Entry<K, V> next() {
+ if (mFirstStep) {
+ mFirstStep = false;
+ mCurrent = mStart;
+ } else {
+ mCurrent = mCurrent != null ? mCurrent.mNext : null;
+ }
+ return mCurrent;
+ }
+ }
+
+ interface SupportRemove<K, V> {
+ void supportRemove(@NonNull Entry<K, V> entry);
+ }
+
+ static class Entry<K, V> implements Map.Entry<K, V> {
+ @NonNull
+ final K mKey;
+ @NonNull
+ final V mValue;
+ Entry<K, V> mNext;
+ Entry<K, V> mPrevious;
+
+ Entry(@NonNull K key, @NonNull V value) {
+ mKey = key;
+ this.mValue = value;
+ }
+
+ @NonNull
+ @Override
+ public K getKey() {
+ return mKey;
+ }
+
+ @NonNull
+ @Override
+ public V getValue() {
+ return mValue;
+ }
+
+ @Override
+ public V setValue(V value) {
+ throw new UnsupportedOperationException("An entry modification is not supported");
+ }
+
+ @Override
+ public String toString() {
+ return mKey + "=" + mValue;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof Entry)) {
+ return false;
+ }
+ Entry entry = (Entry) obj;
+ return mKey.equals(entry.mKey) && mValue.equals(entry.mValue);
+ }
+ }
+}
diff --git a/app-toolkit/core/src/main/java/android/arch/core/util/Function.java b/app-toolkit/common/src/main/java/android/arch/core/util/Function.java
similarity index 100%
rename from app-toolkit/core/src/main/java/android/arch/core/util/Function.java
rename to app-toolkit/common/src/main/java/android/arch/core/util/Function.java
diff --git a/app-toolkit/common/src/test/java/android/arch/core/internal/FastSafeIterableMapTest.java b/app-toolkit/common/src/test/java/android/arch/core/internal/FastSafeIterableMapTest.java
new file mode 100644
index 0000000..41b1497
--- /dev/null
+++ b/app-toolkit/common/src/test/java/android/arch/core/internal/FastSafeIterableMapTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.arch.core.internal;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class FastSafeIterableMapTest {
+ @Test
+ public void testCeil() {
+ FastSafeIterableMap<Integer, Boolean> map = new FastSafeIterableMap<>();
+ assertThat(map.ceil(1), nullValue());
+ map.putIfAbsent(1, false);
+ assertThat(map.ceil(1), nullValue());
+ map.putIfAbsent(2, false);
+ assertThat(map.ceil(2).getKey(), is(1));
+ map.remove(1);
+ assertThat(map.ceil(2), nullValue());
+ }
+
+ @Test
+ public void testPut() {
+ FastSafeIterableMap<Integer, Integer> map = new FastSafeIterableMap<>();
+ map.putIfAbsent(10, 20);
+ map.putIfAbsent(20, 40);
+ map.putIfAbsent(30, 60);
+ assertThat(map.putIfAbsent(5, 10), is((Integer) null));
+ assertThat(map.putIfAbsent(10, 30), is(20));
+ }
+
+ @Test
+ public void testContains() {
+ FastSafeIterableMap<Integer, Integer> map = new FastSafeIterableMap<>();
+ map.putIfAbsent(10, 20);
+ map.putIfAbsent(20, 40);
+ map.putIfAbsent(30, 60);
+ assertThat(map.contains(10), is(true));
+ assertThat(map.contains(11), is(false));
+ assertThat(new FastSafeIterableMap<Integer, Integer>().contains(0), is(false));
+ }
+
+
+ @Test
+ public void testRemove() {
+ FastSafeIterableMap<Integer, Integer> map = new FastSafeIterableMap<>();
+ map.putIfAbsent(10, 20);
+ map.putIfAbsent(20, 40);
+ assertThat(map.contains(10), is(true));
+ assertThat(map.contains(20), is(true));
+ assertThat(map.remove(10), is(20));
+ assertThat(map.contains(10), is(false));
+ assertThat(map.putIfAbsent(10, 30), nullValue());
+ assertThat(map.putIfAbsent(10, 40), is(30));
+ }
+}
diff --git a/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java b/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
new file mode 100644
index 0000000..4b25e34
--- /dev/null
+++ b/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
@@ -0,0 +1,475 @@
+/*
+ * 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.arch.core.internal;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+@RunWith(JUnit4.class)
+public class SafeIterableMapTest {
+
+ @Test
+ public void testToString() {
+ SafeIterableMap<Integer, String> map = from(1, 2, 3, 4).to("a", "b", "c", "d");
+ assertThat(map.toString(), is("[1=a, 2=b, 3=c, 4=d]"));
+ }
+
+ @Test
+ public void testEmptyToString() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ assertThat(map.toString(), is("[]"));
+ }
+
+ @Test
+ public void testOneElementToString() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1);
+ assertThat(map.toString(), is("[1=true]"));
+ }
+
+
+ @Test
+ public void testEquality1() {
+ SafeIterableMap<Integer, Integer> map1 = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ SafeIterableMap<Integer, Integer> map2 = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ assertThat(map1.equals(map2), is(true));
+ }
+
+ @Test
+ public void testEquality2() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ //noinspection ObjectEqualsNull
+ assertThat(map.equals(null), is(false));
+ }
+
+ @Test
+ public void testEquality3() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ //noinspection EqualsBetweenInconvertibleTypes
+ assertThat(map.equals(new ArrayList<>()), is(false));
+ }
+
+ @Test
+ public void testEquality4() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ assertThat(map.equals(new SafeIterableMap<Integer, Boolean>()), is(false));
+ }
+
+ @Test
+ public void testEquality5() {
+ SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
+ SafeIterableMap<Integer, Boolean> map2 = mapOf(1);
+ assertThat(map1.equals(map2), is(false));
+ }
+
+ @Test
+ public void testEquality6() {
+ SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
+ SafeIterableMap<Integer, Boolean> map2 = mapOf(1, 2, 3, 5);
+ assertThat(map1.equals(map2), is(false));
+ }
+
+ @Test
+ public void testEquality7() {
+ SafeIterableMap<Integer, Integer> map1 = from(1, 2, 3, 4).to(1, 2, 3, 4);
+ SafeIterableMap<Integer, Integer> map2 = from(1, 2, 3, 4).to(1, 2, 3, 5);
+ assertThat(map1.equals(map2), is(false));
+ }
+
+
+ @Test
+ public void testEquality8() {
+ SafeIterableMap<Integer, Boolean> map1 = mapOf();
+ SafeIterableMap<Integer, Boolean> map2 = mapOf();
+ assertThat(map1.equals(map2), is(true));
+ }
+
+ @Test
+ public void testEqualityRespectsOrder() {
+ SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
+ SafeIterableMap<Integer, Boolean> map2 = mapOf(1, 3, 2, 4);
+ assertThat(map1.equals(map2), is(false));
+ }
+
+ @Test
+ public void testPut() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ assertThat(map.putIfAbsent(5, 10), is((Integer) null));
+ assertThat(map, is(from(1, 2, 3, 4, 5).to(10, 20, 30, 40, 10)));
+ }
+
+ @Test
+ public void testAddExisted() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 261, 40);
+ assertThat(map.putIfAbsent(3, 239), is(261));
+ assertThat(map, is(from(1, 2, 3, 4).to(10, 20, 261, 40)));
+ }
+
+ @Test
+ public void testRemoveLast() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ assertThat(map.remove(4), is(40));
+ assertThat(map, is(from(1, 2, 3).to(10, 20, 30)));
+ }
+
+ @Test
+ public void testRemoveFirst() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ assertThat(map.remove(1), is(true));
+ assertThat(map, is(mapOf(2, 3, 4)));
+ }
+
+ @Test
+ public void testRemoveMiddle() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ assertThat(map.remove(2), is(20));
+ assertThat(map.remove(3), is(30));
+ assertThat(map, is(from(1, 4).to(10, 40)));
+ }
+
+ @Test
+ public void testRemoveNotExisted() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ assertThat(map.remove(5), is((Boolean) null));
+ assertThat(map, is(mapOf(1, 2, 3, 4)));
+ }
+
+ @Test
+ public void testRemoveSole() {
+ SafeIterableMap<Integer, Integer> map = from(1).to(261);
+ assertThat(map.remove(1), is(261));
+ assertThat(map, is(new SafeIterableMap<Integer, Integer>()));
+ }
+
+ @Test
+ public void testRemoveDuringIteration1() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ int index = 0;
+ int[] expected = new int[]{1, 4};
+ for (Entry<Integer, Integer> i : map) {
+ assertThat(i.getKey(), is(expected[index++]));
+ if (index == 1) {
+ assertThat(map.remove(2), is(20));
+ assertThat(map.remove(3), is(30));
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveDuringIteration2() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2).to(10, 20);
+ Iterator<Entry<Integer, Integer>> iter = map.iterator();
+ assertThat(map.remove(2), is(20));
+ assertThat(map.remove(1), is(10));
+ assertThat(iter.hasNext(), is(false));
+ }
+
+ @Test
+ public void testRemoveDuringIteration3() {
+ SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
+ int index = 0;
+ Iterator<Entry<Integer, Integer>> iter = map.iterator();
+ assertThat(map.remove(1), is(10));
+ assertThat(map.remove(2), is(20));
+ int[] expected = new int[]{3, 4};
+ while (iter.hasNext()) {
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ }
+
+ @Test
+ public void testAdditionDuringIteration() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{1, 2, 3, 4};
+ int index = 0;
+ for (Entry<Integer, Boolean> entry : map) {
+ assertThat(entry.getKey(), is(expected[index++]));
+ if (index == 1) {
+ map.putIfAbsent(5, true);
+ }
+ }
+ }
+
+ @Test
+ public void testReAdditionDuringIteration() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{1, 2, 4};
+ int index = 0;
+ for (Entry<Integer, Boolean> entry : map) {
+ assertThat(entry.getKey(), is(expected[index++]));
+ if (index == 1) {
+ map.remove(3);
+ map.putIfAbsent(3, true);
+ }
+ }
+ }
+
+ @Test
+ public void testSize() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ assertThat(map.size(), is(4));
+ map.putIfAbsent(5, true);
+ map.putIfAbsent(6, true);
+ assertThat(map.size(), is(6));
+ map.remove(5);
+ map.remove(5);
+ assertThat(map.size(), is(5));
+ map.remove(1);
+ map.remove(2);
+ map.remove(4);
+ map.remove(3);
+ map.remove(6);
+ assertThat(map.size(), is(0));
+ map.putIfAbsent(4, true);
+ assertThat(map.size(), is(1));
+ assertThat(mapOf().size(), is(0));
+ }
+
+ @Test
+ public void testIteratorWithAdditions1() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{1, 2, 3, 5};
+ int index = 0;
+ Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+ while (iterator.hasNext()) {
+ Entry<Integer, Boolean> entry = iterator.next();
+ assertThat(entry.getKey(), is(expected[index++]));
+ if (index == 3) {
+ map.remove(4);
+ map.putIfAbsent(5, true);
+ }
+ }
+ }
+
+ @Test
+ public void testIteratorWithAdditions2() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1);
+ int[] expected = new int[]{1, 2, 3};
+ int index = 0;
+ Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+ while (iterator.hasNext()) {
+ Entry<Integer, Boolean> entry = iterator.next();
+ assertThat(entry.getKey(), is(expected[index++]));
+ if (index == 1) {
+ map.putIfAbsent(2, true);
+ map.putIfAbsent(3, true);
+ }
+ }
+ assertThat(index, is(3));
+ }
+
+
+ @Test
+ public void testIteratorWithAdditions3() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3);
+ int[] expected = new int[]{1};
+ int index = 0;
+ Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+ while (iterator.hasNext()) {
+ Entry<Integer, Boolean> entry = iterator.next();
+ assertThat(entry.getKey(), is(expected[index++]));
+ map.remove(2);
+ map.remove(3);
+ }
+ assertThat(index, is(1));
+ }
+
+ @Test
+ public void testIteratorWithAdditions4() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ int[] expected = new int[]{1, 2, 3};
+ int index = 0;
+ Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+ map.putIfAbsent(1, true);
+ while (iterator.hasNext()) {
+ Entry<Integer, Boolean> entry = iterator.next();
+ assertThat(entry.getKey(), is(expected[index++]));
+ if (index == 1) {
+ map.putIfAbsent(2, false);
+ }
+ if (index == 2) {
+ map.putIfAbsent(3, false);
+ }
+ }
+ assertThat(index, is(3));
+ }
+
+ @Test
+ public void testDescendingIteration() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{4, 3, 2, 1};
+ int index = 0;
+ for (Iterator<Entry<Integer, Boolean>> iter = map.descendingIterator(); iter.hasNext(); ) {
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ assertThat(index, is(4));
+ }
+
+ @Test
+ public void testDescendingIterationRemove1() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{4, 3, 2};
+ int index = 0;
+ for (Iterator<Entry<Integer, Boolean>> iter = map.descendingIterator(); iter.hasNext(); ) {
+ if (index == 1) {
+ map.remove(1);
+ }
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ assertThat(index, is(3));
+ assertThat(map.size(), is(3));
+ }
+
+ @Test
+ public void testDescendingIterationRemove2() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{3, 2, 1};
+ int index = 0;
+ for (Iterator<Entry<Integer, Boolean>> iter = map.descendingIterator(); iter.hasNext(); ) {
+ if (index == 0) {
+ map.remove(4);
+ }
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ assertThat(index, is(3));
+ assertThat(map.size(), is(3));
+ }
+
+ @Test
+ public void testDescendingIterationRemove3() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{4, 1};
+ int index = 0;
+ for (Iterator<Entry<Integer, Boolean>> iter = map.descendingIterator(); iter.hasNext(); ) {
+ if (index == 1) {
+ map.remove(3);
+ map.remove(2);
+ }
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ assertThat(index, is(2));
+ assertThat(map.size(), is(2));
+ }
+
+ @Test
+ public void testDescendingIterationAddition() {
+ SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
+ int[] expected = new int[]{4, 3, 2, 1};
+ int index = 0;
+ for (Iterator<Entry<Integer, Boolean>> iter = map.descendingIterator(); iter.hasNext(); ) {
+ if (index == 0) {
+ map.putIfAbsent(5, false);
+ }
+ assertThat(iter.next().getKey(), is(expected[index++]));
+ }
+ assertThat(index, is(4));
+ assertThat(map.size(), is(5));
+ }
+
+ @Test
+ public void testDescendingIteratorEmpty() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ Iterator<Entry<Integer, Boolean>> iterator = map.descendingIterator();
+ assertThat(iterator.hasNext(), is(false));
+ }
+
+ @Test
+ public void testIteratorEmpty() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ Iterator<Entry<Integer, Boolean>> iterator = map.iterator();
+ assertThat(iterator.hasNext(), is(false));
+ }
+
+ @Test
+ public void testIteratorWithAdditionEmpty() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+ assertThat(iterator.hasNext(), is(false));
+ }
+
+ @Test
+ public void testEldest() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ assertThat(map.eldest(), nullValue());
+ map.putIfAbsent(1, false);
+ assertThat(map.eldest().getKey(), is(1));
+ map.putIfAbsent(2, false);
+ assertThat(map.eldest().getKey(), is(1));
+ map.remove(1);
+ assertThat(map.eldest().getKey(), is(2));
+ map.remove(2);
+ assertThat(map.eldest(), nullValue());
+ }
+
+ @Test
+ public void testNewest() {
+ SafeIterableMap<Integer, Boolean> map = mapOf();
+ assertThat(map.newest(), nullValue());
+ map.putIfAbsent(1, false);
+ assertThat(map.newest().getKey(), is(1));
+ map.putIfAbsent(2, false);
+ assertThat(map.newest().getKey(), is(2));
+ map.remove(2);
+ assertThat(map.eldest().getKey(), is(1));
+ map.remove(1);
+ assertThat(map.newest(), nullValue());
+ }
+
+
+ // for most operations we don't care about values, so we create map from key to true
+ @SafeVarargs
+ private static <K> SafeIterableMap<K, Boolean> mapOf(K... keys) {
+ SafeIterableMap<K, Boolean> map = new SafeIterableMap<>();
+ for (K key : keys) {
+ map.putIfAbsent(key, true);
+ }
+ return map;
+ }
+
+ @SafeVarargs
+ private static <K> MapBuilder<K> from(K... keys) {
+ return new MapBuilder<>(keys);
+ }
+
+ private static class MapBuilder<K> {
+ final K[] mKeys;
+
+ MapBuilder(K[] keys) {
+ this.mKeys = keys;
+ }
+
+ @SafeVarargs
+ public final <V> SafeIterableMap<K, V> to(V... values) {
+ assertThat("Failed to build Map", mKeys.length, is(values.length));
+ SafeIterableMap<K, V> map = new SafeIterableMap<>();
+ for (int i = 0; i < mKeys.length; i++) {
+ map.putIfAbsent(mKeys[i], values[i]);
+ }
+ return map;
+ }
+ }
+}
+
+
diff --git a/app-toolkit/core-testing/build.gradle b/app-toolkit/core-testing/build.gradle
index 52ff125..c757533 100644
--- a/app-toolkit/core-testing/build.gradle
+++ b/app-toolkit/core-testing/build.gradle
@@ -41,7 +41,7 @@
}
dependencies {
- compile project(":arch:core")
+ compile project(":arch:runtime")
compile libs.support.annotations
compile libs.support.core_utils
compile(libs.junit) {
diff --git a/app-toolkit/core/build.gradle b/app-toolkit/core/build.gradle
deleted file mode 100644
index ceb6628..0000000
--- a/app-toolkit/core/build.gradle
+++ /dev/null
@@ -1,70 +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.
- */
-import com.android.builder.core.BuilderConstants
-apply plugin: 'com.android.library'
-apply plugin: 'maven'
-
-android {
- compileSdkVersion tools.current_sdk
- buildToolsVersion tools.build_tools_version
-
- defaultConfig {
- minSdkVersion flatfoot.min_sdk
- targetSdkVersion tools.current_sdk
- versionCode 1
- versionName "1.0"
-
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-
- testOptions {
- unitTests.returnDefaultValues = true
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
-}
-
-dependencies {
- compile libs.support.annotations
- testCompile libs.junit
- testCompile libs.mockito_core
- testCompile(libs.test_runner) {
- exclude module: 'support-annotations'
- }
-}
-
-archivesBaseName = "core"
-
-createAndroidCheckstyle(project)
-
-android.libraryVariants.all { variant ->
- def name = variant.buildType.name
- def suffix = name.capitalize()
- def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
- dependsOn variant.javaCompile
- from variant.javaCompile.destinationDir
- destinationDir new File(project.buildDir, "libJar")
- }
-}
diff --git a/app-toolkit/core/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java b/app-toolkit/core/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
deleted file mode 100644
index 29d9c1b..0000000
--- a/app-toolkit/core/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
+++ /dev/null
@@ -1,89 +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.arch.core.executor;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-
-/**
- * A static class that serves as a central point to execute common tasks.
- * <p>
- *
- * @hide This API is not final.
- */
-@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP, RestrictTo.Scope.TESTS})
-public class AppToolkitTaskExecutor extends TaskExecutor {
- private static volatile AppToolkitTaskExecutor sInstance;
-
- @NonNull
- private TaskExecutor mDelegate;
-
- @NonNull
- private TaskExecutor mDefaultTaskExecutor;
-
- private AppToolkitTaskExecutor() {
- mDefaultTaskExecutor = new DefaultTaskExecutor();
- mDelegate = mDefaultTaskExecutor;
- }
-
- /**
- * Returns an instance of the task executor.
- *
- * @return The singleton AppToolkitTaskExecutor.
- */
- public static AppToolkitTaskExecutor getInstance() {
- if (sInstance != null) {
- return sInstance;
- }
- synchronized (AppToolkitTaskExecutor.class) {
- if (sInstance == null) {
- sInstance = new AppToolkitTaskExecutor();
- }
- }
- return sInstance;
- }
-
- /**
- * Sets a delegate to handle task execution requests.
- * <p>
- * If you have a common executor, you can set it as the delegate and App Toolkit components will
- * use your executors. You may also want to use this for your tests.
- * <p>
- * Calling this method with {@code null} sets it to the default TaskExecutor.
- *
- * @param taskExecutor The task executor to handle task requests.
- */
- public void setDelegate(@Nullable TaskExecutor taskExecutor) {
- mDelegate = taskExecutor == null ? mDefaultTaskExecutor : taskExecutor;
- }
-
- @Override
- public void executeOnDiskIO(Runnable runnable) {
- mDelegate.executeOnDiskIO(runnable);
- }
-
- @Override
- public void postToMainThread(Runnable runnable) {
- mDelegate.postToMainThread(runnable);
- }
-
- @Override
- public boolean isMainThread() {
- return mDelegate.isMainThread();
- }
-}
diff --git a/app-toolkit/core/src/main/java/android/arch/core/executor/TaskExecutor.java b/app-toolkit/core/src/main/java/android/arch/core/executor/TaskExecutor.java
deleted file mode 100644
index 1e8124b..0000000
--- a/app-toolkit/core/src/main/java/android/arch/core/executor/TaskExecutor.java
+++ /dev/null
@@ -1,66 +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.arch.core.executor;
-
-import android.support.annotation.RestrictTo;
-
-/**
- * A task executor that can divide tasks into logical groups.
- * <p>
- * It holds a collection a executors for each group of task.
- * <p>
- * TODO: Don't use this from outside, we don't know what the API will look like yet.
- * @hide
- */
-@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP, RestrictTo.Scope.TESTS})
-public abstract class TaskExecutor {
- /**
- * Executes the given task in the disk IO thread pool.
- *
- * @param runnable The runnable to run in the disk IO thread pool.
- */
- public abstract void executeOnDiskIO(Runnable runnable);
-
- /**
- * Posts the given task to the main thread.
- *
- * @param runnable The runnable to run on the main thread.
- */
- public abstract void postToMainThread(Runnable runnable);
-
- /**
- * Executes the given task on the main thread.
- * <p>
- * If the current thread is a main thread, immediately runs the given runnable.
- *
- * @param runnable The runnable to run on the main thread.
- */
- public void executeOnMainThread(Runnable runnable) {
- if (isMainThread()) {
- runnable.run();
- } else {
- postToMainThread(runnable);
- }
- }
-
- /**
- * Returns true if the current thread is the main thread, false otherwise.
- *
- * @return true if we are on the main thread, false otherwise.
- */
- public abstract boolean isMainThread();
-}
diff --git a/app-toolkit/core/src/main/java/android/arch/core/internal/SafeIterableMap.java b/app-toolkit/core/src/main/java/android/arch/core/internal/SafeIterableMap.java
deleted file mode 100644
index 63ac9a6..0000000
--- a/app-toolkit/core/src/main/java/android/arch/core/internal/SafeIterableMap.java
+++ /dev/null
@@ -1,278 +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.arch.core.internal;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * A map class that can keep a list associated pairs of keys and values
- * and allows modifications while traversing.
- * It is NOT thread safe.
- *
- * @param <K> Key type
- * @param <V> Value type
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@SuppressWarnings("WeakerAccess")
-public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {
-
- private Entry<K, V> mStart;
- private Entry<K, V> mEnd;
- // using WeakHashMap over List<WeakReference>, so we don't have to manually remove
- // WeakReferences that have null in them.
- private WeakHashMap<ListIterator<K, V>, Boolean> mIterators = new WeakHashMap<>();
- private int mSize = 0;
- @SuppressWarnings("unchecked")
- private static final Entry UNREACHABLE = new Entry(new Object(), new Object());
-
- private Entry<K, V> find(K k) {
- Entry<K, V> toRemove = mStart;
- while (toRemove != null) {
- if (toRemove.mKey.equals(k)) {
- break;
- }
- toRemove = toRemove.mNext;
- }
- return toRemove;
- }
-
- /**
- * If the specified key is not already associated
- * with a value, associates it with the given value.
- *
- * @param key key with which the specified value is to be associated
- * @param v value to be associated with the specified key
- * @return the previous value associated with the specified key,
- * or {@code null} if there was no mapping for the key
- */
- public V putIfAbsent(@NonNull K key, @NonNull V v) {
- Entry<K, V> entry = find(key);
- if (entry != null) {
- return entry.mValue;
- }
- Entry<K, V> newEntry = new Entry<>(key, v);
- mSize++;
- if (mEnd == null) {
- mStart = newEntry;
- mEnd = mStart;
- return null;
- }
-
- mEnd.mNext = newEntry;
- newEntry.mPrevious = mEnd;
- mEnd = newEntry;
- return null;
- }
-
- /**
- * Removes the mapping for a key from this map if it is present.
- *
- * @param key key whose mapping is to be removed from the map
- * @return the previous value associated with the specified key,
- * or {@code null} if there was no mapping for the key
- */
- public V remove(@NonNull K key) {
- Entry<K, V> toRemove = find(key);
- if (toRemove == null) {
- return null;
- }
- mSize--;
- if (!mIterators.isEmpty()) {
- for (ListIterator<K, V> iter : mIterators.keySet()) {
- iter.supportRemove(toRemove);
- }
- }
-
- if (toRemove.mPrevious != null) {
- toRemove.mPrevious.mNext = toRemove.mNext;
- } else {
- mStart = toRemove.mNext;
- }
-
- if (toRemove.mNext != null) {
- toRemove.mNext.mPrevious = toRemove.mPrevious;
- } else {
- mEnd = toRemove.mPrevious;
- }
-
- toRemove.mNext = null;
- toRemove.mPrevious = null;
- return toRemove.mValue;
- }
-
- /**
- * @return the number of elements in this map
- */
- public int size() {
- return mSize;
- }
-
- @Override
- public ListIterator<K, V> iterator() {
- ListIterator<K, V> iterator = new ListIterator<>(mStart, mEnd);
- mIterators.put(iterator, false);
- return iterator;
- }
-
- /**
- * return an iterator with additions
- */
- public ListIterator<K, V> iteratorWithAdditions() {
- @SuppressWarnings("unchecked")
- ListIterator<K, V> iterator = new ListIterator<>(mStart, UNREACHABLE);
- mIterators.put(iterator, false);
- return iterator;
- }
-
- private static class ListIterator<K, V> implements Iterator<Map.Entry<K, V>> {
- Entry<K, V> mExpectedEnd;
- Entry<K, V> mNext;
-
- ListIterator(Entry<K, V> start, Entry<K, V> expectedEnd) {
- this.mExpectedEnd = expectedEnd;
- this.mNext = start;
- }
-
- @Override
- public boolean hasNext() {
- return mNext != null;
- }
-
- void supportRemove(@NonNull Entry<K, V> entry) {
- if (mExpectedEnd == entry && entry == mNext) {
- mNext = null;
- mExpectedEnd = null;
- }
-
- if (mExpectedEnd == entry) {
- mExpectedEnd = mExpectedEnd.mPrevious;
- }
-
- if (mNext == entry) {
- mNext = nextNode();
- }
- }
-
- private Entry<K, V> nextNode() {
- if (mNext == mExpectedEnd || mExpectedEnd == null) {
- return null;
- }
- return mNext.mNext;
- }
-
- @Override
- public Map.Entry<K, V> next() {
- Map.Entry<K, V> result = mNext;
- mNext = nextNode();
- return result;
- }
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj instanceof SafeIterableMap)) {
- return false;
- }
- SafeIterableMap map = (SafeIterableMap) obj;
- if (this.size() != map.size()) {
- return false;
- }
- ListIterator<K, V> iterator1 = iterator();
- ListIterator iterator2 = map.iterator();
- while (iterator1.hasNext() && iterator2.hasNext()) {
- Map.Entry<K, V> next1 = iterator1.next();
- Object next2 = iterator2.next();
- if ((next1 == null && next2 != null)
- || (next1 != null && !next1.equals(next2))) {
- return false;
- }
- }
- return !iterator1.hasNext() && !iterator2.hasNext();
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("[");
- ListIterator<K, V> iterator = iterator();
- while (iterator.hasNext()) {
- builder.append(iterator.next().toString());
- if (iterator.hasNext()) {
- builder.append(", ");
- }
- }
- builder.append("]");
- return builder.toString();
- }
-
- private static class Entry<K, V> implements Map.Entry<K, V> {
- @NonNull
- final K mKey;
- @NonNull
- final V mValue;
- Entry<K, V> mNext;
- Entry<K, V> mPrevious;
-
- Entry(@NonNull K key, @NonNull V value) {
- mKey = key;
- this.mValue = value;
- }
-
- @NonNull
- @Override
- public K getKey() {
- return mKey;
- }
-
- @NonNull
- @Override
- public V getValue() {
- return mValue;
- }
-
- @Override
- public V setValue(V value) {
- throw new UnsupportedOperationException("An entry modification is not supported");
- }
-
- @Override
- public String toString() {
- return mKey + "=" + mValue;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj instanceof Entry)) {
- return false;
- }
- Entry entry = (Entry) obj;
- return mKey.equals(entry.mKey) && mValue.equals(entry.mValue);
- }
- }
-}
diff --git a/app-toolkit/core/src/test/java/android/arch/core/internal/SafeIterableMapTest.java b/app-toolkit/core/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
deleted file mode 100644
index 91814ac..0000000
--- a/app-toolkit/core/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
+++ /dev/null
@@ -1,303 +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.arch.core.internal;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import android.arch.core.internal.SafeIterableMap;
-import android.support.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-@RunWith(JUnit4.class)
-@SmallTest
-public class SafeIterableMapTest {
-
- @Test
- public void testToString() {
- SafeIterableMap<Integer, String> map = from(1, 2, 3, 4).to("a", "b", "c", "d");
- assertThat(map.toString(), is("[1=a, 2=b, 3=c, 4=d]"));
- }
-
- @Test
- public void testEmptyToString() {
- SafeIterableMap<Integer, Boolean> map = mapOf();
- assertThat(map.toString(), is("[]"));
- }
-
- @Test
- public void testOneElementToString() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1);
- assertThat(map.toString(), is("[1=true]"));
- }
-
-
- @Test
- public void testEquality1() {
- SafeIterableMap<Integer, Integer> map1 = from(1, 2, 3, 4).to(10, 20, 30, 40);
- SafeIterableMap<Integer, Integer> map2 = from(1, 2, 3, 4).to(10, 20, 30, 40);
- assertThat(map1.equals(map2), is(true));
- }
-
- @Test
- public void testEquality2() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- //noinspection ObjectEqualsNull
- assertThat(map.equals(null), is(false));
- }
-
- @Test
- public void testEquality3() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- //noinspection EqualsBetweenInconvertibleTypes
- assertThat(map.equals(new ArrayList<>()), is(false));
- }
-
- @Test
- public void testEquality4() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- assertThat(map.equals(new SafeIterableMap<Integer, Boolean>()), is(false));
- }
-
- @Test
- public void testEquality5() {
- SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
- SafeIterableMap<Integer, Boolean> map2 = mapOf(1);
- assertThat(map1.equals(map2), is(false));
- }
-
- @Test
- public void testEquality6() {
- SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
- SafeIterableMap<Integer, Boolean> map2 = mapOf(1, 2, 3, 5);
- assertThat(map1.equals(map2), is(false));
- }
-
- @Test
- public void testEquality7() {
- SafeIterableMap<Integer, Integer> map1 = from(1, 2, 3, 4).to(1, 2, 3, 4);
- SafeIterableMap<Integer, Integer> map2 = from(1, 2, 3, 4).to(1, 2, 3, 5);
- assertThat(map1.equals(map2), is(false));
- }
-
-
- @Test
- public void testEquality8() {
- SafeIterableMap<Integer, Boolean> map1 = mapOf();
- SafeIterableMap<Integer, Boolean> map2 = mapOf();
- assertThat(map1.equals(map2), is(true));
- }
-
- @Test
- public void testEqualityRespectsOrder() {
- SafeIterableMap<Integer, Boolean> map1 = mapOf(1, 2, 3, 4);
- SafeIterableMap<Integer, Boolean> map2 = mapOf(1, 3, 2, 4);
- assertThat(map1.equals(map2), is(false));
- }
-
- @Test
- public void testPut() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
- assertThat(map.putIfAbsent(5, 10), is((Integer) null));
- assertThat(map, is(from(1, 2, 3, 4, 5).to(10, 20, 30, 40, 10)));
- }
-
- @Test
- public void testAddExisted() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 261, 40);
- assertThat(map.putIfAbsent(3, 239), is(261));
- assertThat(map, is(from(1, 2, 3, 4).to(10, 20, 261, 40)));
- }
-
- @Test
- public void testRemoveLast() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
- assertThat(map.remove(4), is(40));
- assertThat(map, is(from(1, 2, 3).to(10, 20, 30)));
- }
-
- @Test
- public void testRemoveFirst() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- assertThat(map.remove(1), is(true));
- assertThat(map, is(mapOf(2, 3, 4)));
- }
-
- @Test
- public void testRemoveMiddle() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
- assertThat(map.remove(2), is(20));
- assertThat(map.remove(3), is(30));
- assertThat(map, is(from(1, 4).to(10, 40)));
- }
-
- @Test
- public void testRemoveNotExisted() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- assertThat(map.remove(5), is((Boolean) null));
- assertThat(map, is(mapOf(1, 2, 3, 4)));
- }
-
- @Test
- public void testRemoveSole() {
- SafeIterableMap<Integer, Integer> map = from(1).to(261);
- assertThat(map.remove(1), is(261));
- assertThat(map, is(new SafeIterableMap<Integer, Integer>()));
- }
-
- @Test
- public void testRemoveDuringIteration1() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
- int index = 0;
- int[] expected = new int[]{1, 4};
- for (Map.Entry<Integer, Integer> i : map) {
- assertThat(i.getKey(), is(expected[index++]));
- if (index == 1) {
- assertThat(map.remove(2), is(20));
- assertThat(map.remove(3), is(30));
- }
- }
- }
-
- @Test
- public void testRemoveDuringIteration2() {
- SafeIterableMap<Integer, Integer> map = from(1, 2).to(10, 20);
- Iterator<Map.Entry<Integer, Integer>> iter = map.iterator();
- assertThat(map.remove(2), is(20));
- assertThat(map.remove(1), is(10));
- assertThat(iter.hasNext(), is(false));
- }
-
- @Test
- public void testRemoveDuringIteration3() {
- SafeIterableMap<Integer, Integer> map = from(1, 2, 3, 4).to(10, 20, 30, 40);
- int index = 0;
- Iterator<Map.Entry<Integer, Integer>> iter = map.iterator();
- assertThat(map.remove(1), is(10));
- assertThat(map.remove(2), is(20));
- int[] expected = new int[]{3, 4};
- while (iter.hasNext()) {
- assertThat(iter.next().getKey(), is(expected[index++]));
- }
- }
-
- @Test
- public void testAdditionDuringIteration() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- int[] expected = new int[]{1, 2, 3, 4};
- int index = 0;
- for (Map.Entry<Integer, Boolean> entry : map) {
- assertThat(entry.getKey(), is(expected[index++]));
- if (index == 1) {
- map.putIfAbsent(5, true);
- }
- }
- }
-
- @Test
- public void testReAdditionDuringIteration() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- int[] expected = new int[]{1, 2, 4};
- int index = 0;
- for (Map.Entry<Integer, Boolean> entry : map) {
- assertThat(entry.getKey(), is(expected[index++]));
- if (index == 1) {
- map.remove(3);
- map.putIfAbsent(3, true);
- }
- }
- }
-
- @Test
- public void testSize() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- assertThat(map.size(), is(4));
- map.putIfAbsent(5, true);
- map.putIfAbsent(6, true);
- assertThat(map.size(), is(6));
- map.remove(5);
- map.remove(5);
- assertThat(map.size(), is(5));
- map.remove(1);
- map.remove(2);
- map.remove(4);
- map.remove(3);
- map.remove(6);
- assertThat(map.size(), is(0));
- map.putIfAbsent(4, true);
- assertThat(map.size(), is(1));
- assertThat(mapOf().size(), is(0));
- }
-
- @Test
- public void testIteratorWithAdditions() {
- SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
- int[] expected = new int[]{1, 2, 3, 5};
- int index = 0;
- Iterator<Map.Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
- while (iterator.hasNext()) {
- Map.Entry<Integer, Boolean> entry = iterator.next();
- assertThat(entry.getKey(), is(expected[index++]));
- if (index == 3) {
- map.remove(4);
- map.putIfAbsent(5, true);
- }
- }
- }
-
- // for most operations we don't care about values, so we create map from key to true
- @SafeVarargs
- private static <K> SafeIterableMap<K, Boolean> mapOf(K... keys) {
- SafeIterableMap<K, Boolean> map = new SafeIterableMap<>();
- for (K key : keys) {
- map.putIfAbsent(key, true);
- }
- return map;
- }
-
- @SafeVarargs
- private static <K> MapBuilder<K> from(K... keys) {
- return new MapBuilder<>(keys);
- }
-
- private static class MapBuilder<K> {
- final K[] mKeys;
-
- MapBuilder(K[] keys) {
- this.mKeys = keys;
- }
-
- @SafeVarargs
- public final <V> SafeIterableMap<K, V> to(V... values) {
- assertThat("Failed to build Map", mKeys.length, is(values.length));
- SafeIterableMap<K, V> map = new SafeIterableMap<>();
- for (int i = 0; i < mKeys.length; i++) {
- map.putIfAbsent(mKeys[i], values[i]);
- }
- return map;
- }
- }
-}
-
-
diff --git a/app-toolkit/dependencies.gradle b/app-toolkit/dependencies.gradle
index ca67c58..5d7ba57 100644
--- a/app-toolkit/dependencies.gradle
+++ b/app-toolkit/dependencies.gradle
@@ -22,12 +22,12 @@
ffLibs = libs
}
def ffVersions = [:]
-ffVersions.kotlin = "1.1.1"
+ffVersions.kotlin = "1.1.3"
ffVersions.auto_common = "0.6"
ffVersions.javapoet = "1.8.0"
-ffVersions.compile_testing = "0.9"
+ffVersions.compile_testing = "0.11"
ffVersions.localize_maven = "1.2"
-ffVersions.support_lib = "25.3.1"
+ffVersions.support_lib = "26.0.0"
ffVersions.intellij_annotations = "12.0"
ffVersions.rxjava2 = "2.0.6"
ffVersions.reactivestreams = "1.0.0"
@@ -37,6 +37,7 @@
ffVersions.antlr = "4.5.3"
ffVersions.commons_codec = "1.10"
ffVersions.gson = "2.8.0"
+ffVersions.guava = "21.0"
ffLibs.kotlin = [
stdlib : "org.jetbrains.kotlin:kotlin-stdlib:$ffVersions.kotlin",
@@ -63,7 +64,9 @@
annotations : getSupportLib(":support-annotations", ffVersions.support_lib),
core_utils : getSupportLib(':support-core-utils', ffVersions.support_lib),
fragments : getSupportLib(':support-fragment', ffVersions.support_lib),
- app_compat : getSupportLib(':support-appcompat-v7', ffVersions.support_lib, ":appcompat-v7")
+ app_compat : getSupportLib(':support-appcompat-v7', ffVersions.support_lib, ":appcompat-v7"),
+ design : getSupportLib(':support-design', ffVersions.support_lib, ":design"),
+ recyclerview : getSupportLib(':support-recyclerview-v7', ffVersions.support_lib, ":recyclerview-v7")
]
ffLibs.localize_maven = "com.android.databinding:localizemaven:$ffVersions.localize_maven"
@@ -75,10 +78,11 @@
ffLibs.reactive_streams = "org.reactivestreams:reactive-streams:$ffVersions.reactivestreams"
ffLibs.rx_java = "io.reactivex.rxjava2:rxjava:$ffVersions.rxjava2"
ffLibs.gson = "com.google.code.gson:gson:$ffVersions.gson"
+ffLibs.guava= "com.google.guava:guava:$ffVersions.guava"
ext.tools = [:]
ext.tools.current_sdk = gradle.ext.currentSdk
ext.tools.build_tools_version = rootProject.ext.buildToolsVersion
ext.flatfoot = [:]
-ext.flatfoot.release_version = "1.0.0-alpha3"
+ext.flatfoot.release_version = "1.0.0-alpha7"
ext.flatfoot.min_sdk = 14
diff --git a/app-toolkit/init.gradle b/app-toolkit/init.gradle
index 13222bf..70e518a 100644
--- a/app-toolkit/init.gradle
+++ b/app-toolkit/init.gradle
@@ -109,14 +109,10 @@
"room" : "android.arch.persistence.room",
"lifecycle" : "android.arch.lifecycle",
"arch" : "android.arch.core",
+ "paging" : "android.arch.paging",
"navigation" : "android.arch.navigation"]
subprojects {
- configurations.all {
- resolutionStrategy {
- force "com.google.guava:guava-jdk5:17.0"
- }
- }
repos.addMavenRepositories(project.repositories)
if (project.name == 'doclava' || project.name == 'jdiff') {
project.tasks.whenTaskAdded { task ->
@@ -129,6 +125,7 @@
def mavenGroup = project.getPath().split(":")[1]
def finalGroup = rootProject.flatfootProjectGroups[mavenGroup]
+
if (finalGroup == null) {
return
}
@@ -235,8 +232,17 @@
def createKotlinCheckstyle(Project project) {
def fs = files();
- fs += files(project.sourceSets.main.allJava.srcDirs.collect{fileTree(it)})
- fs += files(project.sourceSets.test.allJava.srcDirs.collect{fileTree(it)})
+ if (project.sourceSets.hasProperty('main')) {
+ fs += files(project.sourceSets.main.allJava.srcDirs.collect { fileTree(it) })
+ }
+ if (project.sourceSets.hasProperty('test')) {
+ fs += files(project.sourceSets.test.allJava.srcDirs.collect { fileTree(it) })
+ }
+ if (project.hasProperty('android')) {
+ fs += files(project.android.sourceSets.main.java.getSrcDirs().collect {fileTree(it)})
+ fs += files(project.android.sourceSets.test.java.getSrcDirs().collect {fileTree(it)})
+ fs += files(project.android.sourceSets.androidTest.java.getSrcDirs().collect {fileTree(it)})
+ }
fs = fs.filter{file -> file.name.endsWith(".kt")}
def kotlinCheckstyle = createCheckstyleTask(project, 'checkstyleKotlin',
"${project.rootProject.ext.supportRootFolder}/app-toolkit/kotlin-checkstyle.xml",
@@ -245,8 +251,7 @@
project.tasks.findByName("check").dependsOn(kotlinCheckstyle)
// poor man's line length check
def lineCheck = project.tasks.create(name : "lineLengthCheck") {
- (project.sourceSets.main.allJava.getSourceDirectories() +
- project.sourceSets.test.allJava.getSourceDirectories()).each { sourceDir ->
+ fs.each { sourceDir ->
fileTree(dir : sourceDir, include : "**/*.kt").each{ file ->
file.readLines().eachWithIndex { line, index ->
if (line.size() > 100) {
diff --git a/app-toolkit/runtime/build.gradle b/app-toolkit/runtime/build.gradle
new file mode 100644
index 0000000..5e2fe46
--- /dev/null
+++ b/app-toolkit/runtime/build.gradle
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+import com.android.builder.core.BuilderConstants
+apply plugin: 'com.android.library'
+apply plugin: 'maven'
+
+android {
+ compileSdkVersion tools.current_sdk
+ buildToolsVersion tools.build_tools_version
+
+ defaultConfig {
+ minSdkVersion flatfoot.min_sdk
+ targetSdkVersion tools.current_sdk
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+}
+
+dependencies {
+ compile libs.support.annotations
+ compile project(":arch:common")
+ testCompile libs.junit
+ testCompile libs.mockito_core
+ testCompile(libs.test_runner) {
+ exclude module: 'support-annotations'
+ }
+}
+
+archivesBaseName = "runtime"
+
+createAndroidCheckstyle(project)
+
+android.libraryVariants.all { variant ->
+ def name = variant.buildType.name
+ def suffix = name.capitalize()
+ def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+ dependsOn variant.javaCompile
+ from variant.javaCompile.destinationDir
+ destinationDir new File(project.buildDir, "libJar")
+ }
+}
diff --git a/app-toolkit/core/src/main/AndroidManifest.xml b/app-toolkit/runtime/src/main/AndroidManifest.xml
similarity index 100%
rename from app-toolkit/core/src/main/AndroidManifest.xml
rename to app-toolkit/runtime/src/main/AndroidManifest.xml
diff --git a/app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java b/app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
new file mode 100644
index 0000000..7337f74
--- /dev/null
+++ b/app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
@@ -0,0 +1,117 @@
+/*
+ * 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.arch.core.executor;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import java.util.concurrent.Executor;
+
+/**
+ * A static class that serves as a central point to execute common tasks.
+ * <p>
+ *
+ * @hide This API is not final.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class AppToolkitTaskExecutor extends TaskExecutor {
+ private static volatile AppToolkitTaskExecutor sInstance;
+
+ @NonNull
+ private TaskExecutor mDelegate;
+
+ @NonNull
+ private TaskExecutor mDefaultTaskExecutor;
+
+ @NonNull
+ private static final Executor sMainThreadExecutor = new Executor() {
+ @Override
+ public void execute(Runnable command) {
+ getInstance().postToMainThread(command);
+ }
+ };
+
+ @NonNull
+ private static final Executor sIOThreadExecutor = new Executor() {
+ @Override
+ public void execute(Runnable command) {
+ getInstance().executeOnDiskIO(command);
+ }
+ };
+
+ private AppToolkitTaskExecutor() {
+ mDefaultTaskExecutor = new DefaultTaskExecutor();
+ mDelegate = mDefaultTaskExecutor;
+ }
+
+ /**
+ * Returns an instance of the task executor.
+ *
+ * @return The singleton AppToolkitTaskExecutor.
+ */
+ public static AppToolkitTaskExecutor getInstance() {
+ if (sInstance != null) {
+ return sInstance;
+ }
+ synchronized (AppToolkitTaskExecutor.class) {
+ if (sInstance == null) {
+ sInstance = new AppToolkitTaskExecutor();
+ }
+ }
+ return sInstance;
+ }
+
+ /**
+ * Sets a delegate to handle task execution requests.
+ * <p>
+ * If you have a common executor, you can set it as the delegate and App Toolkit components will
+ * use your executors. You may also want to use this for your tests.
+ * <p>
+ * Calling this method with {@code null} sets it to the default TaskExecutor.
+ *
+ * @param taskExecutor The task executor to handle task requests.
+ */
+ public void setDelegate(@Nullable TaskExecutor taskExecutor) {
+ mDelegate = taskExecutor == null ? mDefaultTaskExecutor : taskExecutor;
+ }
+
+ @Override
+ public void executeOnDiskIO(Runnable runnable) {
+ mDelegate.executeOnDiskIO(runnable);
+ }
+
+ @Override
+ public void postToMainThread(Runnable runnable) {
+ mDelegate.postToMainThread(runnable);
+ }
+
+ @NonNull
+ public static Executor getMainThreadExecutor() {
+ return sMainThreadExecutor;
+ }
+
+ @NonNull
+ public static Executor getIOThreadExecutor() {
+ return sIOThreadExecutor;
+ }
+
+ @Override
+ public boolean isMainThread() {
+ return mDelegate.isMainThread();
+ }
+}
diff --git a/app-toolkit/core/src/main/java/android/arch/core/executor/DefaultTaskExecutor.java b/app-toolkit/runtime/src/main/java/android/arch/core/executor/DefaultTaskExecutor.java
similarity index 100%
rename from app-toolkit/core/src/main/java/android/arch/core/executor/DefaultTaskExecutor.java
rename to app-toolkit/runtime/src/main/java/android/arch/core/executor/DefaultTaskExecutor.java
diff --git a/app-toolkit/runtime/src/main/java/android/arch/core/executor/TaskExecutor.java b/app-toolkit/runtime/src/main/java/android/arch/core/executor/TaskExecutor.java
new file mode 100644
index 0000000..055b476
--- /dev/null
+++ b/app-toolkit/runtime/src/main/java/android/arch/core/executor/TaskExecutor.java
@@ -0,0 +1,66 @@
+/*
+ * 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.arch.core.executor;
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * A task executor that can divide tasks into logical groups.
+ * <p>
+ * It holds a collection a executors for each group of task.
+ * <p>
+ * TODO: Don't use this from outside, we don't know what the API will look like yet.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class TaskExecutor {
+ /**
+ * Executes the given task in the disk IO thread pool.
+ *
+ * @param runnable The runnable to run in the disk IO thread pool.
+ */
+ public abstract void executeOnDiskIO(Runnable runnable);
+
+ /**
+ * Posts the given task to the main thread.
+ *
+ * @param runnable The runnable to run on the main thread.
+ */
+ public abstract void postToMainThread(Runnable runnable);
+
+ /**
+ * Executes the given task on the main thread.
+ * <p>
+ * If the current thread is a main thread, immediately runs the given runnable.
+ *
+ * @param runnable The runnable to run on the main thread.
+ */
+ public void executeOnMainThread(Runnable runnable) {
+ if (isMainThread()) {
+ runnable.run();
+ } else {
+ postToMainThread(runnable);
+ }
+ }
+
+ /**
+ * Returns true if the current thread is the main thread, false otherwise.
+ *
+ * @return true if we are on the main thread, false otherwise.
+ */
+ public abstract boolean isMainThread();
+}
diff --git a/app-toolkit/settings.gradle b/app-toolkit/settings.gradle
index 2a132e0..0977dc6 100644
--- a/app-toolkit/settings.gradle
+++ b/app-toolkit/settings.gradle
@@ -27,8 +27,20 @@
println "support root:${supportRoot}"
-include ':arch:core'
-project(':arch:core').projectDir = new File(supportRoot, "app-toolkit/core")
+include ':arch:runtime'
+project(':arch:runtime').projectDir = new File(supportRoot, "app-toolkit/runtime")
+
+include ':arch:common'
+project(':arch:common').projectDir = new File(supportRoot, "app-toolkit/common")
+
+include ':paging:common'
+project(':paging:common').projectDir = new File(supportRoot, "paging/common")
+
+include ":paging:runtime"
+project(':paging:runtime').projectDir = new File(supportRoot, "paging/runtime")
+
+include ':paging:integration-tests:testapp'
+project(':paging:integration-tests:testapp').projectDir = new File(supportRoot, "paging/integration-tests/testapp")
include ':arch:core-testing'
project(':arch:core-testing').projectDir = new File(supportRoot, "app-toolkit/core-testing")
@@ -78,6 +90,9 @@
include ':room:integration-tests:testapp'
project(':room:integration-tests:testapp').projectDir = new File(supportRoot, "room/integration-tests/testapp")
+include ':room:integration-tests:kotlintestapp'
+project(':room:integration-tests:kotlintestapp').projectDir = new File(supportRoot, "room/integration-tests/kotlintestapp")
+
/////////////////////////////
//
// SupportLib
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index bd5e6a6..d63de24 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'groovy'
+apply plugin: 'java'
apply from: "dependencies.gradle"
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index a00c139..8a7d69a 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -19,7 +19,6 @@
// Testing dependencies
libs.mockito_core = 'org.mockito:mockito-core:2.7.6'
libs.dexmaker_mockito = 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
-libs.multidex = 'com.android.support:multidex:1.0.1'
libs.junit = 'junit:junit:4.12'
libs.test_runner = 'com.android.support.test:runner:0.6-alpha'
libs.espresso_core = 'com.android.support.test.espresso:espresso-core:2.3-alpha'
@@ -33,7 +32,7 @@
libs.gradle = 'com.android.tools.build:gradle:' + androidPluginVersionOverride
} else {
// Keep gradle plugin version in sync with ub_supportlib-master manifest.
- libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha5'
+ libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha7'
}
// Other dependencies
diff --git a/buildSrc/diff_and_docs.gradle b/buildSrc/diff_and_docs.gradle
index 61a4481..1f012d1 100644
--- a/buildSrc/diff_and_docs.gradle
+++ b/buildSrc/diff_and_docs.gradle
@@ -254,8 +254,8 @@
if (!previous) {
// If this is a patch or release version, ignore the extra.
- return new File(apiDir, "$refMajor.$refMinor.0" +
- (refPatch || release ? "" : refExtra) + ".txt")
+ return new File(apiDir, "$refMajor.$refMinor.0"
+ + (!refExtra || refPatch || release ? "" : refExtra) + ".txt")
}
File lastFile = null
@@ -271,8 +271,8 @@
if (lastFile == null || major > lastMajor || (major == lastMajor && minor > lastMinor)) {
if (refMajor > major || (refMajor == major && refMinor > minor)) {
lastFile = file
- lastMajor = major;
- lastMinor = minor;
+ lastMajor = major
+ lastMinor = minor
}
}
}
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
index 6eaf29f..1d07f51 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
@@ -101,7 +101,7 @@
error 'NewApi'
// TODO(aurimas): figure out the issue with missing translation check
- disable 'MissingTranslation'
+ disable 'MissingTranslation', 'ExtraTranslation'
// Set baseline file for all legacy lint warnings.
baseline new File(project.projectDir, "/lint-baseline.xml")
diff --git a/buildSrc/src/main/groovy/android/support/jdiff/JDiffTask.groovy b/buildSrc/src/main/groovy/android/support/jdiff/JDiffTask.groovy
deleted file mode 100644
index 6e7402c..0000000
--- a/buildSrc/src/main/groovy/android/support/jdiff/JDiffTask.groovy
+++ /dev/null
@@ -1,124 +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.jdiff;
-
-import org.gradle.api.tasks.Input
-import org.gradle.api.tasks.InputFile
-import org.gradle.api.tasks.InputFiles
-import org.gradle.api.tasks.javadoc.Javadoc
-import org.gradle.api.tasks.Optional
-
-public class JDiffTask extends Javadoc {
-
- @InputFiles
- Collection<File> docletpath
-
- @InputFile
- File oldApiXmlFile
-
- @InputFile
- File newApiXmlFile
-
- /**
- * Relative path to the Javadoc corresponding to the old API, relative to
- * "${destinationDir}/changes". Should end with the directory separator (usually '/').
- */
- @Input
- @Optional
- String oldJavadocPrefix
-
- /**
- * Relative path to the Javadoc corresponding to the new API, relative to
- * "${destinationDir}/changes". Should end with the directory separator (usually '/').
- */
- @Input
- String newJavadocPrefix
-
- // HTML diff files will be placed in destinationDir, which is defined by the superclass.
-
- @Input
- boolean stats = true
-
- public JDiffTask() {
- failOnError = true
- options.doclet = "jdiff.JDiff"
- options.encoding("UTF-8")
- maxMemory = "1280m"
- }
-
- /**
- * Sets the doclet path which has the {@code com.gogole.doclava.Doclava} class.
- * <p>
- * This option will override any doclet path set in this instance's
- * {@link #getOptions() JavadocOptions}.
- *
- * @see MinimalJavadocOptions#setDocletpath(java.util.List)
- */
- public void setDocletpath(Collection<File> docletpath) {
- this.docletpath = docletpath
-
- // Go ahead and keep the docletpath in our JavadocOptions object in sync.
- options.docletpath = docletpath as List
- }
-
- /**
- * "Configures" this JDiffTask with parameters that might not be at their final values
- * until this task is run.
- */
- private void configureJDiffTask() {
- options.docletpath = getDocletpath() as List
-
- if (getStats()) {
- options.addStringOption('stats')
- }
-
- File oldApiXmlFile = getOldApiXmlFile()
- File newApiXmlFile = getNewApiXmlFile()
-
- File oldApiXmlFileDir = oldApiXmlFile.parentFile
- File newApiXmlFileDir = newApiXmlFile.parentFile
-
- if (oldApiXmlFileDir) {
- options.addStringOption('oldapidir', oldApiXmlFileDir.absolutePath)
- }
- // For whatever reason, jdiff appends .xml to the file name on its own.
- // Strip the .xml off the end of the file name
- options.addStringOption('oldapi',
- oldApiXmlFile.name.substring(0, oldApiXmlFile.name.length() - 4))
- if (newApiXmlFileDir) {
- options.addStringOption('newapidir', newApiXmlFileDir.absolutePath)
- }
- options.addStringOption('newapi',
- newApiXmlFile.name.substring(0, newApiXmlFile.name.length() - 4))
-
- String oldJavadocPrefix = getOldJavadocPrefix()
- String newJavadocPrefix = getNewJavadocPrefix()
-
- if (oldJavadocPrefix) {
- options.addStringOption('javadocold', oldJavadocPrefix)
- }
- if (newJavadocPrefix) {
- options.addStringOption('javadocnew', newJavadocPrefix)
- }
- }
-
- @Override
- public void generate() {
- configureJDiffTask();
- super.generate();
- }
-}
diff --git a/buildSrc/src/main/java/android/support/jdiff/JDiffTask.java b/buildSrc/src/main/java/android/support/jdiff/JDiffTask.java
new file mode 100644
index 0000000..f89a375
--- /dev/null
+++ b/buildSrc/src/main/java/android/support/jdiff/JDiffTask.java
@@ -0,0 +1,180 @@
+/*
+ * 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.jdiff;
+
+import org.gradle.api.tasks.Input;
+import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.InputFiles;
+import org.gradle.api.tasks.Optional;
+import org.gradle.api.tasks.javadoc.Javadoc;
+import org.gradle.external.javadoc.CoreJavadocOptions;
+import org.gradle.external.javadoc.MinimalJavadocOptions;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * JDiff task to compare API changes.
+ */
+public class JDiffTask extends Javadoc {
+
+ private Collection<File> mDocletpath;
+
+ private File mOldApiXmlFile;
+
+ private File mNewApiXmlFile;
+
+ /**
+ * Relative path to the Javadoc corresponding to the old API, relative to
+ * "${destinationDir}/changes". Should end with the directory separator (usually '/').
+ */
+ private String mOldJavadocPrefix;
+
+ /**
+ * Relative path to the Javadoc corresponding to the new API, relative to
+ * "${destinationDir}/changes". Should end with the directory separator (usually '/').
+ */
+ private String mNewJavadocPrefix;
+
+ // HTML diff files will be placed in destinationDir, which is defined by the superclass.
+
+ private boolean mStats = true;
+
+ public JDiffTask() {
+ setFailOnError(true);
+ getOptions().setDoclet("jdiff.JDiff");
+ getOptions().setEncoding("UTF-8");
+ setMaxMemory("1280m");
+ }
+
+ public void setOldApiXmlFile(File file) {
+ mOldApiXmlFile = file;
+ }
+
+ @InputFile
+ public File getOldApiXmlFile() {
+ return mOldApiXmlFile;
+ }
+
+ public void setNewApiXmlFile(File file) {
+ mNewApiXmlFile = file;
+ }
+
+ @InputFile
+ public File getNewApiXmlFile() {
+ return mNewApiXmlFile;
+ }
+
+ @Optional
+ public void setOldJavadocPrefix(String prefix) {
+ mOldJavadocPrefix = prefix;
+ }
+
+ @Optional
+ @Input
+ public String getOldJavadocPrefix() {
+ return mOldJavadocPrefix;
+ }
+
+ public void setNewJavadocPrefix(String prefix) {
+ mNewJavadocPrefix = prefix;
+ }
+
+ @Input
+ public String getNewJavadocPrefix() {
+ return mNewJavadocPrefix;
+ }
+
+ public void setStats(boolean enabled) {
+ mStats = enabled;
+ }
+
+ @Input
+ public boolean getStats() {
+ return mStats;
+ }
+
+ /**
+ * Sets the doclet path which has the {@code com.gogole.doclava.Doclava} class.
+ * <p>
+ * This option will override any doclet path set in this instance's
+ * {@link #getOptions() JavadocOptions}.
+ *
+ * @see MinimalJavadocOptions#setDocletpath(java.util.List)
+ */
+ public void setDocletpath(Collection<File> docletpath) {
+ mDocletpath = docletpath;
+
+ // Go ahead and keep the mDocletpath in our JavadocOptions object in sync.
+ getOptions().setDocletpath(new ArrayList<>(docletpath));
+ }
+
+ @InputFiles
+ public Collection<File> getDocletpath() {
+ return mDocletpath;
+ }
+
+ /**
+ * "Configures" this JDiffTask with parameters that might not be at their final values
+ * until this task is run.
+ */
+ private void configureJDiffTask() {
+ CoreJavadocOptions options = (CoreJavadocOptions) getOptions();
+
+ options.setDocletpath(new ArrayList<>(mDocletpath));
+
+ if (getStats()) {
+ options.addStringOption("stats");
+ }
+
+ File oldApiXmlFile = getOldApiXmlFile();
+ File newApiXmlFile = getNewApiXmlFile();
+
+ File oldApiXmlFileDir = oldApiXmlFile.getParentFile();
+ File newApiXmlFileDir = newApiXmlFile.getParentFile();
+
+ if (oldApiXmlFileDir.exists()) {
+ options.addStringOption("oldapidir", oldApiXmlFileDir.getAbsolutePath());
+ }
+ // For whatever reason, jdiff appends .xml to the file name on its own.
+ // Strip the .xml off the end of the file name
+ options.addStringOption("oldapi",
+ oldApiXmlFile.getName().substring(0, oldApiXmlFile.getName().length() - 4));
+ if (newApiXmlFileDir.exists()) {
+ options.addStringOption("newapidir", newApiXmlFileDir.getAbsolutePath());
+ }
+ options.addStringOption("newapi",
+ newApiXmlFile.getName().substring(0, newApiXmlFile.getName().length() - 4));
+
+ String oldJavadocPrefix = getOldJavadocPrefix();
+ String newJavadocPrefix = getNewJavadocPrefix();
+
+ if (oldJavadocPrefix != null) {
+ options.addStringOption("javadocold", oldJavadocPrefix);
+ }
+ if (newJavadocPrefix != null) {
+ options.addStringOption("javadocnew", newJavadocPrefix);
+ }
+ }
+
+ @Override
+ public void generate() {
+ configureJDiffTask();
+ super.generate();
+ }
+}
diff --git a/buildSrc/versions.gradle b/buildSrc/versions.gradle
index 5814016..02a1e20 100644
--- a/buildSrc/versions.gradle
+++ b/buildSrc/versions.gradle
@@ -17,11 +17,7 @@
ext['android.builder.sdkDownload'] = false
// Version code of the support library components.
-ext.supportVersion = "26.0.0-SNAPSHOT"
+ext.supportVersion = "26.0.0"
// This number gets incremented for each public release.
ext.extraVersion = 46
-
-// Enforce the use of prebuilt dependencies in all sub-projects. This is
-// required for the doclava dependency.
-ext.usePrebuilts = "true"
diff --git a/compat/api21/android/support/v4/graphics/drawable/DrawableWrapperApi21.java b/compat/api21/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
index 6c7f74b..5195cc9 100644
--- a/compat/api21/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
+++ b/compat/api21/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
@@ -16,6 +16,8 @@
package android.support.v4.graphics.drawable;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Outline;
@@ -25,20 +27,29 @@
import android.graphics.drawable.DrawableContainer;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.InsetDrawable;
+import android.graphics.drawable.RippleDrawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.util.Log;
+
+import java.lang.reflect.Method;
@RequiresApi(21)
class DrawableWrapperApi21 extends DrawableWrapperApi19 {
+ private static final String TAG = "DrawableWrapperApi21";
+ private static Method sIsProjectedDrawableMethod;
DrawableWrapperApi21(Drawable drawable) {
super(drawable);
+ findAndCacheIsProjectedDrawableMethod();
}
DrawableWrapperApi21(DrawableWrapperState state, Resources resources) {
super(state, resources);
+ findAndCacheIsProjectedDrawableMethod();
}
@Override
@@ -103,12 +114,30 @@
protected boolean isCompatTintEnabled() {
if (Build.VERSION.SDK_INT == 21) {
final Drawable drawable = mDrawable;
- return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer
- || drawable instanceof InsetDrawable;
+ return drawable instanceof GradientDrawable
+ || drawable instanceof DrawableContainer
+ || drawable instanceof InsetDrawable
+ || drawable instanceof RippleDrawable;
}
return false;
}
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ public boolean isProjected() {
+ if (mDrawable != null && sIsProjectedDrawableMethod != null) {
+ try {
+ return (Boolean) sIsProjectedDrawableMethod.invoke(mDrawable);
+ } catch (Exception ex) {
+ Log.w(TAG, "Error calling Drawable#isProjected() method", ex);
+ }
+ }
+
+ return false;
+ }
+
@NonNull
@Override
DrawableWrapperState mutateConstantState() {
@@ -126,4 +155,14 @@
return new DrawableWrapperApi21(this, res);
}
}
+
+ private void findAndCacheIsProjectedDrawableMethod() {
+ if (sIsProjectedDrawableMethod == null) {
+ try {
+ sIsProjectedDrawableMethod = Drawable.class.getDeclaredMethod("isProjected");
+ } catch (Exception ex) {
+ Log.w(TAG, "Failed to retrieve Drawable#isProjected() method", ex);
+ }
+ }
+ }
}
diff --git a/compat/build.gradle b/compat/build.gradle
index 7724a29..5f9e079 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -2,17 +2,17 @@
archivesBaseName = 'support-compat'
dependencies {
- compile project(':support-annotations')
+ api project(':support-annotations')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
}
android {
diff --git a/compat/java/android/support/v4/app/NotificationCompat.java b/compat/java/android/support/v4/app/NotificationCompat.java
index 10da04a..8d370ab 100644
--- a/compat/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/java/android/support/v4/app/NotificationCompat.java
@@ -25,30 +25,40 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.res.ColorStateList;
+import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
+import android.os.SystemClock;
import android.support.annotation.ColorInt;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
+import android.support.compat.R;
import android.support.v4.text.BidiFormatter;
import android.support.v4.view.GravityCompat;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
+import android.util.TypedValue;
import android.view.Gravity;
+import android.view.View;
import android.widget.RemoteViews;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -2003,6 +2013,233 @@
// TODO: implement for all styles
protected void restoreFromCompatExtras(Bundle extras) {
}
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ public RemoteViews applyStandardTemplate(boolean showSmallIcon,
+ int resId, boolean fitIn1U) {
+ Resources res = mBuilder.mContext.getResources();
+ RemoteViews contentView = new RemoteViews(mBuilder.mContext.getPackageName(), resId);
+ boolean showLine3 = false;
+ boolean showLine2 = false;
+
+ boolean minPriority = mBuilder.getPriority() < NotificationCompat.PRIORITY_LOW;
+ if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 21) {
+ // lets color the backgrounds
+ if (minPriority) {
+ contentView.setInt(R.id.notification_background,
+ "setBackgroundResource", R.drawable.notification_bg_low);
+ contentView.setInt(R.id.icon,
+ "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
+ } else {
+ contentView.setInt(R.id.notification_background,
+ "setBackgroundResource", R.drawable.notification_bg);
+ contentView.setInt(R.id.icon,
+ "setBackgroundResource", R.drawable.notification_template_icon_bg);
+ }
+ }
+
+ if (mBuilder.mLargeIcon != null) {
+ // On versions before Jellybean, the large icon was shown by SystemUI, so we need
+ // to hide it here.
+ if (Build.VERSION.SDK_INT >= 16) {
+ contentView.setViewVisibility(R.id.icon, View.VISIBLE);
+ contentView.setImageViewBitmap(R.id.icon, mBuilder.mLargeIcon);
+ } else {
+ contentView.setViewVisibility(R.id.icon, View.GONE);
+ }
+ if (showSmallIcon && mBuilder.mNotification.icon != 0) {
+ int backgroundSize = res.getDimensionPixelSize(
+ R.dimen.notification_right_icon_size);
+ int iconSize = backgroundSize - res.getDimensionPixelSize(
+ R.dimen.notification_small_icon_background_padding) * 2;
+ if (Build.VERSION.SDK_INT >= 21) {
+ Bitmap smallBit = createIconWithBackground(
+ mBuilder.mNotification.icon,
+ backgroundSize,
+ iconSize,
+ mBuilder.getColor());
+ contentView.setImageViewBitmap(R.id.right_icon, smallBit);
+ } else {
+ contentView.setImageViewBitmap(R.id.right_icon, createColoredBitmap(
+ mBuilder.mNotification.icon, Color.WHITE));
+ }
+ contentView.setViewVisibility(R.id.right_icon, View.VISIBLE);
+ }
+ } else if (showSmallIcon && mBuilder.mNotification.icon != 0) { // small icon at left
+ contentView.setViewVisibility(R.id.icon, View.VISIBLE);
+ if (Build.VERSION.SDK_INT >= 21) {
+ int backgroundSize = res.getDimensionPixelSize(
+ R.dimen.notification_large_icon_width)
+ - res.getDimensionPixelSize(R.dimen.notification_big_circle_margin);
+ int iconSize = res.getDimensionPixelSize(
+ R.dimen.notification_small_icon_size_as_large);
+ Bitmap smallBit = createIconWithBackground(
+ mBuilder.mNotification.icon,
+ backgroundSize,
+ iconSize,
+ mBuilder.getColor());
+ contentView.setImageViewBitmap(R.id.icon, smallBit);
+ } else {
+ contentView.setImageViewBitmap(R.id.icon, createColoredBitmap(
+ mBuilder.mNotification.icon, Color.WHITE));
+ }
+ }
+ if (mBuilder.mContentTitle != null) {
+ contentView.setTextViewText(R.id.title, mBuilder.mContentTitle);
+ }
+ if (mBuilder.mContentText != null) {
+ contentView.setTextViewText(R.id.text, mBuilder.mContentText);
+ showLine3 = true;
+ }
+ // If there is a large icon we have a right side
+ boolean hasRightSide = !(Build.VERSION.SDK_INT >= 21) && mBuilder.mLargeIcon != null;
+ if (mBuilder.mContentInfo != null) {
+ contentView.setTextViewText(R.id.info, mBuilder.mContentInfo);
+ contentView.setViewVisibility(R.id.info, View.VISIBLE);
+ showLine3 = true;
+ hasRightSide = true;
+ } else if (mBuilder.mNumber > 0) {
+ final int tooBig = res.getInteger(
+ R.integer.status_bar_notification_info_maxnum);
+ if (mBuilder.mNumber > tooBig) {
+ contentView.setTextViewText(R.id.info, ((Resources) res).getString(
+ R.string.status_bar_notification_info_overflow));
+ } else {
+ NumberFormat f = NumberFormat.getIntegerInstance();
+ contentView.setTextViewText(R.id.info, f.format(mBuilder.mNumber));
+ }
+ contentView.setViewVisibility(R.id.info, View.VISIBLE);
+ showLine3 = true;
+ hasRightSide = true;
+ } else {
+ contentView.setViewVisibility(R.id.info, View.GONE);
+ }
+
+ // Need to show three lines? Only allow on Jellybean+
+ if (mBuilder.mSubText != null && Build.VERSION.SDK_INT >= 16) {
+ contentView.setTextViewText(R.id.text, mBuilder.mSubText);
+ if (mBuilder.mContentText != null) {
+ contentView.setTextViewText(R.id.text2, mBuilder.mContentText);
+ contentView.setViewVisibility(R.id.text2, View.VISIBLE);
+ showLine2 = true;
+ } else {
+ contentView.setViewVisibility(R.id.text2, View.GONE);
+ }
+ }
+
+ // RemoteViews.setViewPadding and RemoteViews.setTextViewTextSize is not available on
+ // ICS-
+ if (showLine2 && Build.VERSION.SDK_INT >= 16) {
+ if (fitIn1U) {
+ // need to shrink all the type to make sure everything fits
+ final float subTextSize = res.getDimensionPixelSize(
+ R.dimen.notification_subtext_size);
+ contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX,
+ subTextSize);
+ }
+ // vertical centering
+ contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
+ }
+
+ if (mBuilder.getWhenIfShowing() != 0) {
+ if (mBuilder.mUseChronometer && Build.VERSION.SDK_INT >= 16) {
+ contentView.setViewVisibility(R.id.chronometer, View.VISIBLE);
+ contentView.setLong(R.id.chronometer, "setBase",
+ mBuilder.getWhenIfShowing()
+ + (SystemClock.elapsedRealtime() - System.currentTimeMillis()));
+ contentView.setBoolean(R.id.chronometer, "setStarted", true);
+ } else {
+ contentView.setViewVisibility(R.id.time, View.VISIBLE);
+ contentView.setLong(R.id.time, "setTime", mBuilder.getWhenIfShowing());
+ }
+ hasRightSide = true;
+ }
+ contentView.setViewVisibility(R.id.right_side, hasRightSide ? View.VISIBLE : View.GONE);
+ contentView.setViewVisibility(R.id.line3, showLine3 ? View.VISIBLE : View.GONE);
+ return contentView;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ public Bitmap createColoredBitmap(int iconId, int color) {
+ return createColoredBitmap(iconId, color, 0);
+ }
+
+ private Bitmap createColoredBitmap(int iconId, int color, int size) {
+ Drawable drawable = mBuilder.mContext.getResources().getDrawable(iconId);
+ int width = size == 0 ? drawable.getIntrinsicWidth() : size;
+ int height = size == 0 ? drawable.getIntrinsicHeight() : size;
+ Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ drawable.setBounds(0, 0, width, height);
+ if (color != 0) {
+ drawable.mutate().setColorFilter(
+ new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
+ }
+ Canvas canvas = new Canvas(resultBitmap);
+ drawable.draw(canvas);
+ return resultBitmap;
+ }
+
+ private Bitmap createIconWithBackground(int iconId, int size,
+ int iconSize, int color) {
+ Bitmap coloredBitmap = createColoredBitmap(R.drawable.notification_icon_background,
+ color == NotificationCompat.COLOR_DEFAULT ? 0 : color, size);
+ Canvas canvas = new Canvas(coloredBitmap);
+ Drawable icon = mBuilder.mContext.getResources().getDrawable(iconId).mutate();
+ icon.setFilterBitmap(true);
+ int inset = (size - iconSize) / 2;
+ icon.setBounds(inset, inset, iconSize + inset, iconSize + inset);
+ icon.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP));
+ icon.draw(canvas);
+ return coloredBitmap;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ public void buildIntoRemoteViews(RemoteViews outerView,
+ RemoteViews innerView) {
+ // this needs to be done fore the other calls, since otherwise we might hide the wrong
+ // things if our ids collide.
+ hideNormalContent(outerView);
+ outerView.removeAllViews(R.id.notification_main_column);
+ outerView.addView(R.id.notification_main_column, innerView.clone());
+ outerView.setViewVisibility(R.id.notification_main_column, View.VISIBLE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ // Adjust padding depending on font size.
+ outerView.setViewPadding(R.id.notification_main_column_container,
+ 0, calculateTopPadding(), 0, 0);
+ }
+ }
+
+ private void hideNormalContent(RemoteViews outerView) {
+ outerView.setViewVisibility(R.id.title, View.GONE);
+ outerView.setViewVisibility(R.id.text2, View.GONE);
+ outerView.setViewVisibility(R.id.text, View.GONE);
+ }
+
+ private int calculateTopPadding() {
+ Resources resources = mBuilder.mContext.getResources();
+ int padding = resources.getDimensionPixelSize(R.dimen.notification_top_pad);
+ int largePadding = resources.getDimensionPixelSize(
+ R.dimen.notification_top_pad_large_text);
+ float fontScale = resources.getConfiguration().fontScale;
+ float largeFactor = (constrain(fontScale, 1.0f, 1.3f) - 1f) / (1.3f - 1f);
+
+ // Linearly interpolate the padding between large and normal with the font scale ranging
+ // from 1f to LARGE_TEXT_SCALE
+ return Math.round((1 - largeFactor) * padding + largeFactor * largePadding);
+ }
+
+ private static float constrain(float amount, float low, float high) {
+ return amount < low ? low : (amount > high ? high : amount);
+ }
}
/**
@@ -2251,7 +2488,7 @@
* Adds a message for display by this notification. Convenience call for a simple
* {@link Message} in {@link #addMessage(Message)}
* @param text A {@link CharSequence} to be displayed as the message content
- * @param timestamp Time at which the message arrived
+ * @param timestamp Time at which the message arrived in ms since Unix epoch
* @param sender A {@link CharSequence} to be used for displaying the name of the
* sender. Should be <code>null</code> for messages by the current user, in which case
* the platform will insert {@link #getUserDisplayName()}.
@@ -2478,7 +2715,7 @@
/**
* Constructor
* @param text A {@link CharSequence} to be displayed as the message content
- * @param timestamp Time at which the message arrived
+ * @param timestamp Time at which the message arrived in ms since Unix epoch
* @param sender A {@link CharSequence} to be used for displaying the name of the
* sender. Should be <code>null</code> for messages by the current user, in which case
* the platform will insert {@link MessagingStyle#getUserDisplayName()}.
@@ -2533,7 +2770,7 @@
}
/**
- * Get the time at which this message arrived
+ * Get the time at which this message arrived in ms since Unix epoch
*/
public long getTimestamp() {
return mTimestamp;
@@ -2712,6 +2949,150 @@
}
/**
+ * Notification style for custom views that are decorated by the system.
+ *
+ * <p>Instead of providing a notification that is completely custom, a developer can set this
+ * style and still obtain system decorations like the notification header with the expand
+ * affordance and actions.
+ *
+ * <p>Use {@link NotificationCompat.Builder#setCustomContentView(RemoteViews)},
+ * {@link NotificationCompat.Builder#setCustomBigContentView(RemoteViews)} and
+ * {@link NotificationCompat.Builder#setCustomHeadsUpContentView(RemoteViews)} to set the
+ * corresponding custom views to display.
+ *
+ * <p>To use this style with your Notification, feed it to
+ * {@link NotificationCompat.Builder#setStyle(Style)} like so:
+ * <pre class="prettyprint">
+ * Notification noti = new NotificationCompat.Builder()
+ * .setSmallIcon(R.drawable.ic_stat_player)
+ * .setLargeIcon(albumArtBitmap))
+ * .setCustomContentView(contentView)
+ * .setStyle(<b>new NotificationCompat.DecoratedCustomViewStyle()</b>)
+ * .build();
+ * </pre>
+ *
+ * <p>If you are using this style, consider using the corresponding styles like
+ * {@link android.support.compat.R.style#TextAppearance_Compat_Notification} or
+ * {@link android.support.compat.R.style#TextAppearance_Compat_Notification_Title} in
+ * your custom views in order to get the correct styling on each platform version.
+ */
+ public static class DecoratedCustomViewStyle extends Style {
+
+ private static final int MAX_ACTION_BUTTONS = 3;
+
+ public DecoratedCustomViewStyle() {
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public void apply(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());
+ }
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom content view required
+ return null;
+ }
+ if (mBuilder.getContentView() == null) {
+ // No special content view
+ return null;
+ }
+ return createRemoteViews(mBuilder.getContentView(), false);
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom big content view required
+ return null;
+ }
+ RemoteViews bigContentView = mBuilder.getBigContentView();
+ RemoteViews innerView = bigContentView != null
+ ? bigContentView
+ : mBuilder.getContentView();
+ if (innerView == null) {
+ // No expandable notification
+ return null;
+ }
+ return createRemoteViews(innerView, true);
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom heads up content view required
+ return null;
+ }
+ RemoteViews headsUp = mBuilder.getHeadsUpContentView();
+ RemoteViews innerView = headsUp != null ? headsUp : mBuilder.getContentView();
+ if (headsUp == null) {
+ // No expandable notification
+ return null;
+ }
+ return createRemoteViews(innerView, true);
+ }
+
+ private RemoteViews createRemoteViews(RemoteViews innerView, boolean showActions) {
+ RemoteViews remoteViews = applyStandardTemplate(true /* showSmallIcon */,
+ R.layout.notification_template_custom_big, false /* fitIn1U */);
+ remoteViews.removeAllViews(R.id.actions);
+ boolean actionsVisible = false;
+ if (showActions && mBuilder.mActions != null) {
+ int numActions = Math.min(mBuilder.mActions.size(), MAX_ACTION_BUTTONS);
+ if (numActions > 0) {
+ actionsVisible = true;
+ for (int i = 0; i < numActions; i++) {
+ final RemoteViews button = generateActionButton(mBuilder.mActions.get(i));
+ remoteViews.addView(R.id.actions, button);
+ }
+ }
+ }
+ int actionVisibility = actionsVisible ? View.VISIBLE : View.GONE;
+ remoteViews.setViewVisibility(R.id.actions, actionVisibility);
+ remoteViews.setViewVisibility(R.id.action_divider, actionVisibility);
+ buildIntoRemoteViews(remoteViews, innerView);
+ return remoteViews;
+ }
+
+ private RemoteViews generateActionButton(NotificationCompat.Action action) {
+ final boolean tombstone = (action.actionIntent == null);
+ RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
+ tombstone ? R.layout.notification_action_tombstone
+ : R.layout.notification_action);
+ button.setImageViewBitmap(R.id.action_image,
+ createColoredBitmap(action.getIcon(), mBuilder.mContext.getResources()
+ .getColor(R.color.notification_action_color_filter)));
+ button.setTextViewText(R.id.action_text, action.title);
+ if (!tombstone) {
+ button.setOnClickPendingIntent(R.id.action_container, action.actionIntent);
+ }
+ if (Build.VERSION.SDK_INT >= 15) {
+ button.setContentDescription(R.id.action_container, action.title);
+ }
+ return button;
+ }
+ }
+
+ /**
* Structure to encapsulate a named action that can be shown as part of this notification.
* It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
* selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
diff --git a/compat/java/android/support/v4/util/ObjectsCompat.java b/compat/java/android/support/v4/util/ObjectsCompat.java
new file mode 100644
index 0000000..4a4c844
--- /dev/null
+++ b/compat/java/android/support/v4/util/ObjectsCompat.java
@@ -0,0 +1,74 @@
+/*
+ * 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.util;
+
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import java.util.Objects;
+
+/**
+ * This class consists of static utility methods for operating on objects.
+ */
+public class ObjectsCompat {
+ private static final ImplBase IMPL;
+
+ static {
+ if (Build.VERSION.SDK_INT >= 19) {
+ IMPL = new ImplApi19();
+ } else {
+ IMPL = new ImplBase();
+ }
+ }
+
+ private ObjectsCompat() {
+ // Non-instantiable.
+ }
+
+ /**
+ * Returns {@code true} if the arguments are equal to each other
+ * and {@code false} otherwise.
+ * <p>
+ * Consequently, if both arguments are {@code null}, {@code true}
+ * is returned and if exactly one argument is {@code null}, {@code
+ * false} is returned. Otherwise, equality is determined by using
+ * the {@link Object#equals equals} method of the first
+ * argument.
+ *
+ * @param a an object
+ * @param b an object to be compared with {@code a} for equality
+ * @return {@code true} if the arguments are equal to each other
+ * and {@code false} otherwise
+ * @see Object#equals(Object)
+ */
+ public static boolean equals(Object a, Object b) {
+ return IMPL.equals(a, b);
+ }
+
+ private static class ImplBase {
+ public boolean equals(Object a, Object b) {
+ return (a == b) || (a != null && a.equals(b));
+ }
+ }
+
+ @RequiresApi(19)
+ private static class ImplApi19 extends ImplBase {
+ @Override
+ public boolean equals(Object a, Object b) {
+ return Objects.equals(a, b);
+ }
+ }
+}
diff --git a/compat/lint-baseline.xml b/compat/lint-baseline.xml
index 172bbf6..3919eba 100644
--- a/compat/lint-baseline.xml
+++ b/compat/lint-baseline.xml
@@ -1,4 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
+
+ <issue
+ id="MissingPermission"
+ message="Missing permissions required by ConnectivityManager.getActiveNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
+ errorLine1=" final NetworkInfo info = cm.getActiveNetworkInfo();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="java/android/support/v4/net/ConnectivityManagerCompat.java"
+ line="92"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="MissingPermission"
+ message="Missing permissions required by ConnectivityManager.isActiveNetworkMetered: android.permission.ACCESS_NETWORK_STATE"
+ errorLine1=" return cm.isActiveNetworkMetered();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="java/android/support/v4/net/ConnectivityManagerCompat.java"
+ line="127"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="MissingPermission"
+ message="Missing permissions required by ConnectivityManager.getNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
+ errorLine1=" return cm.getNetworkInfo(info.getType());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="java/android/support/v4/net/ConnectivityManagerCompat.java"
+ line="180"
+ column="20"/>
+ </issue>
</issues>
diff --git a/compat/res-public/values/public_styles.xml b/compat/res-public/values/public_styles.xml
new file mode 100644
index 0000000..ee726c7
--- /dev/null
+++ b/compat/res-public/values/public_styles.xml
@@ -0,0 +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.
+ -->
+
+<!-- Definitions of styles to be exposed as public -->
+<resources>
+ <public type="style" name="TextAppearance.Compat.Notification"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Title"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Info"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Line2"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Time"/>
+</resources>
diff --git a/v7/appcompat/res/drawable-hdpi/notification_bg_low_normal.9.png b/compat/res/drawable-hdpi/notification_bg_low_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-hdpi/notification_bg_low_normal.9.png
rename to compat/res/drawable-hdpi/notification_bg_low_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/notification_bg_low_pressed.9.png b/compat/res/drawable-hdpi/notification_bg_low_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-hdpi/notification_bg_low_pressed.9.png
rename to compat/res/drawable-hdpi/notification_bg_low_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/notification_bg_normal.9.png b/compat/res/drawable-hdpi/notification_bg_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-hdpi/notification_bg_normal.9.png
rename to compat/res/drawable-hdpi/notification_bg_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/notification_bg_normal_pressed.9.png b/compat/res/drawable-hdpi/notification_bg_normal_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-hdpi/notification_bg_normal_pressed.9.png
rename to compat/res/drawable-hdpi/notification_bg_normal_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/compat/res/drawable-hdpi/notify_panel_notification_icon_bg.png
similarity index 100%
rename from v7/appcompat/res/drawable-hdpi/notify_panel_notification_icon_bg.png
rename to compat/res/drawable-hdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/notification_bg_low_normal.9.png b/compat/res/drawable-mdpi/notification_bg_low_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-mdpi/notification_bg_low_normal.9.png
rename to compat/res/drawable-mdpi/notification_bg_low_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/notification_bg_low_pressed.9.png b/compat/res/drawable-mdpi/notification_bg_low_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-mdpi/notification_bg_low_pressed.9.png
rename to compat/res/drawable-mdpi/notification_bg_low_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/notification_bg_normal.9.png b/compat/res/drawable-mdpi/notification_bg_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-mdpi/notification_bg_normal.9.png
rename to compat/res/drawable-mdpi/notification_bg_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/notification_bg_normal_pressed.9.png b/compat/res/drawable-mdpi/notification_bg_normal_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-mdpi/notification_bg_normal_pressed.9.png
rename to compat/res/drawable-mdpi/notification_bg_normal_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/compat/res/drawable-mdpi/notify_panel_notification_icon_bg.png
similarity index 100%
rename from v7/appcompat/res/drawable-mdpi/notify_panel_notification_icon_bg.png
rename to compat/res/drawable-mdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/compat/res/drawable-v21/notification_action_background.xml b/compat/res/drawable-v21/notification_action_background.xml
new file mode 100644
index 0000000..f3b47cb
--- /dev/null
+++ b/compat/res/drawable-v21/notification_action_background.xml
@@ -0,0 +1,36 @@
+<?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.
+ -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/ripple_material_light">
+ <item android:id="@android:id/mask">
+ <inset xmlns:android="http://schemas.android.com/apk/res/android"
+ android:insetLeft="@dimen/compat_button_inset_horizontal_material"
+ android:insetTop="@dimen/compat_button_inset_vertical_material"
+ android:insetRight="@dimen/compat_button_inset_horizontal_material"
+ android:insetBottom="@dimen/compat_button_inset_vertical_material">
+ <shape android:shape="rectangle">
+ <corners android:radius="@dimen/compat_control_corner_material" />
+ <solid android:color="@android:color/white" />
+ <padding android:left="@dimen/compat_button_padding_horizontal_material"
+ android:top="@dimen/compat_button_padding_vertical_material"
+ android:right="@dimen/compat_button_padding_horizontal_material"
+ android:bottom="@dimen/compat_button_padding_vertical_material" />
+ </shape>
+ </inset>
+ </item>
+</ripple>
\ No newline at end of file
diff --git a/v7/appcompat/res/drawable-xhdpi/notification_bg_low_normal.9.png b/compat/res/drawable-xhdpi/notification_bg_low_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-xhdpi/notification_bg_low_normal.9.png
rename to compat/res/drawable-xhdpi/notification_bg_low_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/notification_bg_low_pressed.9.png b/compat/res/drawable-xhdpi/notification_bg_low_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-xhdpi/notification_bg_low_pressed.9.png
rename to compat/res/drawable-xhdpi/notification_bg_low_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/notification_bg_normal.9.png b/compat/res/drawable-xhdpi/notification_bg_normal.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-xhdpi/notification_bg_normal.9.png
rename to compat/res/drawable-xhdpi/notification_bg_normal.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/notification_bg_normal_pressed.9.png b/compat/res/drawable-xhdpi/notification_bg_normal_pressed.9.png
similarity index 100%
rename from v7/appcompat/res/drawable-xhdpi/notification_bg_normal_pressed.9.png
rename to compat/res/drawable-xhdpi/notification_bg_normal_pressed.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/notify_panel_notification_icon_bg.png b/compat/res/drawable-xhdpi/notify_panel_notification_icon_bg.png
similarity index 100%
rename from v7/appcompat/res/drawable-xhdpi/notify_panel_notification_icon_bg.png
rename to compat/res/drawable-xhdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/v7/appcompat/res/drawable/notification_bg.xml b/compat/res/drawable/notification_bg.xml
similarity index 100%
rename from v7/appcompat/res/drawable/notification_bg.xml
rename to compat/res/drawable/notification_bg.xml
diff --git a/v7/appcompat/res/drawable/notification_bg_low.xml b/compat/res/drawable/notification_bg_low.xml
similarity index 100%
rename from v7/appcompat/res/drawable/notification_bg_low.xml
rename to compat/res/drawable/notification_bg_low.xml
diff --git a/v7/appcompat/res/drawable/notification_icon_background.xml b/compat/res/drawable/notification_icon_background.xml
similarity index 100%
rename from v7/appcompat/res/drawable/notification_icon_background.xml
rename to compat/res/drawable/notification_icon_background.xml
diff --git a/v7/appcompat/res/drawable/notification_tile_bg.xml b/compat/res/drawable/notification_tile_bg.xml
similarity index 100%
rename from v7/appcompat/res/drawable/notification_tile_bg.xml
rename to compat/res/drawable/notification_tile_bg.xml
diff --git a/compat/res/layout-v16/notification_template_custom_big.xml b/compat/res/layout-v16/notification_template_custom_big.xml
new file mode 100644
index 0000000..d0519dc
--- /dev/null
+++ b/compat/res/layout-v16/notification_template_custom_big.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/notification_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:scaleType="center"
+ />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:orientation="vertical" >
+ <LinearLayout
+ android:id="@+id/notification_main_column_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
+ android:layout_marginStart="@dimen/notification_large_icon_width"
+ android:paddingTop="@dimen/notification_main_column_padding_top"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:orientation="horizontal">
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp" />
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="@dimen/notification_right_side_padding_top">
+ <ViewStub android:id="@+id/time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ android:layout="@layout/notification_template_part_time" />
+ <ViewStub android:id="@+id/chronometer"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ android:layout="@layout/notification_template_part_chronometer" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_gravity="end|bottom"
+ android:layout_marginTop="20dp">
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ />
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
+ android:layout_gravity="center"
+ android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
+ android:scaleType="centerInside"
+ android:visibility="gone"
+ android:alpha="0.6"
+ />
+ </LinearLayout>
+ </FrameLayout>
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:id="@+id/action_divider"
+ android:visibility="gone"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
+ android:layout_marginStart="@dimen/notification_large_icon_width"
+ android:background="?android:attr/dividerHorizontal" />
+ <LinearLayout
+ android:id="@+id/actions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone"
+ android:showDividers="middle"
+ android:divider="?android:attr/listDivider"
+ android:dividerPadding="12dp"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
+ android:layout_marginStart="@dimen/notification_large_icon_width" >
+ <!-- actions will be added here -->
+ </LinearLayout>
+ </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/compat/res/layout-v21/notification_action.xml b/compat/res/layout-v21/notification_action.xml
new file mode 100644
index 0000000..7199c25
--- /dev/null
+++ b/compat/res/layout-v21/notification_action.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/Widget.Compat.NotificationActionContainer"
+ android:id="@+id/action_container"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="48dp"
+ android:paddingStart="4dp"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/action_image"
+ android:layout_width="@dimen/notification_action_icon_size"
+ android:layout_height="@dimen/notification_action_icon_size"
+ android:layout_gravity="center|start"
+ android:scaleType="centerInside"/>
+ <TextView
+ style="@style/Widget.Compat.NotificationActionText"
+ android:id="@+id/action_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center|start"
+ android:paddingStart="4dp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:clickable="false"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/compat/res/layout-v21/notification_action_tombstone.xml b/compat/res/layout-v21/notification_action_tombstone.xml
new file mode 100644
index 0000000..7ef38fa
--- /dev/null
+++ b/compat/res/layout-v21/notification_action_tombstone.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/Widget.Compat.NotificationActionContainer"
+ android:id="@+id/action_container"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="48dp"
+ android:paddingStart="4dp"
+ android:orientation="horizontal"
+ android:enabled="false"
+ android:background="@null">
+ <ImageView
+ android:id="@+id/action_image"
+ android:layout_width="@dimen/notification_action_icon_size"
+ android:layout_height="@dimen/notification_action_icon_size"
+ android:layout_gravity="center|start"
+ android:scaleType="centerInside"
+ android:enabled="false"
+ android:alpha="0.5"/>
+ <TextView
+ style="@style/Widget.Compat.NotificationActionText"
+ android:id="@+id/action_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center|start"
+ android:paddingStart="4dp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:clickable="false"
+ android:enabled="false"
+ android:alpha="0.5"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/compat/res/layout-v21/notification_template_custom_big.xml b/compat/res/layout-v21/notification_template_custom_big.xml
new file mode 100644
index 0000000..9e3666e
--- /dev/null
+++ b/compat/res/layout-v21/notification_template_custom_big.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/notification_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+ <include layout="@layout/notification_template_icon_group"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginStart="@dimen/notification_large_icon_width"
+ android:orientation="vertical" >
+ <LinearLayout
+ android:id="@+id/notification_main_column_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:orientation="horizontal">
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="8dp"/>
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="@dimen/notification_right_side_padding_top">
+ <ViewStub android:id="@+id/time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ android:layout="@layout/notification_template_part_time" />
+ <ViewStub android:id="@+id/chronometer"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ android:layout="@layout/notification_template_part_chronometer" />
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_gravity="end|bottom"
+ android:singleLine="true"
+ />
+ </FrameLayout>
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:id="@+id/action_divider"
+ android:visibility="gone"
+ android:background="#29000000" />
+ <LinearLayout
+ android:id="@+id/actions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="-8dp"
+ android:orientation="horizontal"
+ android:visibility="gone"
+ >
+ <!-- actions will be added here -->
+ </LinearLayout>
+ </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/compat/res/layout-v21/notification_template_icon_group.xml b/compat/res/layout-v21/notification_template_icon_group.xml
new file mode 100644
index 0000000..8fadd67
--- /dev/null
+++ b/compat/res/layout-v21/notification_template_icon_group.xml
@@ -0,0 +1,42 @@
+<?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.
+ -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:id="@+id/icon_group"
+>
+ <ImageView android:id="@+id/icon"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/notification_big_circle_margin"
+ android:layout_marginBottom="@dimen/notification_big_circle_margin"
+ android:layout_marginStart="@dimen/notification_big_circle_margin"
+ android:layout_marginEnd="@dimen/notification_big_circle_margin"
+ android:scaleType="centerInside"
+ />
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="@dimen/notification_right_icon_size"
+ android:layout_height="@dimen/notification_right_icon_size"
+ android:layout_gravity="end|bottom"
+ android:scaleType="centerInside"
+ android:visibility="gone"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="8dp"
+ />
+</FrameLayout>
diff --git a/compat/res/layout/notification_action.xml b/compat/res/layout/notification_action.xml
new file mode 100644
index 0000000..3ffd9a1
--- /dev/null
+++ b/compat/res/layout/notification_action.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/Widget.Compat.NotificationActionContainer"
+ android:id="@+id/action_container"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="48dp"
+ android:paddingLeft="4dp"
+ android:paddingStart="4dp"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/action_image"
+ android:layout_width="@dimen/notification_action_icon_size"
+ android:layout_height="@dimen/notification_action_icon_size"
+ android:layout_gravity="center|start"
+ android:scaleType="centerInside"/>
+ <TextView
+ style="@style/Widget.Compat.NotificationActionText"
+ android:id="@+id/action_text"
+ android:textColor="#ccc"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center|start"
+ android:paddingLeft="4dp"
+ android:paddingStart="4dp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:clickable="false"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/compat/res/layout/notification_action_tombstone.xml b/compat/res/layout/notification_action_tombstone.xml
new file mode 100644
index 0000000..e9d4e37
--- /dev/null
+++ b/compat/res/layout/notification_action_tombstone.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/Widget.Compat.NotificationActionContainer"
+ android:id="@+id/action_container"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="48dp"
+ android:paddingLeft="4dp"
+ android:paddingStart="4dp"
+ android:orientation="horizontal"
+ android:enabled="false"
+ android:background="@null">
+ <ImageView
+ android:id="@+id/action_image"
+ android:layout_width="@dimen/notification_action_icon_size"
+ android:layout_height="@dimen/notification_action_icon_size"
+ android:layout_gravity="center|start"
+ android:scaleType="centerInside"
+ android:enabled="false"
+ android:alpha="0.5"/>
+ <TextView
+ style="@style/Widget.Compat.NotificationActionText"
+ android:id="@+id/action_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center|start"
+ android:textColor="#ccc"
+ android:paddingLeft="4dp"
+ android:paddingStart="4dp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:clickable="false"
+ android:enabled="false"
+ android:alpha="0.5"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/compat/res/layout/notification_template_custom_big.xml b/compat/res/layout/notification_template_custom_big.xml
new file mode 100644
index 0000000..8aaf9d5
--- /dev/null
+++ b/compat/res/layout/notification_template_custom_big.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout android:id="@+id/notification_main_column_container"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:orientation="horizontal"
+ android:paddingRight="12dp"
+ android:paddingEnd="12dp">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:background="@drawable/notification_tile_bg"
+ android:scaleType="center"
+ />
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="12dp"
+ android:paddingStart="12dp"
+ android:paddingTop="@dimen/notification_main_column_padding_top"
+ android:layout_weight="1"/>
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dp"
+ android:paddingLeft="12dp">
+ <include
+ layout="@layout/notification_template_part_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|top"
+ android:visibility="gone"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|bottom"
+ android:layout_marginTop="18dp"
+ android:orientation="horizontal">
+ <TextView android:id="@+id/info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info"
+ />
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="center"
+ android:layout_marginLeft="8dp"
+ android:alpha="0.7"
+ android:scaleType="center"
+ android:visibility="gone"
+ />
+ </LinearLayout>
+ </FrameLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/compat/res/layout/notification_template_icon_group.xml b/compat/res/layout/notification_template_icon_group.xml
new file mode 100644
index 0000000..f225737
--- /dev/null
+++ b/compat/res/layout/notification_template_icon_group.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<ImageView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/icon"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:scaleType="centerCrop"
+/>
diff --git a/compat/res/layout/notification_template_part_chronometer.xml b/compat/res/layout/notification_template_part_chronometer.xml
new file mode 100644
index 0000000..245353b
--- /dev/null
+++ b/compat/res/layout/notification_template_part_chronometer.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<Chronometer android:id="@+id/chronometer" xmlns:android="http://schemas.android.com/apk/res/android"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ />
diff --git a/compat/res/layout/notification_template_part_time.xml b/compat/res/layout/notification_template_part_time.xml
new file mode 100644
index 0000000..9a78a93
--- /dev/null
+++ b/compat/res/layout/notification_template_part_time.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<DateTimeView android:id="@+id/time" xmlns:android="http://schemas.android.com/apk/res/android"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ />
diff --git a/compat/res/values-af/strings.xml b/compat/res/values-af/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-am/strings.xml b/compat/res/values-am/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ar/strings.xml b/compat/res/values-ar/strings.xml
new file mode 100644
index 0000000..d9094fb
--- /dev/null
+++ b/compat/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+</resources>
diff --git a/compat/res/values-az/strings.xml b/compat/res/values-az/strings.xml
new file mode 100644
index 0000000..f2e04fe
--- /dev/null
+++ b/compat/res/values-az/strings.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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- String.format failed for translation -->
+ <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
+ <skip />
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-b+sr+Latn/strings.xml b/compat/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-be/strings.xml b/compat/res/values-be/strings.xml
new file mode 100644
index 0000000..ae35194
--- /dev/null
+++ b/compat/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"больш за 999"</string>
+</resources>
diff --git a/compat/res/values-bg/strings.xml b/compat/res/values-bg/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-bn/strings.xml b/compat/res/values-bn/strings.xml
new file mode 100644
index 0000000..01516f8
--- /dev/null
+++ b/compat/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"৯৯৯+"</string>
+</resources>
diff --git a/compat/res/values-bs/strings.xml b/compat/res/values-bs/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-ca/strings.xml b/compat/res/values-ca/strings.xml
new file mode 100644
index 0000000..d9094fb
--- /dev/null
+++ b/compat/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+</resources>
diff --git a/compat/res/values-cs/strings.xml b/compat/res/values-cs/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-da/strings.xml b/compat/res/values-da/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-de/strings.xml b/compat/res/values-de/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-el/strings.xml b/compat/res/values-el/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-en-rAU/strings.xml b/compat/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-en-rGB/strings.xml b/compat/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-en-rIN/strings.xml b/compat/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-es-rUS/strings.xml b/compat/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-es/strings.xml b/compat/res/values-es/strings.xml
new file mode 100644
index 0000000..d9094fb
--- /dev/null
+++ b/compat/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+</resources>
diff --git a/compat/res/values-et/strings.xml b/compat/res/values-et/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-eu/strings.xml b/compat/res/values-eu/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-fa/strings.xml b/compat/res/values-fa/strings.xml
new file mode 100644
index 0000000..0470999
--- /dev/null
+++ b/compat/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"۹۹۹+"</string>
+</resources>
diff --git a/compat/res/values-fi/strings.xml b/compat/res/values-fi/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-fr-rCA/strings.xml b/compat/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-fr/strings.xml b/compat/res/values-fr/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-gl/strings.xml b/compat/res/values-gl/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-gu/strings.xml b/compat/res/values-gu/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-hi/strings.xml b/compat/res/values-hi/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-hr/strings.xml b/compat/res/values-hr/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-hu/strings.xml b/compat/res/values-hu/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-hy/strings.xml b/compat/res/values-hy/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-in/strings.xml b/compat/res/values-in/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-is/strings.xml b/compat/res/values-is/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-it/strings.xml b/compat/res/values-it/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-iw/strings.xml b/compat/res/values-iw/strings.xml
new file mode 100644
index 0000000..6799e67
--- /dev/null
+++ b/compat/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ja/strings.xml b/compat/res/values-ja/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ka/strings.xml b/compat/res/values-ka/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-kk/strings.xml b/compat/res/values-kk/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-km/strings.xml b/compat/res/values-km/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-kn/strings.xml b/compat/res/values-kn/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ko/strings.xml b/compat/res/values-ko/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ky/strings.xml b/compat/res/values-ky/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-lo/strings.xml b/compat/res/values-lo/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-lt/strings.xml b/compat/res/values-lt/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-lv/strings.xml b/compat/res/values-lv/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-mk/strings.xml b/compat/res/values-mk/strings.xml
new file mode 100644
index 0000000..8c8797d
--- /dev/null
+++ b/compat/res/values-mk/strings.xml
@@ -0,0 +1,27 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- String.format failed for translation -->
+ <!-- no translation found for abc_action_bar_home_description_format (1397052879051804371) -->
+ <skip />
+ <!-- String.format failed for translation -->
+ <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
+ <skip />
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ml/strings.xml b/compat/res/values-ml/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-mn/strings.xml b/compat/res/values-mn/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-mr/strings.xml b/compat/res/values-mr/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ms/strings.xml b/compat/res/values-ms/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-my/strings.xml b/compat/res/values-my/strings.xml
new file mode 100644
index 0000000..cfad64a
--- /dev/null
+++ b/compat/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"၉၉၉+"</string>
+</resources>
diff --git a/compat/res/values-nb/strings.xml b/compat/res/values-nb/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ne/strings.xml b/compat/res/values-ne/strings.xml
new file mode 100644
index 0000000..3dd1d09
--- /dev/null
+++ b/compat/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"९९९+"</string>
+</resources>
diff --git a/compat/res/values-nl/strings.xml b/compat/res/values-nl/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-pa/strings.xml b/compat/res/values-pa/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-pl/strings.xml b/compat/res/values-pl/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-port/bools.xml b/compat/res/values-port/bools.xml
new file mode 100644
index 0000000..25053be
--- /dev/null
+++ b/compat/res/values-port/bools.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+
+ <bool name="abc_action_bar_embed_tabs">false</bool>
+
+</resources>
diff --git a/compat/res/values-pt-rBR/strings.xml b/compat/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-pt-rBR/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-pt-rPT/strings.xml b/compat/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..d9094fb
--- /dev/null
+++ b/compat/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+</resources>
diff --git a/compat/res/values-pt/strings.xml b/compat/res/values-pt/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ro/strings.xml b/compat/res/values-ro/strings.xml
new file mode 100644
index 0000000..42598dc
--- /dev/null
+++ b/compat/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"˃999"</string>
+</resources>
diff --git a/compat/res/values-ru/strings.xml b/compat/res/values-ru/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-si/strings.xml b/compat/res/values-si/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-sk/strings.xml b/compat/res/values-sk/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-sl/strings.xml b/compat/res/values-sl/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-sq/strings.xml b/compat/res/values-sq/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-sr/strings.xml b/compat/res/values-sr/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-sv/strings.xml b/compat/res/values-sv/strings.xml
new file mode 100644
index 0000000..df46d35
--- /dev/null
+++ b/compat/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
+</resources>
diff --git a/compat/res/values-sw/strings.xml b/compat/res/values-sw/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ta/strings.xml b/compat/res/values-ta/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-te/strings.xml b/compat/res/values-te/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-th/strings.xml b/compat/res/values-th/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-tl/strings.xml b/compat/res/values-tl/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-tr/strings.xml b/compat/res/values-tr/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-uk/strings.xml b/compat/res/values-uk/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-ur/strings.xml b/compat/res/values-ur/strings.xml
new file mode 100644
index 0000000..6799e67
--- /dev/null
+++ b/compat/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-uz/strings.xml b/compat/res/values-uz/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/v7/appcompat/res/values-v16/dimens.xml b/compat/res/values-v16/dimens.xml
similarity index 100%
rename from v7/appcompat/res/values-v16/dimens.xml
rename to compat/res/values-v16/dimens.xml
diff --git a/v7/appcompat/res/values-v21/colors.xml b/compat/res/values-v21/colors.xml
similarity index 100%
rename from v7/appcompat/res/values-v21/colors.xml
rename to compat/res/values-v21/colors.xml
diff --git a/compat/res/values-v21/dimens.xml b/compat/res/values-v21/dimens.xml
new file mode 100644
index 0000000..b56faf1
--- /dev/null
+++ b/compat/res/values-v21/dimens.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <!-- the margin at the beginning of the notification content -->
+ <dimen name="notification_content_margin_start">0dp</dimen>
+ <!-- image margin on the large icon in the narrow media template -->
+ <dimen name="notification_media_narrow_margin">12dp</dimen>
+ <!-- the top padding of the notification content -->
+ <dimen name="notification_main_column_padding_top">0dp</dimen>
+</resources>
diff --git a/compat/res/values-v21/styles.xml b/compat/res/values-v21/styles.xml
new file mode 100644
index 0000000..fb87295
--- /dev/null
+++ b/compat/res/values-v21/styles.xml
@@ -0,0 +1,42 @@
+<!--
+ ~ 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>
+
+ <!-- Use platform styles -->
+ <style name="TextAppearance.Compat.Notification"
+ parent="@android:style/TextAppearance.Material.Notification"/>
+
+ <style name="TextAppearance.Compat.Notification.Title"
+ parent="@android:style/TextAppearance.Material.Notification.Title"/>
+
+ <style name="TextAppearance.Compat.Notification.Info"
+ parent="@android:style/TextAppearance.Material.Notification.Info"/>
+
+ <style name="TextAppearance.Compat.Notification.Time"
+ parent="@android:style/TextAppearance.Material.Notification.Time"/>
+
+ <style name="Widget.Compat.NotificationActionText" parent="">
+ <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
+ <item name="android:textColor">@color/secondary_text_default_material_light</item>
+ <item name="android:textSize">@dimen/notification_action_text_size</item>
+ </style>
+
+ <style name="Widget.Compat.NotificationActionContainer" parent="">
+ <item name="android:background">@drawable/notification_action_background</item>
+ </style>
+
+</resources>
diff --git a/compat/res/values-vi/strings.xml b/compat/res/values-vi/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-zh-rCN/strings.xml b/compat/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-zh-rHK/strings.xml b/compat/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..d509360
--- /dev/null
+++ b/compat/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999 +"</string>
+</resources>
diff --git a/compat/res/values-zh-rTW/strings.xml b/compat/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values-zu/strings.xml b/compat/res/values-zu/strings.xml
new file mode 100644
index 0000000..4640923
--- /dev/null
+++ b/compat/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+</resources>
diff --git a/compat/res/values/colors.xml b/compat/res/values/colors.xml
new file mode 100644
index 0000000..a3eccb7
--- /dev/null
+++ b/compat/res/values/colors.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.
+ -->
+<resources>
+ <drawable name="notification_template_icon_bg">#3333B5E5</drawable>
+ <drawable name="notification_template_icon_low_bg">#0cffffff</drawable>
+ <color name="notification_action_color_filter">#ffffffff</color>
+ <color name="notification_icon_bg_color">#ff9e9e9e</color>
+</resources>
diff --git a/compat/res/values/colors_material.xml b/compat/res/values/colors_material.xml
new file mode 100644
index 0000000..c6cffdc
--- /dev/null
+++ b/compat/res/values/colors_material.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.
+ -->
+
+<!-- Colors specific to Material themes. -->
+<resources>
+ <!-- 12% black (foreground) -->
+ <color name="ripple_material_light">#1f000000</color>
+ <!-- 54% black -->
+ <color name="secondary_text_default_material_light">#8a000000</color>
+</resources>
diff --git a/compat/res/values/config.xml b/compat/res/values/config.xml
new file mode 100644
index 0000000..42633cc
--- /dev/null
+++ b/compat/res/values/config.xml
@@ -0,0 +1,26 @@
+<?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.
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+ <!-- Maximum numerical value that will be shown in a status bar
+ notification icon or in the notification itself. Will be replaced
+ with @string/status_bar_notification_info_overflow when shown in the
+ UI. -->
+ <integer name="status_bar_notification_info_maxnum">999</integer>
+</resources>
diff --git a/compat/res/values/dimens.xml b/compat/res/values/dimens.xml
new file mode 100644
index 0000000..1dcff5e
--- /dev/null
+++ b/compat/res/values/dimens.xml
@@ -0,0 +1,73 @@
+<?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>
+ <dimen name="compat_button_inset_vertical_material">6dp</dimen>
+ <dimen name="compat_button_inset_horizontal_material">4dp</dimen>
+ <!-- Default inner padding within buttons -->
+ <dimen name="compat_button_padding_vertical_material">4dp</dimen>
+ <dimen name="compat_button_padding_horizontal_material">8dp</dimen>
+
+ <!-- Default rounded corner for controls -->
+ <dimen name="compat_control_corner_material">2dp</dimen>
+
+ <!-- The width of the big icons in notifications. -->
+ <dimen name="notification_large_icon_width">64dp</dimen>
+
+ <!-- The width of the big icons in notifications. -->
+ <dimen name="notification_large_icon_height">64dp</dimen>
+
+ <!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info,
+ Time) -->
+ <dimen name="notification_subtext_size">13sp</dimen>
+
+ <!-- Size of notification action text -->
+ <dimen name="notification_action_text_size">13sp</dimen>
+
+ <!-- Top padding for notifications in the standard layout. -->
+ <dimen name="notification_top_pad">10dp</dimen>
+
+ <!-- Top padding for notification when text is large -->
+ <dimen name="notification_top_pad_large_text">5dp</dimen>
+
+ <!-- The size of the action icons -->
+ <dimen name="notification_action_icon_size">32dp</dimen>
+
+ <!-- the size of the small icon on the right of the largeIcon -->
+ <dimen name="notification_right_icon_size">16dp</dimen>
+
+ <!-- the padding of the small icon to the circle -->
+ <dimen name="notification_small_icon_background_padding">3dp</dimen>
+
+ <!-- the side margin of the big notification circle -->
+ <dimen name="notification_big_circle_margin">12dp</dimen>
+
+ <!-- small icon size when placed as large icon -->
+ <dimen name="notification_small_icon_size_as_large">24dp</dimen>
+
+ <!-- the margin at the beginning of the notification content -->
+ <dimen name="notification_content_margin_start">8dp</dimen>
+
+ <!-- image margin on the large icon in the narrow media template -->
+ <dimen name="notification_media_narrow_margin">@dimen/notification_content_margin_start</dimen>
+
+ <!-- the top padding of the notification content -->
+ <dimen name="notification_main_column_padding_top">10dp</dimen>
+
+ <!-- the paddingtop on the right side of the notification (for time etc.) -->
+ <dimen name="notification_right_side_padding_top">2dp</dimen>
+</resources>
diff --git a/compat/res/values/ids.xml b/compat/res/values/ids.xml
new file mode 100644
index 0000000..e83d5f9
--- /dev/null
+++ b/compat/res/values/ids.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.
+ -->
+<resources>
+ <item type="id" name="title"/>
+ <item type="id" name="text"/>
+ <item type="id" name="text2"/>
+ <item type="id" name="line1"/>
+ <item type="id" name="line3"/>
+</resources>
diff --git a/compat/res/values/strings.xml b/compat/res/values/strings.xml
new file mode 100644
index 0000000..ceeb183
--- /dev/null
+++ b/compat/res/values/strings.xml
@@ -0,0 +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>
+ <!-- Text to use when the number in a notification info is too large
+ (greater than status_bar_notification_info_maxnum, defined in
+ values/config.xml) and must be truncated. May need to be localized
+ for most appropriate textual indicator of "more than X".
+ [CHAR LIMIT=4] -->
+ <string name="status_bar_notification_info_overflow">999+</string>
+</resources>
diff --git a/compat/res/values/styles.xml b/compat/res/values/styles.xml
new file mode 100644
index 0000000..3503e77
--- /dev/null
+++ b/compat/res/values/styles.xml
@@ -0,0 +1,38 @@
+<?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="TextAppearance.Compat.Notification"
+ parent="@android:style/TextAppearance.StatusBar.EventContent"/>
+
+ <style name="TextAppearance.Compat.Notification.Title"
+ parent="@android:style/TextAppearance.StatusBar.EventContent.Title"/>
+
+ <style name="TextAppearance.Compat.Notification.Info">
+ <item name="android:textSize">12sp</item>
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+ <style name="TextAppearance.Compat.Notification.Time">
+ <item name="android:textSize">12sp</item>
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+ <style name="TextAppearance.Compat.Notification.Line2"
+ parent="TextAppearance.Compat.Notification.Info" />
+
+ <style name="Widget.Compat.NotificationActionText" parent=""/>
+ <style name="Widget.Compat.NotificationActionContainer" parent=""/>
+</resources>
diff --git a/compat/tests/java/android/support/v4/util/ObjectsCompatTest.java b/compat/tests/java/android/support/v4/util/ObjectsCompatTest.java
new file mode 100644
index 0000000..9fdf451
--- /dev/null
+++ b/compat/tests/java/android/support/v4/util/ObjectsCompatTest.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.util;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Unit tests for ObjectsCompat
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ObjectsCompatTest {
+
+ @Test
+ public void testEquals() throws Exception {
+ String a = "aaa";
+ String b = "bbb";
+ String c = new String(a);
+ String n = null;
+
+ assertFalse(ObjectsCompat.equals(a, b));
+ assertFalse(ObjectsCompat.equals(a, n));
+ assertFalse(ObjectsCompat.equals(n, a));
+
+ assertTrue(ObjectsCompat.equals(n, n));
+ assertTrue(ObjectsCompat.equals(a, a));
+ assertTrue(ObjectsCompat.equals(a, c));
+ }
+
+}
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 2cd1806..e25b916 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -2,18 +2,18 @@
archivesBaseName = 'support-core-ui'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
+ api project(':support-annotations')
+ api project(':support-compat')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
}
android {
diff --git a/core-ui/lint-baseline.xml b/core-ui/lint-baseline.xml
index 493c8c5..8961812 100644
--- a/core-ui/lint-baseline.xml
+++ b/core-ui/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="WrongConstant"
@@ -12,4 +12,15 @@
column="47"/>
</issue>
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: Canvas.ALL_SAVE_FLAG"
+ errorLine1=" final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="java/android/support/v4/widget/SlidingPaneLayout.java"
+ line="997"
+ column="38"/>
+ </issue>
+
</issues>
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index 380f1f6..234ae39 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -2,17 +2,17 @@
archivesBaseName = 'support-core-utils'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
+ api project(':support-annotations')
+ api project(':support-compat')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/core-utils/java/android/support/v4/utils/ObjectUtils.java b/core-utils/java/android/support/v4/utils/ObjectUtils.java
deleted file mode 100644
index cd4afc7..0000000
--- a/core-utils/java/android/support/v4/utils/ObjectUtils.java
+++ /dev/null
@@ -1,35 +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.utils;
-
-/**
- * This class consists of static utility methods for operating on objects.
- */
-public class ObjectUtils {
- /**
- * Returns true if the arguments are equal to each other and false otherwise.
- * @param a an object
- * @param b an object to be compared with <code>a</code> for equality
- * @return <code>true</code> if the arguments are equal to each other and
- * <code>false</code> otherwise.
- */
- public static boolean objectEquals(Object a, Object b) {
- return (a == b) || (a != null && a.equals(b));
- }
-
- private ObjectUtils() {
- }
-}
diff --git a/core-utils/lint-baseline.xml b/core-utils/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/core-utils/lint-baseline.xml
+++ b/core-utils/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index 6bc7dd5..2576d29 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -2,18 +2,16 @@
archivesBaseName = 'customtabs'
dependencies {
- compile project(':support-compat')
- compile project(':support-annotations')
+ api project(':support-compat')
+ api project(':support-annotations')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
-
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
-
- androidTestCompile project(':support-testutils')
+ androidTestImplementation project(':support-testutils')
}
android {
diff --git a/customtabs/lint-baseline.xml b/customtabs/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/customtabs/lint-baseline.xml
+++ b/customtabs/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/design/build.gradle b/design/build.gradle
index d76642d..23cbeb7 100644
--- a/design/build.gradle
+++ b/design/build.gradle
@@ -2,27 +2,20 @@
archivesBaseName = 'design'
dependencies {
- compile project(':support-v4')
- compile project(':support-appcompat-v7')
- compile project(':support-recyclerview-v7')
- compile project(':support-transition')
+ api project(':support-v4')
+ api project(':support-appcompat-v7')
+ api project(':support-recyclerview-v7')
+ api project(':support-transition')
- androidTestCompile (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestCompile (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestCompile (libs.espresso_contrib) {
- exclude group: 'com.android.support'
- }
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
- androidTestCompile libs.multidex
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_contrib, { exclude group: 'com.android.support' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation project(':support-testutils')
- testCompile libs.junit
- testCompile ("$libs.test_runner") {
+ testImplementation libs.junit
+ testImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
}
@@ -32,7 +25,6 @@
minSdkVersion 14
// This disables the builds tools automatic vector -> PNG generation
generatedDensities = []
- multiDexEnabled true
}
sourceSets {
diff --git a/design/lint-baseline.xml b/design/lint-baseline.xml
index 6cd8289..e961253 100644
--- a/design/lint-baseline.xml
+++ b/design/lint-baseline.xml
@@ -1,437 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="class VisibilityAwareImageButton extends ImageButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="base/android/support/design/widget/VisibilityAwareImageButton.java"
- line="23"
- column="42"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/design/res/values/styles.xml b/design/res/values/styles.xml
index f7624ec..93fb7eb 100644
--- a/design/res/values/styles.xml
+++ b/design/res/values/styles.xml
@@ -115,7 +115,6 @@
</style>
<style name="Widget.Design.AppBarLayout" parent="Base.Widget.Design.AppBarLayout">
- <item name="android:paddingLeft">300px</item>
</style>
<style name="Widget.Design.CoordinatorLayout" parent="android:Widget">
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index 8e465de..8304cd6 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -17,7 +17,6 @@
package android.support.design.widget;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import android.animation.ValueAnimator;
import android.content.Context;
@@ -34,6 +33,7 @@
import android.support.annotation.VisibleForTesting;
import android.support.design.R;
import android.support.v4.math.MathUtils;
+import android.support.v4.util.ObjectsCompat;
import android.support.v4.view.AbsSavedState;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.WindowInsetsCompat;
@@ -602,7 +602,7 @@
}
// If our insets have changed, keep them and invalidate the scroll ranges...
- if (!objectEquals(mLastInsets, newInsets)) {
+ if (!ObjectsCompat.equals(mLastInsets, newInsets)) {
mLastInsets = newInsets;
invalidateScrollRanges();
}
diff --git a/design/src/android/support/design/widget/CollapsingToolbarLayout.java b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
index 100b0dc..0051de9 100644
--- a/design/src/android/support/design/widget/CollapsingToolbarLayout.java
+++ b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
@@ -17,7 +17,6 @@
package android.support.design.widget;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import android.animation.ValueAnimator;
import android.content.Context;
@@ -41,6 +40,7 @@
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.math.MathUtils;
+import android.support.v4.util.ObjectsCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.WindowInsetsCompat;
@@ -270,7 +270,7 @@
}
// If our insets have changed, keep them and invalidate the scroll ranges...
- if (!objectEquals(mLastInsets, newInsets)) {
+ if (!ObjectsCompat.equals(mLastInsets, newInsets)) {
mLastInsets = newInsets;
requestLayout();
}
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index cc63050..818e3a6 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -17,7 +17,6 @@
package android.support.design.widget;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import android.content.Context;
import android.content.res.Resources;
@@ -46,6 +45,7 @@
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.math.MathUtils;
+import android.support.v4.util.ObjectsCompat;
import android.support.v4.util.Pools;
import android.support.v4.view.AbsSavedState;
import android.support.v4.view.GravityCompat;
@@ -351,7 +351,7 @@
}
final WindowInsetsCompat setWindowInsets(WindowInsetsCompat insets) {
- if (!objectEquals(mLastInsets, insets)) {
+ if (!ObjectsCompat.equals(mLastInsets, insets)) {
mLastInsets = insets;
mDrawStatusBarBackground = insets != null && insets.getSystemWindowInsetTop() > 0;
setWillNotDraw(!mDrawStatusBarBackground && getBackground() == null);
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
index d5dbf91..c4673b3 100755
--- a/design/tests/AndroidManifest.xml
+++ b/design/tests/AndroidManifest.xml
@@ -19,7 +19,6 @@
<uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
<application
- android:name="android.support.multidex.MultiDexApplication"
android:supportsRtl="true"
android:theme="@style/Theme.Design">
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index 49cfbfc..d51c8b9 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -2,16 +2,16 @@
archivesBaseName = 'support-dynamic-animation'
dependencies {
- compile project(':support-core-utils')
+ api project(':support-core-utils')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/dynamic-animation/lint-baseline.xml b/dynamic-animation/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/dynamic-animation/lint-baseline.xml
+++ b/dynamic-animation/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index 42cba1e..b95842e 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -18,18 +18,18 @@
archivesBaseName = 'support-emoji-appcompat'
dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- compile project(':support-emoji')
- compile project(':support-appcompat-v7')
+ api fileTree(include: ['*.jar'], dir: 'libs')
+ api project(':support-emoji')
+ api project(':support-appcompat-v7')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/emoji/appcompat/lint-baseline.xml b/emoji/appcompat/lint-baseline.xml
index 3b6c11d..e961253 100644
--- a/emoji/appcompat/lint-baseline.xml
+++ b/emoji/appcompat/lint-baseline.xml
@@ -1,470 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class EmojiButton extends Button {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/text/emoji/widget/EmojiButton.java"
- line="29"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class EmojiEditText extends EditText {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/text/emoji/widget/EmojiEditText.java"
- line="33"
- column="36"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class EmojiTextView extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/text/emoji/widget/EmojiTextView.java"
- line="29"
- column="36"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class ExtractButtonCompat extends Button {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/text/emoji/widget/ExtractButtonCompat.java"
- line="34"
- column="42"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java b/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java
index d640f0f..87c17c2 100644
--- a/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java
+++ b/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java
@@ -29,6 +29,8 @@
* AppCompatEditText widget enhanced with emoji capability by using {@link EmojiEditTextHelper}.
* When used on devices running API 18 or below, this widget acts as a regular
* {@link AppCompatEditText}.
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public class EmojiAppCompatEditText extends AppCompatEditText {
private EmojiEditTextHelper mEmojiEditTextHelper;
@@ -58,7 +60,7 @@
if (!mInitialized) {
mInitialized = true;
final EditTextAttributeHelper attrHelper = new EditTextAttributeHelper(this, attrs,
- defStyleAttr);
+ defStyleAttr, 0);
setMaxEmojiCount(attrHelper.getMaxEmojiCount());
setKeyListener(super.getKeyListener());
}
@@ -84,6 +86,8 @@
* should be equal or greater than 0
*
* @see EmojiCompat#process(CharSequence, int, int, int)
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public void setMaxEmojiCount(@IntRange(from = 0) int maxEmojiCount) {
getEmojiEditTextHelper().setMaxEmojiCount(maxEmojiCount);
@@ -94,6 +98,8 @@
*
* @see #setMaxEmojiCount(int)
* @see EmojiCompat#process(CharSequence, int, int, int)
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public int getMaxEmojiCount() {
return getEmojiEditTextHelper().getMaxEmojiCount();
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index 05fb17f..34a644f 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -19,7 +19,7 @@
}
dependencies {
- compile project(path: ':support-emoji')
+ api project(':support-emoji')
}
supportLibrary {
diff --git a/emoji/bundled/lint-baseline.xml b/emoji/bundled/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/emoji/bundled/lint-baseline.xml
+++ b/emoji/bundled/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index c9f29dc..e71c16c 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -5,20 +5,27 @@
fontDir = project(':noto-emoji-compat').projectDir
}
-evaluationDependsOn(':noto-emoji-compat')
-dependencies {
- compile project(':support-compat')
- compile files(project(':noto-emoji-compat').configurations.parser.artifacts.getFiles())
+configurations {
+ repackage
+}
- androidTestCompile (libs.test_runner) {
+dependencies {
+ repackage project(path: ':noto-emoji-compat', configuration: "parser")
+ // Wrap the noto-emoji-compat dependency in a FileCollection so that the Android Gradle plugin
+ // treats this as local jar and package it inside the aar.
+ api files(configurations.repackage)
+
+ api project(':support-compat')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
}
android {
diff --git a/emoji/core/lint-baseline.xml b/emoji/core/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/emoji/core/lint-baseline.xml
+++ b/emoji/core/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/emoji/core/res-public/values/public_attrs.xml b/emoji/core/res-public/values/public_attrs.xml
index 56f49ff..56634ff 100644
--- a/emoji/core/res-public/values/public_attrs.xml
+++ b/emoji/core/res-public/values/public_attrs.xml
@@ -18,4 +18,5 @@
<!-- Definitions of attributes to be exposed as public -->
<resources>
<public type="attr" name="maxEmojiCount"/>
+ <public type="attr" name="emojiReplaceStrategy"/>
</resources>
diff --git a/emoji/core/res/values/attrs.xml b/emoji/core/res/values/attrs.xml
index d34bb7c..77254a4 100644
--- a/emoji/core/res/values/attrs.xml
+++ b/emoji/core/res/values/attrs.xml
@@ -18,4 +18,16 @@
<declare-styleable name="EmojiEditText">
<attr name="maxEmojiCount" format="integer"/>
</declare-styleable>
+ <declare-styleable name="EmojiExtractTextLayout">
+ <attr name="emojiReplaceStrategy" format="enum">
+ <!-- Replace strategy that uses the value given in EmojiCompat.Config. Default
+ value. -->
+ <enum name="defaultStrategy" value="0" />
+ <!-- Replace strategy to add EmojiSpans for all emoji that were found. -->
+ <enum name="all" value="1" />
+ <!-- Replace strategy to add EmojiSpans only for emoji that do not exist in the
+ system. -->
+ <enum name="nonExistent" value="2" />
+ </attr>
+ </declare-styleable>
</resources>
diff --git a/emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java b/emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java
index cf3bfad..381a02c 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java
@@ -36,11 +36,12 @@
static final int MAX_EMOJI_COUNT = Integer.MAX_VALUE;
private int mMaxEmojiCount;
- public EditTextAttributeHelper(@NonNull View view, AttributeSet attrs, int defStyleAttr) {
+ public EditTextAttributeHelper(@NonNull View view, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
if (attrs != null) {
final Context context = view.getContext();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EmojiEditText,
- defStyleAttr, 0);
+ defStyleAttr, defStyleRes);
mMaxEmojiCount = a.getInteger(R.styleable.EmojiEditText_maxEmojiCount, MAX_EMOJI_COUNT);
a.recycle();
}
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java b/emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java
index ce24f3a..a0e8a69 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java
@@ -29,42 +29,44 @@
/**
* EditText widget enhanced with emoji capability by using {@link EmojiEditTextHelper}. When used
* on devices running API 18 or below, this widget acts as a regular {@link EditText}.
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public class EmojiEditText extends EditText {
private EmojiEditTextHelper mEmojiEditTextHelper;
/**
- * Prevent calling {@link #init(AttributeSet, int)} multiple times in case super() constructors
- * call other constructors.
+ * Prevent calling {@link #init(AttributeSet, int, int)} multiple times in case super()
+ * constructors call other constructors.
*/
private boolean mInitialized;
public EmojiEditText(Context context) {
super(context);
- init(null /*attrs*/, 0 /*defStyleAttr*/);
+ init(null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
}
public EmojiEditText(Context context, AttributeSet attrs) {
super(context, attrs);
- init(attrs, android.R.attr.editTextStyle);
+ init(attrs, android.R.attr.editTextStyle, 0 /*defStyleRes*/);
}
public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(attrs, defStyleAttr);
+ init(attrs, defStyleAttr, 0 /*defStyleRes*/);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- init(attrs, defStyleAttr);
+ init(attrs, defStyleAttr, defStyleRes);
}
- private void init(@Nullable AttributeSet attrs, int defStyleAttr) {
+ private void init(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
if (!mInitialized) {
mInitialized = true;
final EditTextAttributeHelper attrHelper = new EditTextAttributeHelper(this, attrs,
- defStyleAttr);
+ defStyleAttr, defStyleRes);
setMaxEmojiCount(attrHelper.getMaxEmojiCount());
setKeyListener(super.getKeyListener());
}
@@ -90,6 +92,8 @@
* should be equal or greater than 0
*
* @see EmojiCompat#process(CharSequence, int, int, int)
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public void setMaxEmojiCount(@IntRange(from = 0) int maxEmojiCount) {
getEmojiEditTextHelper().setMaxEmojiCount(maxEmojiCount);
@@ -100,6 +104,8 @@
*
* @see #setMaxEmojiCount(int)
* @see EmojiCompat#process(CharSequence, int, int, int)
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiEditText_maxEmojiCount
*/
public int getMaxEmojiCount() {
return getEmojiEditTextHelper().getMaxEmojiCount();
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java b/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java
index b010cf7..edc511f 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java
@@ -15,11 +15,15 @@
*/
package android.support.text.emoji.widget;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
import android.os.Build;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
import android.support.text.emoji.EmojiCompat;
+import android.support.text.emoji.EmojiSpan;
import android.support.v4.util.Preconditions;
import android.text.method.KeyListener;
import android.view.inputmethod.EditorInfo;
@@ -63,9 +67,10 @@
*
*/
public final class EmojiEditTextHelper {
-
private final HelperInternal mHelper;
- private int mMaxEmojiCount;
+ private int mMaxEmojiCount = EditTextAttributeHelper.MAX_EMOJI_COUNT;
+ @EmojiCompat.ReplaceStrategy
+ private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
/**
* Default constructor.
@@ -96,7 +101,6 @@
mHelper.setMaxEmojiCount(maxEmojiCount);
}
-
/**
* Returns the maximum number of EmojiSpans to be added to a CharSequence.
*
@@ -141,6 +145,36 @@
return mHelper.onCreateInputConnection(inputConnection, outAttrs);
}
+ /**
+ * Sets whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @param replaceStrategy should be one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ *
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+ mEmojiReplaceStrategy = replaceStrategy;
+ mHelper.setEmojiReplaceStrategy(replaceStrategy);
+ }
+
+ /**
+ * Returns whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @return one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ int getEmojiReplaceStrategy() {
+ return mEmojiReplaceStrategy;
+ }
+
private static class HelperInternal {
KeyListener getKeyListener(@NonNull KeyListener keyListener) {
@@ -152,7 +186,11 @@
return inputConnection;
}
- public void setMaxEmojiCount(int maxEmojiCount) {
+ void setMaxEmojiCount(int maxEmojiCount) {
+ // do nothing
+ }
+
+ void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
// do nothing
}
}
@@ -170,11 +208,16 @@
}
@Override
- public void setMaxEmojiCount(int maxEmojiCount) {
+ void setMaxEmojiCount(int maxEmojiCount) {
mTextWatcher.setMaxEmojiCount(maxEmojiCount);
}
@Override
+ void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+ mTextWatcher.setEmojiReplaceStrategy(replaceStrategy);
+ }
+
+ @Override
KeyListener getKeyListener(@NonNull final KeyListener keyListener) {
if (keyListener instanceof EmojiKeyListener) {
return keyListener;
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java b/emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java
index c15914b..ca1868e 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java
@@ -26,6 +26,7 @@
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
import android.support.text.emoji.EmojiCompat;
+import android.support.text.emoji.EmojiSpan;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
@@ -49,31 +50,31 @@
public EmojiExtractEditText(Context context) {
super(context);
- init(null /*attrs*/, 0 /*defStyleAttr*/);
+ init(null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
}
public EmojiExtractEditText(Context context, AttributeSet attrs) {
super(context, attrs);
- init(attrs, android.R.attr.editTextStyle);
+ init(attrs, android.R.attr.editTextStyle, 0 /*defStyleRes*/);
}
public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(attrs, defStyleAttr);
+ init(attrs, defStyleAttr, 0 /*defStyleRes*/);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- init(attrs, defStyleAttr);
+ init(attrs, defStyleAttr, defStyleRes);
}
- private void init(@Nullable AttributeSet attrs, int defStyleAttr) {
+ private void init(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
if (!mInitialized) {
mInitialized = true;
final EditTextAttributeHelper attrHelper = new EditTextAttributeHelper(this, attrs,
- defStyleAttr);
+ defStyleAttr, defStyleRes);
setMaxEmojiCount(attrHelper.getMaxEmojiCount());
setKeyListener(super.getKeyListener());
}
@@ -104,6 +105,30 @@
}
/**
+ * Sets whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @param replaceStrategy should be one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ */
+ public void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+ getEmojiEditTextHelper().setEmojiReplaceStrategy(replaceStrategy);
+ }
+
+ /**
+ * Returns whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @return one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ */
+ public int getEmojiReplaceStrategy() {
+ return getEmojiEditTextHelper().getEmojiReplaceStrategy();
+ }
+
+ /**
* Returns the maximum number of EmojiSpans to be added to a CharSequence.
*
* @see #setMaxEmojiCount(int)
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java b/emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java
index 12e9d9a..c75d6d0 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java
@@ -17,11 +17,14 @@
package android.support.text.emoji.widget;
import android.content.Context;
+import android.content.res.TypedArray;
import android.inputmethodservice.InputMethodService;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
+import android.support.text.emoji.EmojiCompat;
+import android.support.text.emoji.EmojiSpan;
import android.support.text.emoji.R;
import android.text.InputType;
import android.util.AttributeSet;
@@ -55,44 +58,48 @@
* }
* }
* </pre>
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiExtractTextLayout_emojiReplaceStrategy
*/
public class EmojiExtractTextLayout extends LinearLayout {
private ExtractButtonCompat mExtractAction;
+ private EmojiExtractEditText mExtractEditText;
private ViewGroup mExtractAccessories;
private View.OnClickListener mButtonOnClickListener;
/**
- * Prevent calling {@link #init(Context)} multiple times in case super() constructors
- * call other constructors.
+ * Prevent calling {@link #init(Context, AttributeSet, int)}} multiple times in case super()
+ * constructors call other constructors.
*/
private boolean mInitialized;
public EmojiExtractTextLayout(Context context) {
super(context);
- init(context);
+ init(context, null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
}
public EmojiExtractTextLayout(Context context,
@Nullable AttributeSet attrs) {
super(context, attrs);
- init(context);
+ init(context, attrs, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
}
public EmojiExtractTextLayout(Context context,
@Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(context);
+ init(context, attrs, defStyleAttr, 0 /*defStyleRes*/);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public EmojiExtractTextLayout(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- init(context);
+ init(context, attrs, defStyleAttr, defStyleRes);
}
- private void init(@NonNull Context context) {
+ private void init(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
if (!mInitialized) {
mInitialized = true;
setOrientation(HORIZONTAL);
@@ -101,10 +108,49 @@
true /*attachToRoot*/);
mExtractAccessories = view.findViewById(R.id.inputExtractAccessories);
mExtractAction = view.findViewById(R.id.inputExtractAction);
+ mExtractEditText = view.findViewById(android.R.id.inputExtractEditText);
+
+ if (attrs != null) {
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ R.styleable.EmojiExtractTextLayout, defStyleAttr, defStyleRes);
+ final int replaceStrategy = a.getInteger(
+ R.styleable.EmojiExtractTextLayout_emojiReplaceStrategy,
+ EmojiCompat.REPLACE_STRATEGY_DEFAULT);
+ mExtractEditText.setEmojiReplaceStrategy(replaceStrategy);
+ a.recycle();
+ }
}
}
/**
+ * Sets whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @param replaceStrategy should be one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiExtractTextLayout_emojiReplaceStrategy
+ */
+ public void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+ mExtractEditText.setEmojiReplaceStrategy(replaceStrategy);
+ }
+
+ /**
+ * Returns whether to replace all emoji with {@link EmojiSpan}s. Default value is
+ * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+ *
+ * @return one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+ * {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+ *
+ * @attr ref android.support.text.emoji.R.styleable#EmojiExtractTextLayout_emojiReplaceStrategy
+ */
+ public int getEmojiReplaceStrategy() {
+ return mExtractEditText.getEmojiReplaceStrategy();
+ }
+
+ /**
* Initializes the layout. Call this function from
* {@link InputMethodService#onUpdateExtractingViews(EditorInfo)
* InputMethodService#onUpdateExtractingViews(EditorInfo)}.
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java b/emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java
index ee92bd5..de3aea1 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java
+++ b/emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java
@@ -40,6 +40,8 @@
private final EditText mEditText;
private InitCallback mInitCallback;
private int mMaxEmojiCount = EditTextAttributeHelper.MAX_EMOJI_COUNT;
+ @EmojiCompat.ReplaceStrategy
+ private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
EmojiTextWatcher(EditText editText) {
mEditText = editText;
@@ -53,6 +55,14 @@
return mMaxEmojiCount;
}
+ @EmojiCompat.ReplaceStrategy int getEmojiReplaceStrategy() {
+ return mEmojiReplaceStrategy;
+ }
+
+ void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+ mEmojiReplaceStrategy = replaceStrategy;
+ }
+
@Override
public void onTextChanged(CharSequence charSequence, final int start, final int before,
final int after) {
@@ -65,7 +75,8 @@
switch (EmojiCompat.get().getLoadState()){
case EmojiCompat.LOAD_STATE_SUCCEEDED:
final Spannable s = (Spannable) charSequence;
- EmojiCompat.get().process(s, start, start + after, mMaxEmojiCount);
+ EmojiCompat.get().process(s, start, start + after, mMaxEmojiCount,
+ mEmojiReplaceStrategy);
break;
case EmojiCompat.LOAD_STATE_LOADING:
EmojiCompat.get().registerInitCallback(getInitCallback());
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java b/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java
index 8e871e0..2915acd 100644
--- a/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java
+++ b/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java
@@ -65,8 +65,8 @@
return argThat(new ArgumentMatcher<T>() {
@Override
public boolean matches(T o) {
- if (o instanceof CharSequence && expected.getClass() == o.getClass()) {
- return TextUtils.equals(expected, (CharSequence) o);
+ if (o instanceof CharSequence) {
+ return TextUtils.equals(expected, o);
}
return false;
}
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
index a2856be..efc7ca0 100644
--- a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
@@ -123,6 +123,32 @@
mEmojiEditTextHelper.setMaxEmojiCount(1);
- assertEquals(emojiTextWatcher.getMaxEmojiCount(), 1);
+ assertEquals(1, emojiTextWatcher.getMaxEmojiCount());
}
+
+ @Test
+ public void testSetEmojiReplaceStrategy() {
+ mEditText = mock(EditText.class);
+ mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
+
+ //assert the default value
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT,
+ mEmojiEditTextHelper.getEmojiReplaceStrategy());
+
+ // capture TextWatcher
+ final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
+ TextWatcher.class);
+ verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
+ assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
+ final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue();
+
+ mEmojiEditTextHelper.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT);
+
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
+ mEmojiEditTextHelper.getEmojiReplaceStrategy());
+
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
+ emojiTextWatcher.getEmojiReplaceStrategy());
+ }
+
}
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
index 4f929b9..8e1c6cf 100644
--- a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
@@ -16,18 +16,25 @@
package android.support.text.emoji.widget;
+import static android.support.text.emoji.util.EmojiMatcher.sameCharSequence;
+
import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.inputmethodservice.InputMethodService;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SdkSuppress;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.text.emoji.EmojiCompat;
@@ -39,18 +46,23 @@
import android.view.inputmethod.EditorInfo;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class EmojiExtractTextLayoutTest {
+
private InputMethodService mInputMethodService;
- private EmojiExtractTextLayout mLayout;
+
+ @BeforeClass
+ public static void setupEmojiCompat() {
+ EmojiCompat.reset(mock(EmojiCompat.class));
+ }
@Before
public void setup() {
- EmojiCompat.reset(mock(EmojiCompat.class));
mInputMethodService = mock(InputMethodService.class);
}
@@ -58,14 +70,14 @@
@UiThreadTest
public void testInflate() {
final Context context = InstrumentationRegistry.getTargetContext();
- mLayout = (EmojiExtractTextLayout) LayoutInflater.from(context)
+ final EmojiExtractTextLayout layout = (EmojiExtractTextLayout) LayoutInflater.from(context)
.inflate(android.support.text.emoji.test.R.layout.extract_view, null);
- final EmojiExtractEditText extractEditText = mLayout.findViewById(
+ final EmojiExtractEditText extractEditText = layout.findViewById(
android.R.id.inputExtractEditText);
assertNotNull(extractEditText);
- final ViewGroup inputExtractAccessories = mLayout.findViewById(
+ final ViewGroup inputExtractAccessories = layout.findViewById(
R.id.inputExtractAccessories);
assertNotNull(inputExtractAccessories);
@@ -76,9 +88,56 @@
@Test
@UiThreadTest
+ public void testSetEmojiReplaceStrategy() {
+ final Context context = InstrumentationRegistry.getTargetContext();
+
+ final EmojiExtractTextLayout layout = (EmojiExtractTextLayout) LayoutInflater.from(context)
+ .inflate(android.support.text.emoji.test.R.layout.extract_view_with_attrs, null);
+
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT, layout.getEmojiReplaceStrategy());
+
+ final EmojiExtractEditText extractEditText = layout.findViewById(
+ android.R.id.inputExtractEditText);
+ assertNotNull(extractEditText);
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
+ extractEditText.getEmojiReplaceStrategy());
+
+ layout.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_ALL);
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_ALL, layout.getEmojiReplaceStrategy());
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_ALL, extractEditText.getEmojiReplaceStrategy());
+ }
+
+ @Test
+ @UiThreadTest
+ @SdkSuppress(minSdkVersion = 19)
+ public void testSetEmojiReplaceStrategyCallEmojiCompatWithCorrectStrategy() {
+ final Context context = InstrumentationRegistry.getTargetContext();
+
+ final EmojiExtractTextLayout layout = (EmojiExtractTextLayout) LayoutInflater.from(context)
+ .inflate(android.support.text.emoji.test.R.layout.extract_view_with_attrs, null);
+
+ final EmojiExtractEditText extractEditText = layout.findViewById(
+ android.R.id.inputExtractEditText);
+ assertNotNull(layout);
+ assertNotNull(extractEditText);
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT, layout.getEmojiReplaceStrategy());
+
+ final EmojiCompat emojiCompat = mock(EmojiCompat.class);
+ when(emojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+ EmojiCompat.reset(emojiCompat);
+
+ final String testString = "anytext";
+ extractEditText.setText(testString);
+
+ verify(emojiCompat, times(1)).process(sameCharSequence(testString), anyInt(), anyInt(),
+ anyInt(), eq(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT));
+ }
+
+ @Test
+ @UiThreadTest
public void testOnUpdateExtractingViews() {
final Context context = InstrumentationRegistry.getTargetContext();
- mLayout = (EmojiExtractTextLayout) LayoutInflater.from(context)
+ final EmojiExtractTextLayout layout = (EmojiExtractTextLayout) LayoutInflater.from(context)
.inflate(android.support.text.emoji.test.R.layout.extract_view, null);
final EditorInfo editorInfo = new EditorInfo();
@@ -88,14 +147,14 @@
when(mInputMethodService.isExtractViewShown()).thenReturn(true);
- final ViewGroup inputExtractAccessories = mLayout.findViewById(
+ final ViewGroup inputExtractAccessories = layout.findViewById(
R.id.inputExtractAccessories);
inputExtractAccessories.setVisibility(View.GONE);
final ExtractButtonCompat extractButton = inputExtractAccessories.findViewById(
R.id.inputExtractAction);
- mLayout.onUpdateExtractingViews(mInputMethodService, editorInfo);
+ layout.onUpdateExtractingViews(mInputMethodService, editorInfo);
assertEquals(View.VISIBLE, inputExtractAccessories.getVisibility());
assertEquals(editorInfo.actionLabel, extractButton.getText());
@@ -106,19 +165,19 @@
@UiThreadTest
public void testOnUpdateExtractingViews_hidesAccessoriesIfNoAction() {
final Context context = InstrumentationRegistry.getTargetContext();
- mLayout = (EmojiExtractTextLayout) LayoutInflater.from(context)
+ final EmojiExtractTextLayout layout = (EmojiExtractTextLayout) LayoutInflater.from(context)
.inflate(android.support.text.emoji.test.R.layout.extract_view, null);
final EditorInfo editorInfo = new EditorInfo();
editorInfo.imeOptions = EditorInfo.IME_ACTION_NONE;
when(mInputMethodService.isExtractViewShown()).thenReturn(true);
- final ViewGroup inputExtractAccessories = mLayout.findViewById(
+ final ViewGroup inputExtractAccessories = layout.findViewById(
R.id.inputExtractAccessories);
final ExtractButtonCompat extractButton = inputExtractAccessories.findViewById(
R.id.inputExtractAction);
- mLayout.onUpdateExtractingViews(mInputMethodService, editorInfo);
+ layout.onUpdateExtractingViews(mInputMethodService, editorInfo);
assertEquals(View.GONE, inputExtractAccessories.getVisibility());
assertFalse(extractButton.hasOnClickListeners());
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
index 728947c..88549cf 100644
--- a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
@@ -18,6 +18,7 @@
import static android.support.text.emoji.util.EmojiMatcher.sameCharSequence;
+import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
@@ -60,7 +61,7 @@
mTextWatcher.onTextChanged(testString, 0, 0, 1);
verify(mEmojiCompat, times(1)).process(sameCharSequence(testString), eq(0), eq(1),
- eq(Integer.MAX_VALUE));
+ eq(Integer.MAX_VALUE), anyInt());
verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
}
@@ -71,7 +72,8 @@
mTextWatcher.onTextChanged(testString, 0, 0, 1);
- verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt());
+ verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+ anyInt());
verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
}
@@ -82,7 +84,28 @@
mTextWatcher.onTextChanged(testString, 0, 0, 1);
- verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt());
+ verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+ anyInt());
verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
}
+
+ @Test
+ public void testSetEmojiReplaceStrategy() {
+ final Spannable testString = new SpannableString("abc");
+ when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+
+ assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT, mTextWatcher.getEmojiReplaceStrategy());
+
+ mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+ verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+ eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT));
+
+ mTextWatcher.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_ALL);
+
+ mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+ verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+ eq(EmojiCompat.REPLACE_STRATEGY_ALL));
+ }
}
diff --git a/emoji/core/tests/res/layout/extract_view_with_attrs.xml b/emoji/core/tests/res/layout/extract_view_with_attrs.xml
new file mode 100644
index 0000000..0c16e7d
--- /dev/null
+++ b/emoji/core/tests/res/layout/extract_view_with_attrs.xml
@@ -0,0 +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.
+ -->
+
+<android.support.text.emoji.widget.EmojiExtractTextLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/emojiExtractTextLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:emojiReplaceStrategy="nonExistent"/>
\ No newline at end of file
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index 583ed93..634fd28 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -2,9 +2,9 @@
archivesBaseName = 'exifinterface'
dependencies {
- compile project(':support-annotations')
+ api project(':support-annotations')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
}
diff --git a/exifinterface/lint-baseline.xml b/exifinterface/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/exifinterface/lint-baseline.xml
+++ b/exifinterface/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/exifinterface/src/android/support/media/ExifInterface.java b/exifinterface/src/android/support/media/ExifInterface.java
index 4047ca7..aa19cbe 100644
--- a/exifinterface/src/android/support/media/ExifInterface.java
+++ b/exifinterface/src/android/support/media/ExifInterface.java
@@ -409,7 +409,7 @@
// Maximum size for checking file type signature (see image_type_recognition_lite.cc)
private static final int SIGNATURE_CHECK_SIZE = 5000;
- private static final byte[] JPEG_SIGNATURE = new byte[] {(byte) 0xff, (byte) 0xd8, (byte) 0xff};
+ static final byte[] JPEG_SIGNATURE = new byte[] {(byte) 0xff, (byte) 0xd8, (byte) 0xff};
private static final String RAF_SIGNATURE = "FUJIFILMCCD-RAW";
private static final int RAF_OFFSET_TO_JPEG_IMAGE_OFFSET = 84;
private static final int RAF_INFO_SIZE = 160;
@@ -445,11 +445,11 @@
// image metadata from GPS longitude to camera model name.
// Types of Exif byte alignments (see JEITA CP-3451C Section 4.5.2)
- private static final short BYTE_ALIGN_II = 0x4949; // II: Intel order
- private static final short BYTE_ALIGN_MM = 0x4d4d; // MM: Motorola order
+ static final short BYTE_ALIGN_II = 0x4949; // II: Intel order
+ static final short BYTE_ALIGN_MM = 0x4d4d; // MM: Motorola order
// TIFF Header Fixed Constant (see JEITA CP-3451C Section 4.5.2)
- private static final byte START_CODE = 0x2a; // 42
+ static final byte START_CODE = 0x2a; // 42
private static final int IFD_OFFSET = 8;
// Formats for the value in IFD entry (See TIFF 6.0 Section 2, "Image File Directory".)
@@ -468,12 +468,12 @@
// Format indicating a new IFD entry (See Adobe PageMaker® 6.0 TIFF Technical Notes, "New Tag")
private static final int IFD_FORMAT_IFD = 13;
// Names for the data formats for debugging purpose.
- private static final String[] IFD_FORMAT_NAMES = new String[] {
+ static final String[] IFD_FORMAT_NAMES = new String[] {
"", "BYTE", "STRING", "USHORT", "ULONG", "URATIONAL", "SBYTE", "UNDEFINED", "SSHORT",
"SLONG", "SRATIONAL", "SINGLE", "DOUBLE"
};
// Sizes of the components of each IFD value format
- private static final int[] IFD_FORMAT_BYTES_PER_FORMAT = new int[] {
+ static final int[] IFD_FORMAT_BYTES_PER_FORMAT = new int[] {
0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 1
};
private static final byte[] EXIF_ASCII_PREFIX = new byte[] {
@@ -915,7 +915,7 @@
}
// A class for indicating EXIF tag.
- private static class ExifTag {
+ static class ExifTag {
public final int number;
public final String name;
public final int primaryFormat;
@@ -934,6 +934,24 @@
this.primaryFormat = primaryFormat;
this.secondaryFormat = secondaryFormat;
}
+
+ private boolean isFormatCompatible(int format) {
+ if (primaryFormat == IFD_FORMAT_UNDEFINED || format == IFD_FORMAT_UNDEFINED) {
+ return true;
+ } else if (primaryFormat == format || secondaryFormat == format) {
+ return true;
+ } else if ((primaryFormat == IFD_FORMAT_ULONG || secondaryFormat == IFD_FORMAT_ULONG)
+ && format == IFD_FORMAT_USHORT) {
+ return true;
+ } else if ((primaryFormat == IFD_FORMAT_SLONG || secondaryFormat == IFD_FORMAT_SLONG)
+ && format == IFD_FORMAT_SSHORT) {
+ return true;
+ } else if ((primaryFormat == IFD_FORMAT_DOUBLE || secondaryFormat == IFD_FORMAT_DOUBLE)
+ && format == IFD_FORMAT_SINGLE) {
+ return true;
+ }
+ return false;
+ }
}
// Primary image IFD TIFF tags (See JEITA CP-3451C Section 4.6.8 Tag Support Levels)
@@ -1162,19 +1180,19 @@
IFD_TYPE_ORF_CAMERA_SETTINGS, IFD_TYPE_ORF_IMAGE_PROCESSING, IFD_TYPE_PEF})
public @interface IfdType {}
- private static final int IFD_TYPE_PRIMARY = 0;
+ static final int IFD_TYPE_PRIMARY = 0;
private static final int IFD_TYPE_EXIF = 1;
private static final int IFD_TYPE_GPS = 2;
private static final int IFD_TYPE_INTEROPERABILITY = 3;
- private static final int IFD_TYPE_THUMBNAIL = 4;
- private static final int IFD_TYPE_PREVIEW = 5;
+ static final int IFD_TYPE_THUMBNAIL = 4;
+ static final int IFD_TYPE_PREVIEW = 5;
private static final int IFD_TYPE_ORF_MAKER_NOTE = 6;
private static final int IFD_TYPE_ORF_CAMERA_SETTINGS = 7;
private static final int IFD_TYPE_ORF_IMAGE_PROCESSING = 8;
private static final int IFD_TYPE_PEF = 9;
// List of Exif tag groups
- private static final ExifTag[][] EXIF_TAGS = new ExifTag[][] {
+ static final ExifTag[][] EXIF_TAGS = new ExifTag[][] {
IFD_TIFF_TAGS, IFD_EXIF_TAGS, IFD_GPS_TAGS, IFD_INTEROPERABILITY_TAGS,
IFD_THUMBNAIL_TAGS, IFD_TIFF_TAGS, ORF_MAKER_NOTE_TAGS, ORF_CAMERA_SETTINGS_TAGS,
ORF_IMAGE_PROCESSING_TAGS, PEF_TAGS
@@ -1217,11 +1235,11 @@
private static final Charset ASCII = Charset.forName("US-ASCII");
// Identifier for EXIF APP1 segment in JPEG
- private static final byte[] IDENTIFIER_EXIF_APP1 = "Exif\0\0".getBytes(ASCII);
+ static final byte[] IDENTIFIER_EXIF_APP1 = "Exif\0\0".getBytes(ASCII);
// JPEG segment markers, that each marker consumes two bytes beginning with 0xff and ending with
// the indicator. There is no SOF4, SOF8, SOF16 markers in JPEG and SOFx markers indicates start
// of frame(baseline DCT) and the image size info exists in its beginning part.
- private static final byte MARKER = (byte) 0xff;
+ static final byte MARKER = (byte) 0xff;
private static final byte MARKER_SOI = (byte) 0xd8;
private static final byte MARKER_SOF0 = (byte) 0xc0;
private static final byte MARKER_SOF1 = (byte) 0xc1;
@@ -1237,9 +1255,9 @@
private static final byte MARKER_SOF14 = (byte) 0xce;
private static final byte MARKER_SOF15 = (byte) 0xcf;
private static final byte MARKER_SOS = (byte) 0xda;
- private static final byte MARKER_APP1 = (byte) 0xe1;
+ static final byte MARKER_APP1 = (byte) 0xe1;
private static final byte MARKER_COM = (byte) 0xfe;
- private static final byte MARKER_EOI = (byte) 0xd9;
+ static final byte MARKER_EOI = (byte) 0xd9;
// Supported Image File Types
private static final int IMAGE_TYPE_UNKNOWN = 0;
@@ -2592,16 +2610,16 @@
readImageFileDirectory(makerNoteDataInputStream, IFD_TYPE_ORF_MAKER_NOTE);
// Retrieve & update preview image offset & length values
- ExifAttribute imageLengthAttribute = (ExifAttribute)
+ ExifAttribute imageStartAttribute = (ExifAttribute)
mAttributes[IFD_TYPE_ORF_CAMERA_SETTINGS].get(TAG_ORF_PREVIEW_IMAGE_START);
- ExifAttribute bitsPerSampleAttribute = (ExifAttribute)
+ ExifAttribute imageLengthAttribute = (ExifAttribute)
mAttributes[IFD_TYPE_ORF_CAMERA_SETTINGS].get(TAG_ORF_PREVIEW_IMAGE_LENGTH);
- if (imageLengthAttribute != null && bitsPerSampleAttribute != null) {
+ if (imageStartAttribute != null && imageLengthAttribute != null) {
mAttributes[IFD_TYPE_PREVIEW].put(TAG_JPEG_INTERCHANGE_FORMAT,
- imageLengthAttribute);
+ imageStartAttribute);
mAttributes[IFD_TYPE_PREVIEW].put(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH,
- bitsPerSampleAttribute);
+ imageLengthAttribute);
}
// TODO: Check this behavior in other ORF files
@@ -2855,15 +2873,14 @@
}
// See TIFF 6.0 Section 2: TIFF Structure, Figure 1.
short numberOfDirectoryEntry = dataInputStream.readShort();
+ if (DEBUG) {
+ Log.d(TAG, "numberOfDirectoryEntry: " + numberOfDirectoryEntry);
+ }
if (dataInputStream.mPosition + 12 * numberOfDirectoryEntry > dataInputStream.mLength) {
// Return if the size of entries is too big.
return;
}
- if (DEBUG) {
- Log.d(TAG, "numberOfDirectoryEntry: " + numberOfDirectoryEntry);
- }
-
// See TIFF 6.0 Section 2: TIFF Structure, "Image File Directory".
for (short i = 0; i < numberOfDirectoryEntry; ++i) {
int tagNumber = dataInputStream.readUnsignedShort();
@@ -2887,7 +2904,13 @@
Log.w(TAG, "Skip the tag entry since tag number is not defined: " + tagNumber);
} else if (dataFormat <= 0 || dataFormat >= IFD_FORMAT_BYTES_PER_FORMAT.length) {
Log.w(TAG, "Skip the tag entry since data format is invalid: " + dataFormat);
+ } else if (!tag.isFormatCompatible(dataFormat)) {
+ Log.w(TAG, "Skip the tag entry since data format (" + IFD_FORMAT_NAMES[dataFormat]
+ + ") is unexpected for tag: " + tag.name);
} else {
+ if (dataFormat == IFD_FORMAT_UNDEFINED) {
+ dataFormat = tag.primaryFormat;
+ }
byteCount = (long) numberOfComponents * IFD_FORMAT_BYTES_PER_FORMAT[dataFormat];
if (byteCount < 0 || byteCount > Integer.MAX_VALUE) {
Log.w(TAG, "Skip the tag entry since the number of components is invalid: "
diff --git a/exifinterface/tests/src/android/support/media/ExifInterfaceTest.java b/exifinterface/tests/src/android/support/media/ExifInterfaceTest.java
index da6fdb9..07ba52d 100644
--- a/exifinterface/tests/src/android/support/media/ExifInterfaceTest.java
+++ b/exifinterface/tests/src/android/support/media/ExifInterfaceTest.java
@@ -29,6 +29,7 @@
import android.os.Environment;
import android.support.exifinterface.test.R;
import android.support.test.filters.LargeTest;
+import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
@@ -47,6 +48,8 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
@@ -325,16 +328,85 @@
}
@Test
- @SmallTest
+ @MediumTest
public void testDoNotFailOnCorruptedImage() throws Throwable {
- // To keep the compatibility with old versions of ExifInterface, even on a corrupted image,
- // it shouldn't raise any exceptions except an IOException when unable to open a file.
- byte[] bytes = new byte[1024];
- try {
- new ExifInterface(new ByteArrayInputStream(bytes));
- // Always success
- } catch (IOException e) {
- fail("Should not reach here!");
+ // ExifInterface shouldn't raise any exceptions except an IOException when unable to open
+ // a file, even with a corrupted image. Generates 10,000 randomly corrupted image stream
+ // for testing. Uses Epoch date count as random seed so that we can reproduce a broken test.
+ Random random = new Random(System.currentTimeMillis() / 86400);
+ byte[] bytes = new byte[8096];
+ ByteBuffer buffer = ByteBuffer.wrap(bytes);
+ for (int i = 0; i < 10000; i++) {
+ buffer.clear();
+ random.nextBytes(bytes);
+ if (!randomlyCorrupted(random)) {
+ buffer.put(ExifInterface.JPEG_SIGNATURE);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.put(ExifInterface.MARKER_APP1);
+ }
+ buffer.putShort((short) (random.nextInt(100) + 300));
+ if (!randomlyCorrupted(random)) {
+ buffer.put(ExifInterface.IDENTIFIER_EXIF_APP1);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort(ExifInterface.BYTE_ALIGN_MM);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.put((byte) 0);
+ buffer.put(ExifInterface.START_CODE);
+ }
+ buffer.putInt(8);
+
+ // Primary Tags
+ int numberOfDirectory = random.nextInt(8) + 1;
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort((short) numberOfDirectory);
+ }
+ for (int j = 0; j < numberOfDirectory; j++) {
+ generateRandomExifTag(buffer, ExifInterface.IFD_TYPE_PRIMARY, random);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.putInt(buffer.position() - 8);
+ }
+
+ // Thumbnail Tags
+ numberOfDirectory = random.nextInt(8) + 1;
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort((short) numberOfDirectory);
+ }
+ for (int j = 0; j < numberOfDirectory; j++) {
+ generateRandomExifTag(buffer, ExifInterface.IFD_TYPE_THUMBNAIL, random);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.putInt(buffer.position() - 8);
+ }
+
+ // Preview Tags
+ numberOfDirectory = random.nextInt(8) + 1;
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort((short) numberOfDirectory);
+ }
+ for (int j = 0; j < numberOfDirectory; j++) {
+ generateRandomExifTag(buffer, ExifInterface.IFD_TYPE_PREVIEW, random);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.putInt(buffer.position() - 8);
+ }
+
+ if (!randomlyCorrupted(random)) {
+ buffer.put(ExifInterface.MARKER);
+ }
+ if (!randomlyCorrupted(random)) {
+ buffer.put(ExifInterface.MARKER_EOI);
+ }
+
+ try {
+ new ExifInterface(new ByteArrayInputStream(bytes));
+ // Always success
+ } catch (IOException e) {
+ fail("Should not reach here!");
+ }
}
}
@@ -708,6 +780,31 @@
// about writing back in here.
}
+ private void generateRandomExifTag(ByteBuffer buffer, int ifdType, Random random) {
+ ExifInterface.ExifTag[] tagGroup = ExifInterface.EXIF_TAGS[ifdType];
+ ExifInterface.ExifTag tag = tagGroup[random.nextInt(tagGroup.length)];
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort((short) tag.number);
+ }
+ int dataFormat = random.nextInt(ExifInterface.IFD_FORMAT_NAMES.length);
+ if (!randomlyCorrupted(random)) {
+ buffer.putShort((short) dataFormat);
+ }
+ buffer.putInt(1);
+ int dataLength = ExifInterface.IFD_FORMAT_BYTES_PER_FORMAT[dataFormat];
+ if (dataLength > 4) {
+ buffer.putShort((short) random.nextInt(8096 - dataLength));
+ buffer.position(buffer.position() + 2);
+ } else {
+ buffer.position(buffer.position() + 4);
+ }
+ }
+
+ private boolean randomlyCorrupted(Random random) {
+ // Corrupts somewhere in a possibility of 1/500.
+ return random.nextInt(500) == 0;
+ }
+
private void closeQuietly(Closeable closeable) {
if (closeable != null) {
try {
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 79921a2..b50b691 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -2,18 +2,18 @@
archivesBaseName = 'support-fragment'
dependencies {
- compile project(':support-compat')
- compile project(':support-core-ui')
- compile project(':support-core-utils')
+ api project(':support-compat')
+ api project(':support-core-ui')
+ api project(':support-core-utils')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
index 1df0f37..f8e3d47 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -340,6 +340,11 @@
// getLayoutInflater()
LayoutInflater mLayoutInflater;
+ // Keep track of whether or not this Fragment has run performCreate(). Retained instance
+ // fragments can have mRetaining set to true without going through creation, so we must
+ // track it separately.
+ boolean mIsCreated;
+
/**
* State information that has been retrieved from a fragment instance
* through {@link FragmentManager#saveFragmentInstanceState(Fragment)
@@ -2322,6 +2327,7 @@
mState = CREATED;
mCalled = false;
onCreate(savedInstanceState);
+ mIsCreated = true;
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onCreate()");
@@ -2583,6 +2589,7 @@
}
mState = INITIALIZING;
mCalled = false;
+ mIsCreated = false;
onDestroy();
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/java/android/support/v4/app/FragmentManager.java
index 460d474..288fe57 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -1372,7 +1372,7 @@
}
dispatchOnFragmentAttached(f, mHost.getContext(), false);
- if (!f.mRetaining) {
+ if (!f.mIsCreated) {
dispatchOnFragmentPreCreated(f, f.mSavedFragmentState, false);
f.performCreate(f.mSavedFragmentState);
dispatchOnFragmentCreated(f, f.mSavedFragmentState, false);
diff --git a/fragment/lint-baseline.xml b/fragment/lint-baseline.xml
index 4d3d334..e961253 100644
--- a/fragment/lint-baseline.xml
+++ b/fragment/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
index a312b9b..09f071e 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -1107,6 +1107,86 @@
}
}
+ /**
+ * When a retained instance fragment is saved while in the back stack, it should go
+ * through onCreate() when it is popped back.
+ */
+ @Test
+ @UiThreadTest
+ public void retainInstanceWithOnCreate() throws Throwable {
+ FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+ FragmentTestUtil.resume(mActivityRule, fc, null);
+ FragmentManager fm = fc.getSupportFragmentManager();
+
+ OnCreateFragment fragment1 = new OnCreateFragment();
+
+ fm.beginTransaction()
+ .add(fragment1, "1")
+ .commit();
+ fm.beginTransaction()
+ .remove(fragment1)
+ .addToBackStack(null)
+ .commit();
+
+ Pair<Parcelable, FragmentManagerNonConfig> savedState =
+ FragmentTestUtil.destroy(mActivityRule, fc);
+ Pair<Parcelable, FragmentManagerNonConfig> restartState =
+ Pair.create(savedState.first, null);
+
+ fc = FragmentTestUtil.createController(mActivityRule);
+ FragmentTestUtil.resume(mActivityRule, fc, restartState);
+
+ // Save again, but keep the state
+ savedState = FragmentTestUtil.destroy(mActivityRule, fc);
+
+ fc = FragmentTestUtil.createController(mActivityRule);
+ FragmentTestUtil.resume(mActivityRule, fc, savedState);
+
+ fm = fc.getSupportFragmentManager();
+
+ fm.popBackStackImmediate();
+ OnCreateFragment fragment2 = (OnCreateFragment) fm.findFragmentByTag("1");
+ assertTrue(fragment2.onCreateCalled);
+ fm.popBackStackImmediate();
+ }
+
+ /**
+ * A retained instance fragment should go through onCreate() once, even through save and
+ * restore.
+ */
+ @Test
+ @UiThreadTest
+ public void retainInstanceOneOnCreate() throws Throwable {
+ FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+ FragmentTestUtil.resume(mActivityRule, fc, null);
+ FragmentManager fm = fc.getSupportFragmentManager();
+
+ OnCreateFragment fragment = new OnCreateFragment();
+
+ fm.beginTransaction()
+ .add(fragment, "fragment")
+ .commit();
+ fm.executePendingTransactions();
+
+ fm.beginTransaction()
+ .remove(fragment)
+ .addToBackStack(null)
+ .commit();
+
+ assertTrue(fragment.onCreateCalled);
+ fragment.onCreateCalled = false;
+
+ Pair<Parcelable, FragmentManagerNonConfig> savedState =
+ FragmentTestUtil.destroy(mActivityRule, fc);
+
+ fc = FragmentTestUtil.createController(mActivityRule);
+ FragmentTestUtil.resume(mActivityRule, fc, savedState);
+ fm = fc.getSupportFragmentManager();
+
+ fm.popBackStackImmediate();
+ assertFalse(fragment.onCreateCalled);
+ }
+
private void assertAnimationsMatch(FragmentManager fm, int enter, int exit, int popEnter,
int popExit) {
FragmentManagerImpl fmImpl = (FragmentManagerImpl) fm;
@@ -1440,4 +1520,18 @@
}
}
}
+
+ public static class OnCreateFragment extends Fragment {
+ public boolean onCreateCalled;
+
+ public OnCreateFragment() {
+ setRetainInstance(true);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ onCreateCalled = true;
+ }
+ }
}
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 00a3688..5fc9edd 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -2,14 +2,15 @@
archivesBaseName = 'animated-vector-drawable'
dependencies {
- compile project(':support-vector-drawable')
- androidTestCompile (libs.test_runner) {
+ api project(':support-vector-drawable')
+ api project(':support-core-ui')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- compile project(path: ':support-core-ui')
}
android {
diff --git a/graphics/drawable/animated/lint-baseline.xml b/graphics/drawable/animated/lint-baseline.xml
index 42fb119..0668235 100644
--- a/graphics/drawable/animated/lint-baseline.xml
+++ b/graphics/drawable/animated/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="ResourceType"
@@ -12,15 +12,4 @@
column="45"/>
</issue>
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
</issues>
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java
index d9d0f36..232dc81 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java
@@ -25,7 +25,7 @@
import android.support.annotation.RequiresApi;
/**
- * Abstract class that drawables supporting animations and callbacks should extend in support lib.
+ * Interface that drawables supporting animations and callbacks should extend in support lib.
*/
public interface Animatable2Compat extends Animatable {
@@ -51,7 +51,7 @@
void clearAnimationCallbacks();
/**
- * Animation callback interface. Used to notify animation events.
+ * Abstract class for animation callback. Used to notify animation events.
*/
abstract class AnimationCallback {
/**
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index 996a855..913729a 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -2,9 +2,10 @@
archivesBaseName = 'support-vector-drawable'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
- androidTestCompile (libs.test_runner) {
+ api project(':support-annotations')
+ api project(':support-compat')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
}
diff --git a/graphics/drawable/static/lint-baseline.xml b/graphics/drawable/static/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/graphics/drawable/static/lint-baseline.xml
+++ b/graphics/drawable/static/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/lifecycle/compiler/build.gradle b/lifecycle/compiler/build.gradle
index 628204e..f0d2a60 100644
--- a/lifecycle/compiler/build.gradle
+++ b/lifecycle/compiler/build.gradle
@@ -6,6 +6,13 @@
test.java.srcDirs += 'src/tests/kotlin'
}
+// Temporary hack to stop AS to adding two guavas into test's classpath
+configurations.all {
+ resolutionStrategy {
+ force libs.guava
+ }
+}
+
dependencies {
compile project(":lifecycle:common")
compile libs.kotlin.stdlib
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt
new file mode 100644
index 0000000..8dac863
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt
@@ -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.arch.lifecycle
+
+object ErrorMessages {
+ const val TOO_MANY_ARGS = "callback method cannot have more than 2 parameters"
+ const val TOO_MANY_ARGS_NOT_ON_ANY = "only callback annotated with ON_ANY " +
+ "can have 2 parameters"
+ const val INVALID_SECOND_ARGUMENT = "2nd argument of a callback method" +
+ " must be Lifecycle.Event and represent the current event"
+ const val INVALID_FIRST_ARGUMENT = "1st argument of a callback method must be " +
+ "a LifecycleOwner which represents the source of the event"
+ const val INVALID_METHOD_MODIFIER = "method marked with OnLifecycleEvent annotation can " +
+ "not be private"
+ const val INVALID_CLASS_MODIFIER = "class containing OnLifecycleEvent methods can not be " +
+ "private"
+ const val INVALID_STATE_OVERRIDE_METHOD = "overridden method must handle the same " +
+ "onState changes as original method"
+ const val INVALID_ENCLOSING_ELEMENT =
+ "Parent of OnLifecycleEvent should be a class or interface"
+ const val INVALID_ANNOTATED_ELEMENT = "OnLifecycleEvent can only be added to methods"
+
+}
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/LifecycleProcessor.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/LifecycleProcessor.kt
index 30aaa3e..81bcc95 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/LifecycleProcessor.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/LifecycleProcessor.kt
@@ -16,360 +16,20 @@
package android.arch.lifecycle
-import com.google.auto.common.MoreElements
-import com.google.auto.common.MoreTypes
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.FieldSpec
-import com.squareup.javapoet.JavaFile
-import com.squareup.javapoet.MethodSpec
-import com.squareup.javapoet.ParameterSpec
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeSpec
-import java.util.LinkedList
-import javax.annotation.processing.*
+import javax.annotation.processing.AbstractProcessor
+import javax.annotation.processing.RoundEnvironment
+import javax.annotation.processing.SupportedAnnotationTypes
+import javax.annotation.processing.SupportedSourceVersion
import javax.lang.model.SourceVersion
-import javax.lang.model.element.*
-import javax.lang.model.element.Modifier.PRIVATE
-import javax.lang.model.element.Modifier.PROTECTED
-import javax.lang.model.element.Modifier.PUBLIC
-import javax.lang.model.type.NoType
-import javax.lang.model.type.TypeMirror
-import javax.tools.Diagnostic
-
-fun Element.getPackage(): PackageElement = MoreElements.getPackage(this)
-fun Element.getPackageQName() = getPackage().qualifiedName.toString()
-fun ExecutableElement.name() = simpleName.toString()
-fun ExecutableElement.isPackagePrivate() = !modifiers.any {
- it == PUBLIC || it == PROTECTED || it == PRIVATE
-}
-
-fun ExecutableElement.isProtected() = modifiers.contains(PROTECTED)
+import javax.lang.model.element.TypeElement
@SupportedAnnotationTypes("android.arch.lifecycle.OnLifecycleEvent")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
class LifecycleProcessor : AbstractProcessor() {
- companion object ErrorMessages {
- const val TOO_MANY_ARGS = "callback method cannot have more than 2 parameters"
- const val TOO_MANY_ARGS_NOT_ON_ANY = "only callback annotated with ON_ANY " +
- "can have 2 parameters"
- const val INVALID_SECOND_ARGUMENT = "2nd argument of a callback method" +
- " must be Lifecycle.Event and represent the current event"
- const val INVALID_FIRST_ARGUMENT = "1st argument of a callback method must be " +
- "a LifecycleOwner which represents the source of the event"
- const val INVALID_METHOD_MODIFIER = "method marked with OnLifecycleEvent annotation can " +
- "not be private"
- const val INVALID_CLASS_MODIFIER = "class containing OnLifecycleEvent methods can not be " +
- "private"
- const val INVALID_STATE_OVERRIDE_METHOD = "overridden method must handle the same " +
- "onState changes as original method"
- }
-
- private val LIFECYCLE_OWNER = ClassName.get(LifecycleOwner::class.java)
- private val JAVA_LIFECYCLE_EVENT = Lifecycle.Event::class.java
- private val T = "\$T"
- private val N = "\$N"
- private val L = "\$L"
-
- private fun printErrorMessage(msg: CharSequence, elem: Element) {
- processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg, elem)
- }
-
- private fun validateParam(param: VariableElement,
- expectedType: Class<*>, errorMsg: String): Boolean {
- if (!MoreTypes.isTypeOf(expectedType, param.asType())) {
- printErrorMessage(errorMsg, param)
- return false
- }
- return true
- }
-
- private fun validateMethod(method: ExecutableElement, event: Lifecycle.Event): Boolean {
- if (PRIVATE in method.modifiers) {
- printErrorMessage(INVALID_METHOD_MODIFIER, method)
- return false
- }
- val params = method.parameters
- if ((params.size > 2)) {
- printErrorMessage(TOO_MANY_ARGS, method)
- return false
- }
-
- if (params.size == 2 && event != Lifecycle.Event.ON_ANY) {
- printErrorMessage(TOO_MANY_ARGS_NOT_ON_ANY, method)
- return false
- }
-
- if (params.size == 2 && !validateParam(params[1], JAVA_LIFECYCLE_EVENT,
- INVALID_SECOND_ARGUMENT)) {
- return false
- }
-
- if (params.size > 0) {
- return validateParam(params[0], LifecycleOwner::class.java,
- INVALID_FIRST_ARGUMENT)
- }
- return true
- }
-
- private fun validateClass(classElement: Element): Boolean {
- if (classElement.kind != ElementKind.CLASS && classElement.kind != ElementKind.INTERFACE) {
- printErrorMessage("Parent of OnLifecycleEvent should be a class or interface",
- classElement)
- return false
- }
- if (PRIVATE in classElement.modifiers) {
- printErrorMessage(INVALID_CLASS_MODIFIER, classElement)
- return false
- }
- return true
- }
-
override fun process(annotations: MutableSet<out TypeElement>,
roundEnv: RoundEnvironment): Boolean {
- val world = roundEnv.getElementsAnnotatedWith(OnLifecycleEvent::class.java).map { elem ->
- if (elem.kind != ElementKind.METHOD) {
- printErrorMessage("OnLifecycleEvent can only be added to methods", elem)
- null
- } else {
- val enclosingElement = elem.enclosingElement
- val onState = elem.getAnnotation(OnLifecycleEvent::class.java)
- val method = MoreElements.asExecutable(elem)
- if (validateClass(enclosingElement) && validateMethod(method, onState.value)) {
- StateMethod(method, onState)
- } else {
- null
- }
- }
- }
- .filterNotNull()
- .groupBy { MoreElements.asType(it.method.enclosingElement) }
- .mapValues { entry -> LifecycleObserverInfo(entry.key, entry.value) }
-
-
- flattenObserverInfos(world).forEach {
- writeAdapter(it)
- }
-
+ val input = collectAndVerifyInput(processingEnv, roundEnv)
+ writeModels(transformToOutput(processingEnv, input), processingEnv.filer)
return true
}
-
- private fun superObservers(world: Map<TypeElement, LifecycleObserverInfo>,
- observer: LifecycleObserverInfo): List<LifecycleObserverInfo> {
- val stack = LinkedList<TypeMirror>()
- stack += observer.type.interfaces.reversed()
- stack += observer.type.superclass
- val result = mutableListOf<LifecycleObserverInfo>()
- while (stack.isNotEmpty()) {
- val typeMirror = stack.removeLast()
- if (typeMirror is NoType) {
- continue
- }
- val type = MoreTypes.asTypeElement(typeMirror)
- val currentObserver = world[type]
- if (currentObserver != null) {
- result.add(currentObserver)
- } else {
- stack += type.interfaces.reversed()
- stack += type.superclass
- }
- }
- return result
- }
-
- private fun mergeAndVerifyMethods(classMethods: List<StateMethod>,
- parentMethods: List<StateMethod>): List<StateMethod> {
- return parentMethods + classMethods.filter { currentMethod ->
- val baseMethod = parentMethods.find { m ->
- currentMethod.method.simpleName == m.method.simpleName
- && currentMethod.method.parameters.size == m.method.parameters.size
- }
- if (baseMethod != null
- && baseMethod.onLifecycleEvent != currentMethod.onLifecycleEvent) {
- printErrorMessage(INVALID_STATE_OVERRIDE_METHOD, currentMethod.method)
- }
- baseMethod == null
- }
-
- }
-
- private fun flattenObserverInfos(
- world: Map<TypeElement, LifecycleObserverInfo>): List<LifecycleObserverInfo> {
- val superObservers = world.mapValues { superObservers(world, it.value) }
- val packagePrivateMethods = world.mapValues { observer ->
- if (observer.value.type.kind.isInterface) {
- emptyList()
- } else {
- observer.value.methods.filter {
- it.method.isPackagePrivate() || it.method.isProtected()
- }.map { it.method }
- }
- }
-
- val ppMethodsToType = packagePrivateMethods.entries.fold(
- mapOf<ExecutableElement, TypeElement>(), { map, entry ->
- map + entry.value.associate { it to entry.key }
- })
-
- world.values.forEach {
- val observers = superObservers[it.type]!!
- val currentPackage = it.type.getPackageQName()
- observers.filter { superObserver ->
- superObserver.type.getPackageQName() != currentPackage
- && packagePrivateMethods[superObserver.type]!!.isNotEmpty()
- }.forEach { it.syntheticMethods.addAll(packagePrivateMethods[it.type]!!) }
- }
-
-
- val flattened: MutableMap<LifecycleObserverInfo, LifecycleObserverInfo> = mutableMapOf()
- fun traverse(observer: LifecycleObserverInfo) {
- if (observer in flattened) {
- return
- }
- val observers = superObservers[observer.type]!!
- if (observers.isEmpty()) {
- flattened[observer] = observer
- return
- }
- observers.filter { it !in flattened }.forEach(::traverse)
- val currentPackage = observer.type.getPackageQName()
- val methods = observers.fold(emptyList<StateMethod>(),
- { list, observer -> mergeAndVerifyMethods(observer.methods, list) }).map {
- val packageName = ppMethodsToType[it.method]?.getPackageQName()
- if (packageName == null || packageName == currentPackage) {
- it
- } else {
- StateMethod(it.method, it.onLifecycleEvent, ppMethodsToType[it.method])
- }
- }
-
- flattened[observer] = LifecycleObserverInfo(observer.type,
- mergeAndVerifyMethods(observer.methods, methods), observer.syntheticMethods)
- }
-
- world.values.forEach(::traverse)
- return flattened.values.toList()
- }
-
- private fun writeAdapter(observer: LifecycleObserverInfo) {
- val ownerParam = ParameterSpec.builder(LIFECYCLE_OWNER, "owner").build()
- val eventParam = ParameterSpec.builder(ClassName.get(JAVA_LIFECYCLE_EVENT), "event").build()
- val receiverName = "mReceiver"
- val receiverField = FieldSpec.builder(ClassName.get(observer.type), receiverName,
- Modifier.FINAL).build()
-
- val dispatchMethodBuilder = MethodSpec.methodBuilder("onStateChanged")
- .returns(TypeName.VOID)
- .addParameter(ownerParam)
- .addParameter(eventParam)
- .addModifiers(PUBLIC)
- .addAnnotation(Override::class.java)
- val dispatchMethod = dispatchMethodBuilder.apply {
- observer.methods
- .groupBy { stateMethod -> stateMethod.onLifecycleEvent.value }
- .forEach { entry ->
- val event = entry.key
- val methods = entry.value
- if (event == Lifecycle.Event.ON_ANY) {
- writeMethodCalls(eventParam, methods, ownerParam, receiverField)
- } else {
- beginControlFlow("if ($N == $T.$L)", eventParam, JAVA_LIFECYCLE_EVENT, event)
- .writeMethodCalls(eventParam, methods, ownerParam, receiverField)
- endControlFlow()
- }
- }
- }.build()
-
- @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
- val getWrappedMethod = MethodSpec.methodBuilder("getReceiver")
- .returns(ClassName.get(Object::class.java))
- .addModifiers(PUBLIC)
- .addStatement("return $N", receiverField)
- .build()
-
- val receiverParam = ParameterSpec.builder(ClassName.get(observer.type), "receiver").build()
-
- val syntheticMethods = observer.syntheticMethods.map {
- val method = MethodSpec.methodBuilder(syntheticName(it))
- .returns(TypeName.VOID)
- .addModifiers(PUBLIC)
- .addModifiers(Modifier.STATIC)
- .addParameter(receiverParam)
- if (it.parameters.size >= 1) {
- method.addParameter(ownerParam)
- }
- if (it.parameters.size == 2) {
- method.addParameter(eventParam)
- }
-
- val count = it.parameters.size
- val paramString = generateParamString(count)
- method.addStatement("$N.$L($paramString)", receiverParam, it.name(),
- *takeParams(count, ownerParam, eventParam))
- method.build()
- }
-
- val constructor = MethodSpec.constructorBuilder()
- .addParameter(receiverParam)
- .addStatement("this.$N = $N", receiverField, receiverParam)
- .build()
-
- val adapterName = getAdapterName(observer.type)
- val adapter = TypeSpec.classBuilder(adapterName)
- .addModifiers(PUBLIC)
- .addSuperinterface(ClassName.get(GenericLifecycleObserver::class.java))
- .addField(receiverField)
- .addMethod(constructor)
- .addMethod(dispatchMethod)
- .addMethod(getWrappedMethod)
- .addMethods(syntheticMethods)
- .build()
- JavaFile.builder(observer.type.getPackageQName(), adapter)
- .build().writeTo(processingEnv.filer)
- }
-
- private fun MethodSpec.Builder.writeMethodCalls(eventParam: ParameterSpec,
- methods: List<StateMethod>,
- ownerParam: ParameterSpec,
- receiverField: FieldSpec) {
- methods.forEach { method ->
- val count = method.method.parameters.size
- if (method.syntheticAccess == null) {
- val paramString = generateParamString(count)
- addStatement("$N.$L($paramString)", receiverField,
- method.method.name(),
- *takeParams(count, ownerParam, eventParam))
-
- } else {
- val originalType = method.syntheticAccess
- val paramString = generateParamString(count + 1)
- val className = ClassName.get(originalType.getPackageQName(),
- getAdapterName(originalType))
- addStatement("$T.$L($paramString)", className,
- syntheticName(method.method),
- *takeParams(count + 1, receiverField, ownerParam,
- eventParam))
- }
- }
- }
-
- private fun syntheticName(method: ExecutableElement) = "__synthetic_" + method.simpleName
-
- private fun takeParams(count: Int, vararg params: Any) = params.take(count).toTypedArray()
-
- private fun generateParamString(count: Int) = (0..(count - 1)).joinToString(",") { N }
-
- private fun getAdapterName(type: TypeElement): String {
- val packageElement = type.getPackage()
- val qName = type.qualifiedName.toString()
- val partialName = if (packageElement.isUnnamed) qName else qName.substring(
- packageElement.qualifiedName.toString().length + 1)
- return Lifecycling.getAdapterName(partialName)
- }
-
- data class StateMethod(val method: ExecutableElement, val onLifecycleEvent: OnLifecycleEvent,
- val syntheticAccess: TypeElement? = null)
-
- data class LifecycleObserverInfo(val type: TypeElement, val methods: List<StateMethod>,
- var syntheticMethods:
- MutableSet<ExecutableElement> = mutableSetOf())
}
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt
new file mode 100644
index 0000000..eedb3af
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.arch.lifecycle
+
+import com.google.auto.common.MoreElements
+import javax.lang.model.element.Element
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.Modifier
+import javax.lang.model.element.PackageElement
+
+fun Element.getPackage(): PackageElement = MoreElements.getPackage(this)
+
+fun Element.getPackageQName() = getPackage().qualifiedName.toString()
+
+fun ExecutableElement.name() = simpleName.toString()
+
+fun ExecutableElement.isPackagePrivate() = !modifiers.any {
+ it == Modifier.PUBLIC || it == Modifier.PROTECTED || it == Modifier.PRIVATE
+}
+
+fun ExecutableElement.isProtected() = modifiers.contains(Modifier.PROTECTED)
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt
new file mode 100644
index 0000000..5183df5
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.arch.lifecycle
+
+import android.arch.lifecycle.model.EventMethod
+import android.arch.lifecycle.model.LifecycleObserverInfo
+import com.google.auto.common.MoreElements
+import com.google.auto.common.MoreTypes
+import javax.annotation.processing.ProcessingEnvironment
+import javax.annotation.processing.RoundEnvironment
+import javax.lang.model.element.Element
+import javax.lang.model.element.ElementKind
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.Modifier
+import javax.lang.model.element.TypeElement
+import javax.lang.model.element.VariableElement
+import javax.tools.Diagnostic
+
+fun collectAndVerifyInput(processingEnv: ProcessingEnvironment,
+ roundEnv: RoundEnvironment): Map<TypeElement, LifecycleObserverInfo> {
+ val validator = Validator(processingEnv)
+
+ return roundEnv.getElementsAnnotatedWith(OnLifecycleEvent::class.java).map { elem ->
+ if (elem.kind != ElementKind.METHOD) {
+ validator.printErrorMessage(ErrorMessages.INVALID_ANNOTATED_ELEMENT, elem)
+ null
+ } else {
+ val enclosingElement = elem.enclosingElement
+ val onState = elem.getAnnotation(OnLifecycleEvent::class.java)
+ val method = MoreElements.asExecutable(elem)
+ if (validator.validateClass(enclosingElement)
+ && validator.validateMethod(method, onState.value)) {
+ EventMethod(method, onState, MoreElements.asType(enclosingElement))
+ } else {
+ null
+ }
+ }
+ }
+ .filterNotNull()
+ .groupBy { MoreElements.asType(it.method.enclosingElement) }
+ .mapValues { entry -> LifecycleObserverInfo(entry.key, entry.value) }
+
+}
+
+class Validator(val processingEnv: ProcessingEnvironment) {
+
+ fun printErrorMessage(msg: CharSequence, elem: Element) {
+ processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg, elem)
+ }
+
+ fun validateParam(param: VariableElement,
+ expectedType: Class<*>, errorMsg: String): Boolean {
+ if (!MoreTypes.isTypeOf(expectedType, param.asType())) {
+ printErrorMessage(errorMsg, param)
+ return false
+ }
+ return true
+ }
+
+ fun validateMethod(method: ExecutableElement, event: Lifecycle.Event): Boolean {
+ if (Modifier.PRIVATE in method.modifiers) {
+ printErrorMessage(ErrorMessages.INVALID_METHOD_MODIFIER, method)
+ return false
+ }
+ val params = method.parameters
+ if ((params.size > 2)) {
+ printErrorMessage(ErrorMessages.TOO_MANY_ARGS, method)
+ return false
+ }
+
+ if (params.size == 2 && event != Lifecycle.Event.ON_ANY) {
+ printErrorMessage(ErrorMessages.TOO_MANY_ARGS_NOT_ON_ANY, method)
+ return false
+ }
+
+ if (params.size == 2 && !validateParam(params[1], Lifecycle.Event::class.java,
+ ErrorMessages.INVALID_SECOND_ARGUMENT)) {
+ return false
+ }
+
+ if (params.size > 0) {
+ return validateParam(params[0], LifecycleOwner::class.java,
+ ErrorMessages.INVALID_FIRST_ARGUMENT)
+ }
+ return true
+ }
+
+ fun validateClass(classElement: Element): Boolean {
+ if (classElement.kind != ElementKind.CLASS && classElement.kind != ElementKind.INTERFACE) {
+ printErrorMessage(ErrorMessages.INVALID_ENCLOSING_ELEMENT, classElement)
+ return false
+ }
+ if (Modifier.PRIVATE in classElement.modifiers) {
+ printErrorMessage(ErrorMessages.INVALID_CLASS_MODIFIER, classElement)
+ return false
+ }
+ return true
+ }
+}
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt
new file mode 100644
index 0000000..1e76fa8
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt
@@ -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.
+ */
+
+package android.arch.lifecycle.model
+
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.TypeElement
+
+data class AdapterClass(val type: TypeElement,
+ val calls: List<EventMethodCall>,
+ val syntheticMethods: Set<ExecutableElement>)
\ No newline at end of file
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/EventMethod.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/EventMethod.kt
new file mode 100644
index 0000000..a3d4712
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/EventMethod.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.arch.lifecycle.model
+
+import android.arch.lifecycle.OnLifecycleEvent
+import android.arch.lifecycle.getPackageQName
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.TypeElement
+
+data class EventMethod(val method: ExecutableElement,
+ val onLifecycleEvent: OnLifecycleEvent,
+ val type: TypeElement) {
+
+ fun packageName() = type.getPackageQName()
+}
+
+data class EventMethodCall(val method: EventMethod, val syntheticAccess: TypeElement? = null)
\ No newline at end of file
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt
new file mode 100644
index 0000000..d8bc364
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt
@@ -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.
+ */
+
+package android.arch.lifecycle.model
+
+import javax.lang.model.element.TypeElement
+
+data class LifecycleObserverInfo(
+ val type: TypeElement,
+ val methods: List<EventMethod>)
\ No newline at end of file
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt
new file mode 100644
index 0000000..66fabf7
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt
@@ -0,0 +1,134 @@
+/*
+ * 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.arch.lifecycle
+
+import android.arch.lifecycle.model.AdapterClass
+import android.arch.lifecycle.model.EventMethod
+import android.arch.lifecycle.model.EventMethodCall
+import android.arch.lifecycle.model.LifecycleObserverInfo
+import com.google.auto.common.MoreTypes
+import com.google.common.collect.HashMultimap
+import java.util.LinkedList
+import javax.annotation.processing.ProcessingEnvironment
+import javax.lang.model.element.TypeElement
+import javax.lang.model.type.NoType
+import javax.lang.model.type.TypeMirror
+import javax.tools.Diagnostic
+
+
+private fun superObservers(world: Map<TypeElement, LifecycleObserverInfo>,
+ observer: LifecycleObserverInfo): List<LifecycleObserverInfo> {
+ val stack = LinkedList<TypeMirror>()
+ stack += observer.type.interfaces.reversed()
+ stack += observer.type.superclass
+ val result = mutableListOf<LifecycleObserverInfo>()
+ while (stack.isNotEmpty()) {
+ val typeMirror = stack.removeLast()
+ if (typeMirror is NoType) {
+ continue
+ }
+ val type = MoreTypes.asTypeElement(typeMirror)
+ val currentObserver = world[type]
+ if (currentObserver != null) {
+ result.add(currentObserver)
+ } else {
+ stack += type.interfaces.reversed()
+ stack += type.superclass
+ }
+ }
+ return result
+}
+
+private fun mergeAndVerifyMethods(processingEnv: ProcessingEnvironment,
+ type: TypeElement,
+ classMethods: List<EventMethod>,
+ parentMethods: List<EventMethod>): List<EventMethod> {
+ // need to update parent methods like that because:
+ // 1. visibility can be expanded
+ // 2. we want to preserve order
+ val updatedParentMethods = parentMethods.map { parentMethod ->
+ val overrideMethod = classMethods.find { (method) ->
+ processingEnv.elementUtils.overrides(method, parentMethod.method, type)
+ }
+ if (overrideMethod != null) {
+ if (overrideMethod.onLifecycleEvent != parentMethod.onLifecycleEvent) {
+ processingEnv.messager.printMessage(Diagnostic.Kind.ERROR,
+ ErrorMessages.INVALID_STATE_OVERRIDE_METHOD, overrideMethod.method)
+ }
+ overrideMethod
+ } else {
+ parentMethod
+ }
+ }
+ return updatedParentMethods + classMethods.filterNot { updatedParentMethods.contains(it) }
+}
+
+fun flattenObservers(processingEnv: ProcessingEnvironment,
+ world: Map<TypeElement, LifecycleObserverInfo>): List<LifecycleObserverInfo> {
+ val flattened: MutableMap<LifecycleObserverInfo, LifecycleObserverInfo> = mutableMapOf()
+ val superObservers = world.mapValues { superObservers(world, it.value) }
+
+ fun traverse(observer: LifecycleObserverInfo) {
+ if (observer in flattened) {
+ return
+ }
+ val observers = superObservers[observer.type]!!
+ if (observers.isEmpty()) {
+ flattened[observer] = observer
+ return
+ }
+ observers.filter { it !in flattened }.forEach(::traverse)
+ val methods = observers
+ .map(flattened::get)
+ .fold(emptyList<EventMethod>()) { list, parentObserver ->
+ mergeAndVerifyMethods(processingEnv, observer.type, parentObserver!!.methods, list)
+ }
+
+ flattened[observer] = LifecycleObserverInfo(observer.type,
+ mergeAndVerifyMethods(processingEnv, observer.type, observer.methods, methods))
+ }
+
+ world.values.forEach(::traverse)
+ return flattened.values.toList()
+}
+
+fun transformToOutput(processingEnv: ProcessingEnvironment,
+ world: Map<TypeElement, LifecycleObserverInfo>): List<AdapterClass> {
+ val flatObservers = flattenObservers(processingEnv, world)
+ val syntheticMethods = HashMultimap.create<TypeElement, EventMethodCall>()
+ val adapterCalls = flatObservers.map { (type, methods) ->
+ val calls = methods.map { eventMethod ->
+ val executable = eventMethod.method
+ if (type.getPackageQName() != eventMethod.packageName()
+ && (executable.isPackagePrivate() || executable.isProtected())) {
+ EventMethodCall(eventMethod, eventMethod.type)
+ } else {
+ EventMethodCall(eventMethod)
+ }
+ }
+ calls.filter { it.syntheticAccess != null }.forEach { eventMethod ->
+ syntheticMethods.put(eventMethod.method.type, eventMethod)
+ }
+ type to calls
+ }.toMap()
+
+ return adapterCalls.map { (type, calls) ->
+ val methods = syntheticMethods.get(type) ?: setOf()
+ val synthetic = methods.map { eventMethod -> eventMethod!!.method.method }.toSet()
+ AdapterClass(type, calls, synthetic)
+ }
+}
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt
new file mode 100644
index 0000000..1cd20ed
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt
@@ -0,0 +1,159 @@
+/*
+ * 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.arch.lifecycle
+
+import android.arch.lifecycle.model.AdapterClass
+import android.arch.lifecycle.model.EventMethodCall
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.ParameterSpec
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.TypeSpec
+import javax.annotation.processing.Filer
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.Modifier
+import javax.lang.model.element.TypeElement
+
+fun writeModels(infos: List<AdapterClass>, filer: Filer) {
+ infos.forEach({ adapter -> writeAdapter(adapter, filer) })
+}
+
+private val LIFECYCLE_OWNER = ClassName.get(LifecycleOwner::class.java)
+private val LIFECYCLE_EVENT = Lifecycle.Event::class.java
+
+private val T = "\$T"
+private val N = "\$N"
+private val L = "\$L"
+
+private fun writeAdapter(adapter: AdapterClass, filer: Filer) {
+ val ownerParam = ParameterSpec.builder(LIFECYCLE_OWNER, "owner").build()
+ val eventParam = ParameterSpec.builder(ClassName.get(LIFECYCLE_EVENT), "event").build()
+ val receiverName = "mReceiver"
+ val receiverField = FieldSpec.builder(ClassName.get(adapter.type), receiverName,
+ Modifier.FINAL).build()
+
+ val dispatchMethodBuilder = MethodSpec.methodBuilder("onStateChanged")
+ .returns(TypeName.VOID)
+ .addParameter(ownerParam)
+ .addParameter(eventParam)
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override::class.java)
+ val dispatchMethod = dispatchMethodBuilder.apply {
+ adapter.calls
+ .groupBy { (eventMethod) -> eventMethod.onLifecycleEvent.value }
+ .forEach { entry ->
+ val event = entry.key
+ val calls = entry.value
+ if (event == Lifecycle.Event.ON_ANY) {
+ writeMethodCalls(eventParam, calls, ownerParam, receiverField)
+ } else {
+ beginControlFlow("if ($N == $T.$L)", eventParam, LIFECYCLE_EVENT, event)
+ .writeMethodCalls(eventParam, calls, ownerParam, receiverField)
+ endControlFlow()
+ }
+ }
+ }.build()
+
+ @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
+ val getWrappedMethod = MethodSpec.methodBuilder("getReceiver")
+ .returns(ClassName.get(Object::class.java))
+ .addModifiers(Modifier.PUBLIC)
+ .addStatement("return $N", receiverField)
+ .build()
+
+ val receiverParam = ParameterSpec.builder(
+ ClassName.get(adapter.type), "receiver").build()
+
+ val syntheticMethods = adapter.syntheticMethods.map {
+ val method = MethodSpec.methodBuilder(syntheticName(it))
+ .returns(TypeName.VOID)
+ .addModifiers(Modifier.PUBLIC)
+ .addModifiers(Modifier.STATIC)
+ .addParameter(receiverParam)
+ if (it.parameters.size >= 1) {
+ method.addParameter(ownerParam)
+ }
+ if (it.parameters.size == 2) {
+ method.addParameter(eventParam)
+ }
+
+ val count = it.parameters.size
+ val paramString = generateParamString(count)
+ method.addStatement("$N.$L($paramString)", receiverParam, it.name(),
+ *takeParams(count, ownerParam, eventParam))
+ method.build()
+ }
+
+ val constructor = MethodSpec.constructorBuilder()
+ .addParameter(receiverParam)
+ .addStatement("this.$N = $N", receiverField, receiverParam)
+ .build()
+
+ val adapterName = getAdapterName(adapter.type)
+ val adapterTypeSpec = TypeSpec.classBuilder(adapterName)
+ .addModifiers(Modifier.PUBLIC)
+ .addSuperinterface(ClassName.get(GenericLifecycleObserver::class.java))
+ .addField(receiverField)
+ .addMethod(constructor)
+ .addMethod(dispatchMethod)
+ .addMethod(getWrappedMethod)
+ .addMethods(syntheticMethods)
+ .build()
+ JavaFile.builder(adapter.type.getPackageQName(), adapterTypeSpec)
+ .build().writeTo(filer)
+}
+
+private fun MethodSpec.Builder.writeMethodCalls(eventParam: ParameterSpec,
+ calls: List<EventMethodCall>,
+ ownerParam: ParameterSpec,
+ receiverField: FieldSpec) {
+ calls.forEach { (method, syntheticAccess) ->
+ val count = method.method.parameters.size
+ if (syntheticAccess == null) {
+ val paramString = generateParamString(count)
+ addStatement("$N.$L($paramString)", receiverField,
+ method.method.name(),
+ *takeParams(count, ownerParam, eventParam))
+
+ } else {
+ val originalType = syntheticAccess
+ val paramString = generateParamString(count + 1)
+ val className = ClassName.get(originalType.getPackageQName(),
+ getAdapterName(originalType))
+ addStatement("$T.$L($paramString)", className,
+ syntheticName(method.method),
+ *takeParams(count + 1, receiverField, ownerParam,
+ eventParam))
+ }
+ }
+}
+
+private fun syntheticName(method: ExecutableElement) = "__synthetic_" + method.simpleName
+
+private fun takeParams(count: Int, vararg params: Any) = params.take(count).toTypedArray()
+
+private fun generateParamString(count: Int) = (0..(count - 1)).joinToString(",") { N }
+
+private fun getAdapterName(type: TypeElement): String {
+ val packageElement = type.getPackage()
+ val qName = type.qualifiedName.toString()
+ val partialName = if (packageElement.isUnnamed) qName else qName.substring(
+ packageElement.qualifiedName.toString().length + 1)
+ return Lifecycling.getAdapterName(partialName)
+}
diff --git a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/InvalidCasesTest.kt b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/InvalidCasesTest.kt
index 000e1bd..3e502d3 100644
--- a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/InvalidCasesTest.kt
+++ b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/InvalidCasesTest.kt
@@ -27,18 +27,18 @@
@JvmStatic
@Parameterized.Parameters(name = "failingCase({0})")
fun data() : Collection<Array<Any>> = listOf(
- arrayOf<Any>("foo.InvalidFirstArg1", LifecycleProcessor.INVALID_FIRST_ARGUMENT),
- arrayOf<Any>("foo.InvalidFirstArg2", LifecycleProcessor.INVALID_FIRST_ARGUMENT),
- arrayOf<Any>("foo.InvalidSecondArg", LifecycleProcessor.INVALID_SECOND_ARGUMENT),
- arrayOf<Any>("foo.TooManyArgs1", LifecycleProcessor.TOO_MANY_ARGS),
- arrayOf<Any>("foo.TooManyArgs2", LifecycleProcessor.TOO_MANY_ARGS_NOT_ON_ANY),
+ arrayOf<Any>("foo.InvalidFirstArg1", ErrorMessages.INVALID_FIRST_ARGUMENT),
+ arrayOf<Any>("foo.InvalidFirstArg2", ErrorMessages.INVALID_FIRST_ARGUMENT),
+ arrayOf<Any>("foo.InvalidSecondArg", ErrorMessages.INVALID_SECOND_ARGUMENT),
+ arrayOf<Any>("foo.TooManyArgs1", ErrorMessages.TOO_MANY_ARGS),
+ arrayOf<Any>("foo.TooManyArgs2", ErrorMessages.TOO_MANY_ARGS_NOT_ON_ANY),
arrayOf<Any>("foo.InvalidMethodModifier",
- LifecycleProcessor.INVALID_METHOD_MODIFIER),
- arrayOf<Any>("foo.InvalidClassModifier", LifecycleProcessor.INVALID_CLASS_MODIFIER),
+ ErrorMessages.INVALID_METHOD_MODIFIER),
+ arrayOf<Any>("foo.InvalidClassModifier", ErrorMessages.INVALID_CLASS_MODIFIER),
arrayOf<Any>("foo.InvalidInheritance1",
- LifecycleProcessor.INVALID_STATE_OVERRIDE_METHOD),
+ ErrorMessages.INVALID_STATE_OVERRIDE_METHOD),
arrayOf<Any>("foo.InvalidInheritance2",
- LifecycleProcessor.INVALID_STATE_OVERRIDE_METHOD)
+ ErrorMessages.INVALID_STATE_OVERRIDE_METHOD)
)
}
diff --git a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/utils/TestUtils.kt b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/utils/TestUtils.kt
index 8a051b4..d3b13c2 100644
--- a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/utils/TestUtils.kt
+++ b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/utils/TestUtils.kt
@@ -33,8 +33,9 @@
return JavaFileObjects.forSourceString(fullClassName, code)
}
-fun processClass(vararg fullClassNames: String): CompileTester {
- val processedWith = JavaSourcesSubject.assertThat(
- *fullClassNames.map { load(it, "") }.toTypedArray()).processedWith(LifecycleProcessor())
+fun processClass(className: String, vararg fullClassNames: String): CompileTester {
+ val javaFiles = fullClassNames.map { load(it, "") }.toTypedArray()
+ val processedWith = JavaSourcesSubject.assertThat(load(className, ""), *javaFiles)
+ .processedWith(LifecycleProcessor())
return checkNotNull(processedWith)
}
diff --git a/lifecycle/extensions/build.gradle b/lifecycle/extensions/build.gradle
index 4fe78a0..4facb68 100644
--- a/lifecycle/extensions/build.gradle
+++ b/lifecycle/extensions/build.gradle
@@ -32,7 +32,8 @@
dependencies {
compile project(":lifecycle:common")
compile project(":lifecycle:runtime")
- compile project(":arch:core")
+ compile project(":arch:common")
+ compile project(":arch:runtime")
compile libs.support.fragments
testCompile project(":arch:core-testing")
diff --git a/lifecycle/reactivestreams/build.gradle b/lifecycle/reactivestreams/build.gradle
index d438fb9..67da2ca 100644
--- a/lifecycle/reactivestreams/build.gradle
+++ b/lifecycle/reactivestreams/build.gradle
@@ -45,7 +45,7 @@
allprojects {
dependencies {
- compile project(":arch:core")
+ compile project(":arch:common")
compile project(":lifecycle:common")
compile project(":lifecycle:extensions")
compile project(":lifecycle:runtime")
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/runtime/build.gradle
index f2bf671..3eb40e4 100644
--- a/lifecycle/runtime/build.gradle
+++ b/lifecycle/runtime/build.gradle
@@ -31,7 +31,7 @@
dependencies {
compile project(":lifecycle:common")
- compile project(":arch:core")
+ compile project(":arch:common")
// necessary for IJ to resolve dependencies.
compile libs.support.annotations
diff --git a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
index 884df0a..b83e6b8 100644
--- a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
+++ b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
@@ -16,11 +16,6 @@
package android.arch.lifecycle;
-import android.arch.core.internal.SafeIterableMap;
-import android.support.annotation.NonNull;
-
-import java.util.Map;
-
import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
@@ -33,34 +28,55 @@
import static android.arch.lifecycle.Lifecycle.State.RESUMED;
import static android.arch.lifecycle.Lifecycle.State.STARTED;
+import android.arch.core.internal.FastSafeIterableMap;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
/**
* An implementation of {@link Lifecycle} that can handle multiple observers.
* <p>
* It is used by Fragments and Support Library Activities. You can also directly use it if you have
* a custom LifecycleOwner.
*/
-@SuppressWarnings("WeakerAccess")
public class LifecycleRegistry extends Lifecycle {
/**
* Custom list that keeps observers and can handle removals / additions during traversal.
+ *
+ * Invariant: at any moment of time for observer1 & observer2:
+ * if addition_order(observer1) < addition_order(observer2), then
+ * state(observer1) >= state(observer2),
*/
- private SafeIterableMap<LifecycleObserver, ObserverWithState> mObserverSet =
- new SafeIterableMap<>();
+ private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
+ new FastSafeIterableMap<>();
/**
* Current state
*/
private State mState;
/**
- * Latest event that was provided via {@link #handleLifecycleEvent(Event)}.
- */
- private Event mLastEvent;
-
- /**
* The provider that owns this Lifecycle.
*/
private final LifecycleOwner mLifecycleOwner;
+ private int mAddingObserverCounter = 0;
+
+ private boolean mHandlingEvent = false;
+ private boolean mNewEventOccurred = false;
+
+ // we have to keep it for cases:
+ // void onStart() {
+ // mRegistry.removeObserver(this);
+ // mRegistry.add(newObserver);
+ // }
+ // newObserver should be brought only to CREATED state during the execution of
+ // this onStart method. our invariant with mObserverMap doesn't help, because parent observer
+ // is no longer in the map.
+ private ArrayList<State> mParentStates = new ArrayList<>();
+
/**
* Creates a new LifecycleRegistry for the given provider.
* <p>
@@ -80,6 +96,7 @@
*
* @param state new state
*/
+ @SuppressWarnings("WeakerAccess")
public void markState(State state) {
mState = state;
}
@@ -93,21 +110,71 @@
* @param event The event that was received
*/
public void handleLifecycleEvent(Lifecycle.Event event) {
- if (mLastEvent == event) {
+ mState = getStateAfter(event);
+ if (mHandlingEvent || mAddingObserverCounter != 0) {
+ mNewEventOccurred = true;
+ // we will figure out what to do on upper level.
return;
}
- mLastEvent = event;
- mState = getStateAfter(event);
- for (Map.Entry<LifecycleObserver, ObserverWithState> entry : mObserverSet) {
- entry.getValue().sync();
+ mHandlingEvent = true;
+ sync();
+ mHandlingEvent = false;
+ }
+
+ private boolean isSynced() {
+ if (mObserverMap.size() == 0) {
+ return true;
}
+ State eldestObserverState = mObserverMap.eldest().getValue().mState;
+ State newestObserverState = mObserverMap.newest().getValue().mState;
+ return eldestObserverState == newestObserverState && mState == newestObserverState;
+ }
+
+ private State calculateTargetState(LifecycleObserver observer) {
+ Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);
+
+ State siblingState = previous != null ? previous.getValue().mState : null;
+ State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
+ : null;
+ return min(min(mState, siblingState), parentState);
}
@Override
public void addObserver(LifecycleObserver observer) {
- ObserverWithState observerWithState = new ObserverWithState(observer);
- mObserverSet.putIfAbsent(observer, observerWithState);
- observerWithState.sync();
+ State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
+ ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
+ ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
+
+ if (previous != null) {
+ return;
+ }
+
+ boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
+
+ State targetState = calculateTargetState(observer);
+ mAddingObserverCounter++;
+ while ((statefulObserver.mState.compareTo(targetState) < 0
+ && mObserverMap.contains(observer))) {
+ pushParentState(statefulObserver.mState);
+ statefulObserver.dispatchEvent(mLifecycleOwner, upEvent(statefulObserver.mState));
+ popParentState();
+ // mState / subling may have been changed recalculate
+ targetState = calculateTargetState(observer);
+ }
+
+ if (!isReentrance) {
+ // we do sync only on the top level.
+ sync();
+ }
+ mAddingObserverCounter--;
+ }
+
+ private void popParentState() {
+ mParentStates.remove(mParentStates.size() - 1);
+ }
+
+ private void pushParentState(State state) {
+ mParentStates.add(state);
}
@Override
@@ -124,7 +191,7 @@
// lost an internet and as a result you removed this observer. If you get destruction
// events in removeObserver, you should have a special case in your onStop method that
// checks if your web connection died and you shouldn't try to report anything to a server.
- mObserverSet.remove(observer);
+ mObserverMap.remove(observer);
}
/**
@@ -132,8 +199,9 @@
*
* @return The number of observers.
*/
+ @SuppressWarnings("WeakerAccess")
public int getObserverCount() {
- return mObserverSet.size();
+ return mObserverMap.size();
}
@Override
@@ -159,7 +227,7 @@
throw new IllegalArgumentException("Unexpected event value " + event);
}
- static Event downEvent(State state) {
+ private static Event downEvent(State state) {
switch (state) {
case INITIALIZED:
throw new IllegalArgumentException();
@@ -175,7 +243,7 @@
throw new IllegalArgumentException("Unexpected state value " + state);
}
- static Event upEvent(State state) {
+ private static Event upEvent(State state) {
switch (state) {
case INITIALIZED:
case DESTROYED:
@@ -190,24 +258,73 @@
throw new IllegalArgumentException("Unexpected state value " + state);
}
- class ObserverWithState {
- private State mObserverCurrentState = INITIALIZED;
- private GenericLifecycleObserver mCallback;
+ private void forwardPass() {
+ Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
+ mObserverMap.iteratorWithAdditions();
+ while (ascendingIterator.hasNext() && !mNewEventOccurred) {
+ Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
+ ObserverWithState observer = entry.getValue();
+ while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
+ && mObserverMap.contains(entry.getKey()))) {
+ pushParentState(observer.mState);
+ observer.dispatchEvent(mLifecycleOwner, upEvent(observer.mState));
+ popParentState();
+ }
+ }
+ }
- ObserverWithState(LifecycleObserver observer) {
- mCallback = Lifecycling.getCallback(observer);
+ private void backwardPass() {
+ Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
+ mObserverMap.descendingIterator();
+ while (descendingIterator.hasNext() && !mNewEventOccurred) {
+ Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
+ ObserverWithState observer = entry.getValue();
+ while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
+ && mObserverMap.contains(entry.getKey()))) {
+ Event event = downEvent(observer.mState);
+ pushParentState(getStateAfter(event));
+ observer.dispatchEvent(mLifecycleOwner, event);
+ popParentState();
+ }
+ }
+ }
+
+ // happens only on the top of stack (never in reentrance),
+ // so it doesn't have to take in account parents
+ private void sync() {
+ while (!isSynced()) {
+ mNewEventOccurred = false;
+ // no need to check eldest for nullability, because isSynced does it for us.
+ if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
+ backwardPass();
+ }
+ Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
+ if (!mNewEventOccurred && newest != null
+ && mState.compareTo(newest.getValue().mState) > 0) {
+ forwardPass();
+ }
+ }
+ mNewEventOccurred = false;
+ }
+
+ static State min(@NonNull State state1, @Nullable State state2) {
+ return state2 != null && state2.compareTo(state1) < 0 ? state2 : state1;
+ }
+
+ static class ObserverWithState {
+ State mState;
+ GenericLifecycleObserver mLifecycleObserver;
+
+ ObserverWithState(LifecycleObserver observer, State initialState) {
+ mLifecycleObserver = Lifecycling.getCallback(observer);
+ mState = initialState;
}
- void sync() {
- if (mState == DESTROYED && mObserverCurrentState == INITIALIZED) {
- mObserverCurrentState = DESTROYED;
- }
- while (mObserverCurrentState != mState) {
- Event event = mObserverCurrentState.isAtLeast(mState)
- ? downEvent(mObserverCurrentState) : upEvent(mObserverCurrentState);
- mObserverCurrentState = getStateAfter(event);
- mCallback.onStateChanged(mLifecycleOwner, event);
- }
+ void dispatchEvent(LifecycleOwner owner, Event event) {
+ State newState = getStateAfter(event);
+ mState = min(mState, newState);
+ mLifecycleObserver.onStateChanged(owner, event);
+ mState = newState;
}
}
}
diff --git a/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java b/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
index 124bd68..ef498ee 100644
--- a/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
+++ b/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
@@ -128,18 +128,18 @@
}
@Test
- public void constructionDestruction1() {
+ public void constructionOrder() {
fullyInitializeRegistry();
final TestObserver observer = mock(TestObserver.class);
mRegistry.addObserver(observer);
- InOrder constructionVerifier = inOrder(observer);
- constructionVerifier.verify(observer).onCreate();
- constructionVerifier.verify(observer).onStart();
- constructionVerifier.verify(observer).onResume();
+ InOrder inOrder = inOrder(observer);
+ inOrder.verify(observer).onCreate();
+ inOrder.verify(observer).onStart();
+ inOrder.verify(observer).onResume();
}
@Test
- public void constructionDestruction2() {
+ public void constructionDestruction1() {
fullyInitializeRegistry();
final TestObserver observer = spy(new TestObserver() {
@Override
@@ -155,7 +155,7 @@
}
@Test
- public void constructionDestruction3() {
+ public void constructionDestruction2() {
fullyInitializeRegistry();
final TestObserver observer = spy(new TestObserver() {
@Override
@@ -193,6 +193,67 @@
}
@Test
+ public void addDuringTraversing() {
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ public void onStart() {
+ mRegistry.addObserver(observer3);
+ }
+ });
+ final TestObserver observer2 = mock(TestObserver.class);
+
+ mRegistry.addObserver(observer1);
+ mRegistry.addObserver(observer2);
+
+ dispatchEvent(ON_CREATE);
+ dispatchEvent(ON_START);
+
+ InOrder inOrder = inOrder(observer1, observer2, observer3);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer3).onStart();
+ }
+
+ @Test
+ public void addDuringAddition() {
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer2 = spy(new TestObserver() {
+ @Override
+ public void onCreate() {
+ mRegistry.addObserver(observer3);
+ }
+ });
+
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ public void onResume() {
+ mRegistry.addObserver(observer2);
+ }
+ });
+
+ mRegistry.addObserver(observer1);
+
+ dispatchEvent(ON_CREATE);
+ dispatchEvent(ON_START);
+ dispatchEvent(ON_RESUME);
+
+ InOrder inOrder = inOrder(observer1, observer2, observer3);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer2).onResume();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer3).onResume();
+ }
+
+ @Test
public void subscribeToDead() {
dispatchEvent(ON_CREATE);
final TestObserver observer1 = mock(TestObserver.class);
@@ -209,6 +270,305 @@
verify(observer2).onCreate();
}
+ @Test
+ public void downEvents() {
+ fullyInitializeRegistry();
+ final TestObserver observer1 = mock(TestObserver.class);
+ final TestObserver observer2 = mock(TestObserver.class);
+ mRegistry.addObserver(observer1);
+ mRegistry.addObserver(observer2);
+ InOrder orderVerifier = inOrder(observer1, observer2);
+ dispatchEvent(ON_PAUSE);
+ orderVerifier.verify(observer2).onPause();
+ orderVerifier.verify(observer1).onPause();
+ dispatchEvent(ON_STOP);
+ orderVerifier.verify(observer2).onStop();
+ orderVerifier.verify(observer1).onStop();
+ dispatchEvent(ON_DESTROY);
+ orderVerifier.verify(observer2).onDestroy();
+ orderVerifier.verify(observer1).onDestroy();
+ }
+
+ @Test
+ public void downEventsAddition() {
+ dispatchEvent(ON_CREATE);
+ dispatchEvent(ON_START);
+ final TestObserver observer1 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer2 = spy(new TestObserver() {
+ @Override
+ void onStop() {
+ mRegistry.addObserver(observer3);
+ }
+ });
+ mRegistry.addObserver(observer1);
+ mRegistry.addObserver(observer2);
+ InOrder orderVerifier = inOrder(observer1, observer2, observer3);
+ dispatchEvent(ON_STOP);
+ orderVerifier.verify(observer2).onStop();
+ orderVerifier.verify(observer3).onCreate();
+ orderVerifier.verify(observer1).onStop();
+ dispatchEvent(ON_DESTROY);
+ orderVerifier.verify(observer3).onDestroy();
+ orderVerifier.verify(observer2).onDestroy();
+ orderVerifier.verify(observer1).onDestroy();
+ }
+
+ @Test
+ public void downEventsRemoveAll() {
+ fullyInitializeRegistry();
+ final TestObserver observer1 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer2 = spy(new TestObserver() {
+ @Override
+ void onStop() {
+ mRegistry.removeObserver(observer3);
+ mRegistry.removeObserver(this);
+ mRegistry.removeObserver(observer1);
+ assertThat(mRegistry.getObserverCount(), is(0));
+ }
+ });
+ mRegistry.addObserver(observer1);
+ mRegistry.addObserver(observer2);
+ mRegistry.addObserver(observer3);
+ InOrder orderVerifier = inOrder(observer1, observer2, observer3);
+ dispatchEvent(ON_PAUSE);
+ orderVerifier.verify(observer3).onPause();
+ orderVerifier.verify(observer2).onPause();
+ orderVerifier.verify(observer1).onPause();
+ dispatchEvent(ON_STOP);
+ orderVerifier.verify(observer3).onStop();
+ orderVerifier.verify(observer2).onStop();
+ orderVerifier.verify(observer1, never()).onStop();
+ dispatchEvent(ON_PAUSE);
+ orderVerifier.verify(observer3, never()).onPause();
+ orderVerifier.verify(observer2, never()).onPause();
+ orderVerifier.verify(observer1, never()).onPause();
+ }
+
+ @Test
+ public void deadParentInAddition() {
+ fullyInitializeRegistry();
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+
+ TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.removeObserver(this);
+ assertThat(mRegistry.getObserverCount(), is(0));
+ mRegistry.addObserver(observer2);
+ mRegistry.addObserver(observer3);
+ }
+ });
+
+ mRegistry.addObserver(observer1);
+
+ InOrder inOrder = inOrder(observer1, observer2, observer3);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer2).onResume();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer3).onResume();
+ }
+
+ @Test
+ public void deadParentWhileTraversing() {
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+ TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.removeObserver(this);
+ assertThat(mRegistry.getObserverCount(), is(0));
+ mRegistry.addObserver(observer2);
+ mRegistry.addObserver(observer3);
+ }
+ });
+ InOrder inOrder = inOrder(observer1, observer2, observer3);
+ mRegistry.addObserver(observer1);
+ dispatchEvent(ON_CREATE);
+ dispatchEvent(ON_START);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer3).onStart();
+ }
+
+ @Test
+ public void removeCascade() {
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer4 = mock(TestObserver.class);
+
+ final TestObserver observer2 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.removeObserver(this);
+ }
+ });
+
+ TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onResume() {
+ mRegistry.removeObserver(this);
+ mRegistry.addObserver(observer2);
+ mRegistry.addObserver(observer3);
+ mRegistry.addObserver(observer4);
+ }
+ });
+ fullyInitializeRegistry();
+ mRegistry.addObserver(observer1);
+ InOrder inOrder = inOrder(observer1, observer2, observer3, observer4);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer4).onCreate();
+ inOrder.verify(observer4).onStart();
+ inOrder.verify(observer3).onResume();
+ inOrder.verify(observer4).onResume();
+ }
+
+ @Test
+ public void changeStateDuringDescending() {
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onPause() {
+ // but tonight I bounce back
+ mRegistry.handleLifecycleEvent(ON_RESUME);
+ mRegistry.addObserver(observer2);
+ }
+ });
+ fullyInitializeRegistry();
+ mRegistry.addObserver(observer1);
+ mRegistry.handleLifecycleEvent(ON_PAUSE);
+ InOrder inOrder = inOrder(observer1, observer2);
+ inOrder.verify(observer1).onPause();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer2).onResume();
+ }
+
+ @Test
+ public void siblingLimitationCheck() {
+ fullyInitializeRegistry();
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.addObserver(observer2);
+ }
+
+ @Override
+ void onResume() {
+ mRegistry.addObserver(observer3);
+ }
+ });
+ mRegistry.addObserver(observer1);
+ InOrder inOrder = inOrder(observer1, observer2, observer3);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer2).onStart();
+ inOrder.verify(observer2).onResume();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer3).onResume();
+ }
+
+ @Test
+ public void siblingRemovalLimitationCheck1() {
+ fullyInitializeRegistry();
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer3 = mock(TestObserver.class);
+ final TestObserver observer4 = mock(TestObserver.class);
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.addObserver(observer2);
+ }
+
+ @Override
+ void onResume() {
+ mRegistry.removeObserver(observer2);
+ mRegistry.addObserver(observer3);
+ mRegistry.addObserver(observer4);
+ }
+ });
+ mRegistry.addObserver(observer1);
+ InOrder inOrder = inOrder(observer1, observer2, observer3, observer4);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer4).onCreate();
+ inOrder.verify(observer4).onStart();
+ inOrder.verify(observer3).onResume();
+ inOrder.verify(observer4).onResume();
+ }
+
+ @Test
+ public void siblingRemovalLimitationCheck2() {
+ fullyInitializeRegistry();
+ final TestObserver observer2 = mock(TestObserver.class);
+ final TestObserver observer3 = spy(new TestObserver() {
+ @Override
+ void onCreate() {
+ mRegistry.removeObserver(observer2);
+ }
+ });
+ final TestObserver observer4 = mock(TestObserver.class);
+ final TestObserver observer1 = spy(new TestObserver() {
+ @Override
+ void onStart() {
+ mRegistry.addObserver(observer2);
+ }
+
+ @Override
+ void onResume() {
+ mRegistry.addObserver(observer3);
+ mRegistry.addObserver(observer4);
+ }
+ });
+
+ mRegistry.addObserver(observer1);
+ InOrder inOrder = inOrder(observer1, observer2, observer3, observer4);
+ inOrder.verify(observer1).onCreate();
+ inOrder.verify(observer1).onStart();
+ inOrder.verify(observer2).onCreate();
+ inOrder.verify(observer1).onResume();
+ inOrder.verify(observer3).onCreate();
+ inOrder.verify(observer3).onStart();
+ inOrder.verify(observer4).onCreate();
+ inOrder.verify(observer4).onStart();
+ inOrder.verify(observer3).onResume();
+ inOrder.verify(observer4).onResume();
+ }
+
+ @Test
+ public void sameObserverReAddition() {
+ TestObserver observer = mock(TestObserver.class);
+ mRegistry.addObserver(observer);
+ mRegistry.removeObserver(observer);
+ mRegistry.addObserver(observer);
+ dispatchEvent(ON_CREATE);
+ verify(observer).onCreate();
+ }
+
private void dispatchEvent(Lifecycle.Event event) {
when(mLifecycle.getCurrentState()).thenReturn(LifecycleRegistry.getStateAfter(event));
mRegistry.handleLifecycleEvent(event);
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index 9d28f80..f4e3839 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -2,18 +2,18 @@
archivesBaseName = 'support-media-compat'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
+ api project(':support-annotations')
+ api project(':support-compat')
- androidTestCompile(libs.test_runner) {
+ androidTestImplementation(libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile(libs.espresso_core) {
+ androidTestImplementation(libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
}
android {
@@ -32,6 +32,7 @@
'java'
]
main.aidl.srcDirs = ['java']
+ main.res.srcDirs 'res', 'res-public'
}
buildTypes.all {
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
index 3c62f94..7116464 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
@@ -1164,7 +1164,7 @@
mSubscriptions.put(parentId, sub);
}
Bundle copiedOptions = options == null ? null : new Bundle(options);
- sub.putCallback(copiedOptions, callback);
+ sub.putCallback(mContext, copiedOptions, callback);
// If we are connected, tell the service that we are watching. If we aren't
// connected, the service will be told when we connect.
@@ -1390,7 +1390,7 @@
}
// Tell the app.
- SubscriptionCallback subscriptionCallback = subscription.getCallback(options);
+ SubscriptionCallback subscriptionCallback = subscription.getCallback(mContext, options);
if (subscriptionCallback != null) {
if (options == null) {
if (list == null) {
@@ -1577,6 +1577,7 @@
@RequiresApi(21)
static class MediaBrowserImplApi21 implements MediaBrowserImpl, MediaBrowserServiceCallbackImpl,
ConnectionCallback.ConnectionCallbackInternal {
+ final Context mContext;
protected final Object mBrowserObj;
protected final Bundle mRootHints;
protected final CallbackHandler mHandler = new CallbackHandler(this);
@@ -1588,6 +1589,7 @@
public MediaBrowserImplApi21(Context context, ComponentName serviceComponent,
ConnectionCallback callback, Bundle rootHints) {
+ mContext = context;
if (rootHints == null) {
rootHints = new Bundle();
}
@@ -1658,7 +1660,7 @@
}
callback.setSubscription(sub);
Bundle copiedOptions = options == null ? null : new Bundle(options);
- sub.putCallback(copiedOptions, callback);
+ sub.putCallback(mContext, copiedOptions, callback);
if (mServiceBinderWrapper == null) {
// TODO: When MediaBrowser is connected to framework's MediaBrowserService,
@@ -1910,7 +1912,7 @@
}
// Tell the app.
- SubscriptionCallback subscriptionCallback = subscription.getCallback(options);
+ SubscriptionCallback subscriptionCallback = subscription.getCallback(mContext, options);
if (subscriptionCallback != null) {
if (options == null) {
if (list == null) {
@@ -1998,7 +2000,10 @@
return mCallbacks;
}
- public SubscriptionCallback getCallback(Bundle options) {
+ public SubscriptionCallback getCallback(Context context, Bundle options) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
for (int i = 0; i < mOptionsList.size(); ++i) {
if (MediaBrowserCompatUtils.areSameOptions(mOptionsList.get(i), options)) {
return mCallbacks.get(i);
@@ -2007,7 +2012,10 @@
return null;
}
- public void putCallback(Bundle options, SubscriptionCallback callback) {
+ public void putCallback(Context context, Bundle options, SubscriptionCallback callback) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
for (int i = 0; i < mOptionsList.size(); ++i) {
if (MediaBrowserCompatUtils.areSameOptions(mOptionsList.get(i), options)) {
mCallbacks.set(i, callback);
diff --git a/media-compat/java/android/support/v4/media/app/NotificationCompat.java b/media-compat/java/android/support/v4/media/app/NotificationCompat.java
new file mode 100644
index 0000000..be1d423
--- /dev/null
+++ b/media-compat/java/android/support/v4/media/app/NotificationCompat.java
@@ -0,0 +1,502 @@
+/*
+ * 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.app;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static android.support.v4.app.NotificationCompat.COLOR_DEFAULT;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.media.session.MediaSession;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.mediacompat.R;
+import android.support.v4.app.BundleCompat;
+import android.support.v4.app.NotificationBuilderWithBuilderAccessor;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.view.View;
+import android.widget.RemoteViews;
+
+/**
+ * Class containing media specfic {@link android.support.v4.app.NotificationCompat.Style styles}
+ * that you can use with {@link android.support.v4.app.NotificationCompat.Builder#setStyle}.
+ */
+public class NotificationCompat {
+
+ private NotificationCompat() {
+ }
+
+ /**
+ * Notification style for media playback notifications.
+ *
+ * In the expanded form, up to 5
+ * {@link android.support.v4.app.NotificationCompat.Action actions} specified with
+ * {@link android.support.v4.app.NotificationCompat.Builder
+ * #addAction(int, CharSequence, PendingIntent) addAction} will be shown as icon-only
+ * pushbuttons, suitable for transport controls. The Bitmap given to
+ * {@link android.support.v4.app.NotificationCompat.Builder
+ * #setLargeIcon(android.graphics.Bitmap) setLargeIcon()} will
+ * be treated as album artwork.
+ *
+ * Unlike the other styles provided here, MediaStyle can also modify the standard-size
+ * content view; by providing action indices to
+ * {@link #setShowActionsInCompactView(int...)} you can promote up to 3 actions to be displayed
+ * in the standard view alongside the usual content.
+ *
+ * Notifications created with MediaStyle will have their category set to
+ * {@link android.support.v4.app.NotificationCompat#CATEGORY_TRANSPORT CATEGORY_TRANSPORT}
+ * unless you set a different category using
+ * {@link android.support.v4.app.NotificationCompat.Builder#setCategory(String)
+ * setCategory()}.
+ *
+ * Finally, if you attach a {@link MediaSession.Token} using
+ * {@link android.support.v4.media.app.NotificationCompat.MediaStyle#setMediaSession}, the
+ * System UI can identify this as a notification representing an active media session and
+ * respond accordingly (by showing album artwork in the lockscreen, for example).
+ *
+ * To use this style with your Notification, feed it to
+ * {@link android.support.v4.app.NotificationCompat.Builder#setStyle} like so:
+ * <pre class="prettyprint">
+ * Notification noti = new NotificationCompat.Builder()
+ * .setSmallIcon(R.drawable.ic_stat_player)
+ * .setContentTitle("Track title")
+ * .setContentText("Artist - Album")
+ * .setLargeIcon(albumArtBitmap))
+ * .setStyle(<b>new NotificationCompat.MediaStyle()</b>
+ * .setMediaSession(mySession))
+ * .build();
+ * </pre>
+ *
+ * @see Notification#bigContentView
+ */
+ public static class MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+
+ /**
+ * Extracts a {@link MediaSessionCompat.Token} from the extra values
+ * in the {@link MediaStyle} {@link Notification notification}.
+ *
+ * @param notification The notification to extract a {@link MediaSessionCompat.Token} from.
+ * @return The {@link MediaSessionCompat.Token} in the {@code notification} if it contains,
+ * null otherwise.
+ */
+ public static MediaSessionCompat.Token getMediaSession(Notification notification) {
+ Bundle extras = android.support.v4.app.NotificationCompat.getExtras(notification);
+ if (extras != null) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ Object tokenInner = extras.getParcelable(
+ android.support.v4.app.NotificationCompat.EXTRA_MEDIA_SESSION);
+ if (tokenInner != null) {
+ return MediaSessionCompat.Token.fromToken(tokenInner);
+ }
+ } else {
+ IBinder tokenInner = BundleCompat.getBinder(extras,
+ android.support.v4.app.NotificationCompat.EXTRA_MEDIA_SESSION);
+ if (tokenInner != null) {
+ Parcel p = Parcel.obtain();
+ p.writeStrongBinder(tokenInner);
+ p.setDataPosition(0);
+ MediaSessionCompat.Token token =
+ MediaSessionCompat.Token.CREATOR.createFromParcel(p);
+ p.recycle();
+ return token;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static final int MAX_MEDIA_BUTTONS_IN_COMPACT = 3;
+ private static final int MAX_MEDIA_BUTTONS = 5;
+
+ int[] mActionsToShowInCompact = null;
+ MediaSessionCompat.Token mToken;
+ boolean mShowCancelButton;
+ PendingIntent mCancelButtonIntent;
+
+ public MediaStyle() {
+ }
+
+ public MediaStyle(android.support.v4.app.NotificationCompat.Builder builder) {
+ setBuilder(builder);
+ }
+
+ /**
+ * Requests up to 3 actions (by index in the order of addition) to be shown in the compact
+ * notification view.
+ *
+ * @param actions the indices of the actions to show in the compact notification view
+ */
+ public MediaStyle setShowActionsInCompactView(int...actions) {
+ mActionsToShowInCompact = actions;
+ return this;
+ }
+
+ /**
+ * Attaches a {@link MediaSessionCompat.Token} to this Notification
+ * to provide additional playback information and control to the SystemUI.
+ */
+ public MediaStyle setMediaSession(MediaSessionCompat.Token token) {
+ mToken = token;
+ return this;
+ }
+
+ /**
+ * Sets whether a cancel button at the top right should be shown in the notification on
+ * platforms before Lollipop.
+ *
+ * <p>Prior to Lollipop, there was a bug in the framework which prevented the developer to
+ * make a notification dismissable again after having used the same notification as the
+ * ongoing notification for a foreground service. When the notification was posted by
+ * {@link android.app.Service#startForeground}, but then the service exited foreground mode
+ * via {@link android.app.Service#stopForeground}, without removing the notification, the
+ * notification stayed ongoing, and thus not dismissable.
+ *
+ * <p>This is a common scenario for media notifications, as this is exactly the service
+ * lifecycle that happens when playing/pausing media. Thus, a workaround is provided by the
+ * support library: Instead of making the notification ongoing depending on the playback
+ * state, the support library provides the ability to add an explicit cancel button to the
+ * notification.
+ *
+ * <p>Note that the notification is enforced to be ongoing if a cancel button is shown to
+ * provide a consistent user experience.
+ *
+ * <p>Also note that this method is a no-op when running on Lollipop and later.
+ *
+ * @param show whether to show a cancel button
+ */
+ public MediaStyle setShowCancelButton(boolean show) {
+ if (Build.VERSION.SDK_INT < 21) {
+ mShowCancelButton = show;
+ }
+ return this;
+ }
+
+ /**
+ * Sets the pending intent to be sent when the cancel button is pressed. See {@link
+ * #setShowCancelButton}.
+ *
+ * @param pendingIntent the intent to be sent when the cancel button is pressed
+ */
+ public MediaStyle setCancelButtonIntent(PendingIntent pendingIntent) {
+ mCancelButtonIntent = pendingIntent;
+ return this;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public void apply(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ builder.getBuilder().setStyle(
+ fillInMediaStyle(new Notification.MediaStyle()));
+ } else if (mShowCancelButton) {
+ builder.getBuilder().setOngoing(true);
+ }
+ }
+
+ @RequiresApi(21)
+ Notification.MediaStyle fillInMediaStyle(Notification.MediaStyle style) {
+ if (mActionsToShowInCompact != null) {
+ style.setShowActionsInCompactView(mActionsToShowInCompact);
+ }
+ if (mToken != null) {
+ style.setMediaSession((MediaSession.Token) mToken.getToken());
+ }
+ return style;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ // No custom content view required
+ return null;
+ }
+ return generateContentView();
+ }
+
+ RemoteViews generateContentView() {
+ RemoteViews view = applyStandardTemplate(false /* showSmallIcon */,
+ getContentViewLayoutResource(), true /* fitIn1U */);
+
+ final int numActions = mBuilder.mActions.size();
+ final int numActionsInCompact = mActionsToShowInCompact == null
+ ? 0
+ : Math.min(mActionsToShowInCompact.length, MAX_MEDIA_BUTTONS_IN_COMPACT);
+ view.removeAllViews(R.id.media_actions);
+ if (numActionsInCompact > 0) {
+ for (int i = 0; i < numActionsInCompact; i++) {
+ if (i >= numActions) {
+ throw new IllegalArgumentException(String.format(
+ "setShowActionsInCompactView: action %d out of bounds (max %d)",
+ i, numActions - 1));
+ }
+
+ final android.support.v4.app.NotificationCompat.Action action =
+ mBuilder.mActions.get(mActionsToShowInCompact[i]);
+ final RemoteViews button = generateMediaActionButton(action);
+ view.addView(R.id.media_actions, button);
+ }
+ }
+ if (mShowCancelButton) {
+ view.setViewVisibility(R.id.end_padder, View.GONE);
+ view.setViewVisibility(R.id.cancel_action, View.VISIBLE);
+ view.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
+ view.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
+ .getResources().getInteger(R.integer.cancel_button_image_alpha));
+ } else {
+ view.setViewVisibility(R.id.end_padder, View.VISIBLE);
+ view.setViewVisibility(R.id.cancel_action, View.GONE);
+ }
+ return view;
+ }
+
+ private RemoteViews generateMediaActionButton(
+ android.support.v4.app.NotificationCompat.Action action) {
+ final boolean tombstone = (action.getActionIntent() == null);
+ RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
+ R.layout.notification_media_action);
+ button.setImageViewResource(R.id.action0, action.getIcon());
+ if (!tombstone) {
+ button.setOnClickPendingIntent(R.id.action0, action.getActionIntent());
+ }
+ if (Build.VERSION.SDK_INT >= 15) {
+ button.setContentDescription(R.id.action0, action.getTitle());
+ }
+ return button;
+ }
+
+ int getContentViewLayoutResource() {
+ return R.layout.notification_template_media;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ // No custom content view required
+ return null;
+ }
+ return generateBigContentView();
+ }
+
+ RemoteViews generateBigContentView() {
+ final int actionCount = Math.min(mBuilder.mActions.size(), MAX_MEDIA_BUTTONS);
+ RemoteViews big = applyStandardTemplate(false /* showSmallIcon */,
+ getBigContentViewLayoutResource(actionCount), false /* fitIn1U */);
+
+ big.removeAllViews(R.id.media_actions);
+ if (actionCount > 0) {
+ for (int i = 0; i < actionCount; i++) {
+ final RemoteViews button = generateMediaActionButton(mBuilder.mActions.get(i));
+ big.addView(R.id.media_actions, button);
+ }
+ }
+ if (mShowCancelButton) {
+ big.setViewVisibility(R.id.cancel_action, View.VISIBLE);
+ big.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
+ .getResources().getInteger(R.integer.cancel_button_image_alpha));
+ big.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
+ } else {
+ big.setViewVisibility(R.id.cancel_action, View.GONE);
+ }
+ return big;
+ }
+
+ int getBigContentViewLayoutResource(int actionCount) {
+ return actionCount <= 3
+ ? R.layout.notification_template_big_media_narrow
+ : R.layout.notification_template_big_media;
+ }
+ }
+
+ /**
+ * Notification style for media custom views that are decorated by the system.
+ *
+ * <p>Instead of providing a media notification that is completely custom, a developer can set
+ * this style and still obtain system decorations like the notification header with the expand
+ * affordance and actions.
+ *
+ * <p>Use {@link android.support.v4.app.NotificationCompat.Builder
+ * #setCustomContentView(RemoteViews)},
+ * {@link android.support.v4.app.NotificationCompat.Builder
+ * #setCustomBigContentView(RemoteViews)} and
+ * {@link android.support.v4.app.NotificationCompat.Builder
+ * #setCustomHeadsUpContentView(RemoteViews)} to set the
+ * corresponding custom views to display.
+ *
+ * <p>To use this style with your Notification, feed it to
+ * {@link android.support.v4.app.NotificationCompat.Builder
+ * #setStyle(android.support.v4.app.NotificationCompat.Style)} like so:
+ * <pre class="prettyprint">
+ * Notification noti = new NotificationCompat.Builder()
+ * .setSmallIcon(R.drawable.ic_stat_player)
+ * .setLargeIcon(albumArtBitmap))
+ * .setCustomContentView(contentView)
+ * .setStyle(<b>new NotificationCompat.DecoratedMediaCustomViewStyle()</b>
+ * .setMediaSession(mySession))
+ * .build();
+ * </pre>
+ *
+ * <p>If you are using this style, consider using the corresponding styles like
+ * {@link android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Media} or
+ * {@link
+ * android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Title_Media} in
+ * your custom views in order to get the correct styling on each platform version.
+ *
+ * @see android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle
+ * @see MediaStyle
+ */
+ public static class DecoratedMediaCustomViewStyle extends MediaStyle {
+
+ public DecoratedMediaCustomViewStyle() {
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public void apply(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ builder.getBuilder().setStyle(
+ fillInMediaStyle(new Notification.DecoratedMediaCustomViewStyle()));
+ } else {
+ super.apply(builder);
+ }
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom content view required
+ return null;
+ }
+ boolean hasContentView = mBuilder.getContentView() != null;
+ if (Build.VERSION.SDK_INT >= 21) {
+ // If we are on L/M the media notification will only be colored if the expanded
+ // version is of media style, so we have to create a custom view for the collapsed
+ // version as well in that case.
+ boolean createCustomContent = hasContentView
+ || mBuilder.getBigContentView() != null;
+ if (createCustomContent) {
+ RemoteViews contentView = generateContentView();
+ if (hasContentView) {
+ buildIntoRemoteViews(contentView, mBuilder.getContentView());
+ }
+ setBackgroundColor(contentView);
+ return contentView;
+ }
+ } else {
+ RemoteViews contentView = generateContentView();
+ if (hasContentView) {
+ buildIntoRemoteViews(contentView, mBuilder.getContentView());
+ return contentView;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ int getContentViewLayoutResource() {
+ return mBuilder.getContentView() != null
+ ? R.layout.notification_template_media_custom
+ : super.getContentViewLayoutResource();
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom big content view required
+ return null;
+ }
+ RemoteViews innerView = mBuilder.getBigContentView() != null
+ ? mBuilder.getBigContentView()
+ : mBuilder.getContentView();
+ if (innerView == null) {
+ // No expandable notification
+ return null;
+ }
+ RemoteViews bigContentView = generateBigContentView();
+ buildIntoRemoteViews(bigContentView, innerView);
+ if (Build.VERSION.SDK_INT >= 21) {
+ setBackgroundColor(bigContentView);
+ }
+ return bigContentView;
+ }
+
+ @Override
+ int getBigContentViewLayoutResource(int actionCount) {
+ return actionCount <= 3
+ ? R.layout.notification_template_big_media_narrow_custom
+ : R.layout.notification_template_big_media_custom;
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY_GROUP)
+ @Override
+ public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ // No custom heads up content view required
+ return null;
+ }
+ RemoteViews innerView = mBuilder.getHeadsUpContentView() != null
+ ? mBuilder.getHeadsUpContentView()
+ : mBuilder.getContentView();
+ if (innerView == null) {
+ // No expandable notification
+ return null;
+ }
+ RemoteViews headsUpContentView = generateBigContentView();
+ buildIntoRemoteViews(headsUpContentView, innerView);
+ if (Build.VERSION.SDK_INT >= 21) {
+ setBackgroundColor(headsUpContentView);
+ }
+ return headsUpContentView;
+ }
+
+ private void setBackgroundColor(RemoteViews views) {
+ int color = mBuilder.getColor() != COLOR_DEFAULT
+ ? mBuilder.getColor()
+ : mBuilder.mContext.getResources().getColor(
+ R.color.notification_material_background_media_default_color);
+ views.setInt(R.id.status_bar_latest_event_content, "setBackgroundColor", color);
+ }
+ }
+}
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 9024a87..d3c403a 100644
--- a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -46,6 +46,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
/**
@@ -192,6 +193,9 @@
private final MediaControllerImpl mImpl;
private final MediaSessionCompat.Token mToken;
+ // This set is used to keep references to registered callbacks to prevent them being GCed,
+ // since we only keep weak references for callbacks in this class and its inner classes.
+ private final HashSet<Callback> mRegisteredCallbacks = new HashSet<>();
/**
* Creates a media controller from a session.
@@ -534,7 +538,9 @@
if (handler == null) {
handler = new Handler();
}
+ callback.setHandler(handler);
mImpl.registerCallback(callback, handler);
+ mRegisteredCallbacks.add(callback);
}
/**
@@ -547,7 +553,12 @@
if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
- mImpl.unregisterCallback(callback);
+ try {
+ mRegisteredCallbacks.remove(callback);
+ mImpl.unregisterCallback(callback);
+ } finally {
+ callback.setHandler(null);
+ }
}
/**
@@ -598,13 +609,11 @@
MessageHandler mHandler;
boolean mHasExtraCallback;
- boolean mRegistered = false;
-
public Callback() {
if (android.os.Build.VERSION.SDK_INT >= 21) {
- mCallbackObj = MediaControllerCompatApi21.createCallback(new StubApi21());
+ mCallbackObj = MediaControllerCompatApi21.createCallback(new StubApi21(this));
} else {
- mCallbackObj = new StubCompat();
+ mCallbackObj = new StubCompat(this);
}
}
@@ -728,136 +737,221 @@
}
/**
- * Sets the handler to use for pre 21 callbacks.
+ * Set the handler to use for callbacks.
*/
- private void setHandler(Handler handler) {
- mHandler = new MessageHandler(handler.getLooper());
+ void setHandler(Handler handler) {
+ if (handler == null) {
+ if (mHandler != null) {
+ mHandler.mRegistered = false;
+ mHandler.removeCallbacksAndMessages(null);
+ mHandler = null;
+ }
+ } else {
+ mHandler = new MessageHandler(handler.getLooper());
+ mHandler.mRegistered = true;
+ }
}
- private class StubApi21 implements MediaControllerCompatApi21.Callback {
- StubApi21() {
+ void postToHandler(int what, Object obj, Bundle data) {
+ if (mHandler != null) {
+ Message msg = mHandler.obtainMessage(what, obj);
+ msg.setData(data);
+ msg.sendToTarget();
+ }
+ }
+
+ private static class StubApi21 implements MediaControllerCompatApi21.Callback {
+ private final WeakReference<MediaControllerCompat.Callback> mCallback;
+
+ StubApi21(MediaControllerCompat.Callback callback) {
+ mCallback = new WeakReference<>(callback);
}
@Override
public void onSessionDestroyed() {
- Callback.this.onSessionDestroyed();
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onSessionDestroyed();
+ }
}
@Override
public void onSessionEvent(String event, Bundle extras) {
- if (mHasExtraCallback && android.os.Build.VERSION.SDK_INT < 23) {
- // Ignore. ExtraCallback will handle this.
- } else {
- Callback.this.onSessionEvent(event, extras);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ if (callback.mHasExtraCallback && android.os.Build.VERSION.SDK_INT < 23) {
+ // Ignore. ExtraCallback will handle this.
+ } else {
+ callback.onSessionEvent(event, extras);
+ }
}
}
@Override
public void onPlaybackStateChanged(Object stateObj) {
- if (mHasExtraCallback) {
- // Ignore. ExtraCallback will handle this.
- } else {
- Callback.this.onPlaybackStateChanged(
- PlaybackStateCompat.fromPlaybackState(stateObj));
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ if (callback.mHasExtraCallback) {
+ // Ignore. ExtraCallback will handle this.
+ } else {
+ callback.onPlaybackStateChanged(
+ PlaybackStateCompat.fromPlaybackState(stateObj));
+ }
}
}
@Override
public void onMetadataChanged(Object metadataObj) {
- Callback.this.onMetadataChanged(MediaMetadataCompat.fromMediaMetadata(metadataObj));
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onMetadataChanged(MediaMetadataCompat.fromMediaMetadata(metadataObj));
+ }
}
@Override
public void onQueueChanged(List<?> queue) {
- Callback.this.onQueueChanged(QueueItem.fromQueueItemList(queue));
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onQueueChanged(QueueItem.fromQueueItemList(queue));
+ }
}
@Override
public void onQueueTitleChanged(CharSequence title) {
- Callback.this.onQueueTitleChanged(title);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onQueueTitleChanged(title);
+ }
}
@Override
public void onExtrasChanged(Bundle extras) {
- Callback.this.onExtrasChanged(extras);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onExtrasChanged(extras);
+ }
}
@Override
public void onAudioInfoChanged(
int type, int stream, int control, int max, int current) {
- Callback.this.onAudioInfoChanged(
- new PlaybackInfo(type, stream, control, max, current));
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.onAudioInfoChanged(
+ new PlaybackInfo(type, stream, control, max, current));
+ }
}
}
- private class StubCompat extends IMediaControllerCallback.Stub {
+ private static class StubCompat extends IMediaControllerCallback.Stub {
+ private final WeakReference<MediaControllerCompat.Callback> mCallback;
- StubCompat() {
+ StubCompat(MediaControllerCompat.Callback callback) {
+ mCallback = new WeakReference<>(callback);
}
@Override
public void onEvent(String event, Bundle extras) throws RemoteException {
- mHandler.post(MessageHandler.MSG_EVENT, event, extras);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_EVENT, event, extras);
+ }
}
@Override
public void onSessionDestroyed() throws RemoteException {
- mHandler.post(MessageHandler.MSG_DESTROYED, null, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_DESTROYED, null, null);
+ }
}
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_PLAYBACK_STATE, state, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_PLAYBACK_STATE, state, null);
+ }
}
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_METADATA, metadata, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_METADATA, metadata, null);
+ }
}
@Override
public void onQueueChanged(List<QueueItem> queue) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_QUEUE, queue, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_QUEUE, queue, null);
+ }
}
@Override
public void onQueueTitleChanged(CharSequence title) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_QUEUE_TITLE, title, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_QUEUE_TITLE, title, null);
+ }
}
@Override
public void onCaptioningEnabledChanged(boolean enabled) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_CAPTIONING_ENABLED, enabled, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(
+ MessageHandler.MSG_UPDATE_CAPTIONING_ENABLED, enabled, null);
+ }
}
@Override
public void onRepeatModeChanged(int repeatMode) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_REPEAT_MODE, repeatMode, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_REPEAT_MODE, repeatMode, null);
+ }
}
@Override
public void onShuffleModeChangedDeprecated(boolean enabled) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_SHUFFLE_MODE_DEPRECATED, enabled, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(
+ MessageHandler.MSG_UPDATE_SHUFFLE_MODE_DEPRECATED, enabled, null);
+ }
}
@Override
public void onShuffleModeChanged(int shuffleMode) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_SHUFFLE_MODE, shuffleMode, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(
+ MessageHandler.MSG_UPDATE_SHUFFLE_MODE, shuffleMode, null);
+ }
}
@Override
public void onExtrasChanged(Bundle extras) throws RemoteException {
- mHandler.post(MessageHandler.MSG_UPDATE_EXTRAS, extras, null);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ callback.postToHandler(MessageHandler.MSG_UPDATE_EXTRAS, extras, null);
+ }
}
@Override
public void onVolumeInfoChanged(ParcelableVolumeInfo info) throws RemoteException {
- PlaybackInfo pi = null;
- if (info != null) {
- pi = new PlaybackInfo(info.volumeType, info.audioStream, info.controlType,
- info.maxVolume, info.currentVolume);
+ MediaControllerCompat.Callback callback = mCallback.get();
+ if (callback != null) {
+ PlaybackInfo pi = null;
+ if (info != null) {
+ pi = new PlaybackInfo(info.volumeType, info.audioStream, info.controlType,
+ info.maxVolume, info.currentVolume);
+ }
+ callback.postToHandler(MessageHandler.MSG_UPDATE_VOLUME, pi, null);
}
- mHandler.post(MessageHandler.MSG_UPDATE_VOLUME, pi, null);
}
}
@@ -875,7 +969,9 @@
private static final int MSG_UPDATE_CAPTIONING_ENABLED = 11;
private static final int MSG_UPDATE_SHUFFLE_MODE = 12;
- public MessageHandler(Looper looper) {
+ boolean mRegistered = false;
+
+ MessageHandler(Looper looper) {
super(looper);
}
@@ -923,12 +1019,6 @@
break;
}
}
-
- public void post(int what, Object obj, Bundle data) {
- Message msg = obtainMessage(what, obj);
- msg.setData(data);
- msg.sendToTarget();
- }
}
}
@@ -950,23 +1040,16 @@
}
/**
- * Request that the player prepare its playback without audio focus. In other words, other
- * session can continue to play during the preparation of this session. This method can be
- * used to speed up the start of the playback. Once the preparation is done, the session
- * will change its playback state to {@link PlaybackStateCompat#STATE_PAUSED}. Afterwards,
- * {@link #play} can be called to start playback. If the preparation is not needed,
- * {@link #play} can be directly called without this method.
+ * Request that the player prepare for playback. This can decrease the time it takes to
+ * start playback when a play command is received. Preparation is not required. You can
+ * call {@link #play} without calling this method beforehand.
*/
public abstract void prepare();
/**
- * Request that the player prepare playback for a specific media id. In other words, other
- * session can continue to play during the preparation of this session. This method can be
- * used to speed up the start of the playback. Once the preparation is
- * done, the session will change its playback state to
- * {@link PlaybackStateCompat#STATE_PAUSED}. Afterwards, {@link #play} can be called to
- * start playback. If the preparation is not needed, {@link #playFromMediaId} can
- * be directly called without this method.
+ * Request that the player prepare playback for a specific media id. This can decrease the
+ * time it takes to start playback when a play command is received. Preparation is not
+ * required. You can call {@link #playFromMediaId} without calling this method beforehand.
*
* @param mediaId The id of the requested media.
* @param extras Optional extras that can include extra information about the media item
@@ -975,14 +1058,10 @@
public abstract void prepareFromMediaId(String mediaId, Bundle extras);
/**
- * Request that the player prepare playback for a specific search query.
- * An empty or null query should be treated as a request to prepare any
- * music. In other words, other session can continue to play during
- * the preparation of this session. This method can be used to speed up the start of the
- * playback. Once the preparation is done, the session will change its playback state to
- * {@link PlaybackStateCompat#STATE_PAUSED}. Afterwards, {@link #play} can be called to
- * start playback. If the preparation is not needed, {@link #playFromSearch} can be directly
- * called without this method.
+ * Request that the player prepare playback for a specific search query. This can decrease
+ * the time it takes to start playback when a play command is received. An empty or null
+ * query should be treated as a request to prepare any music. Preparation is not required.
+ * You can call {@link #playFromSearch} without calling this method beforehand.
*
* @param query The search query.
* @param extras Optional extras that can include extra information
@@ -991,13 +1070,9 @@
public abstract void prepareFromSearch(String query, Bundle extras);
/**
- * Request that the player prepare playback for a specific {@link Uri}.
- * In other words, other session can continue to play during the preparation of this
- * session. This method can be used to speed up the start of the playback.
- * Once the preparation is done, the session will change its playback state to
- * {@link PlaybackStateCompat#STATE_PAUSED}. Afterwards, {@link #play} can be called to
- * start playback. If the preparation is not needed, {@link #playFromUri} can be directly
- * called without this method.
+ * Request that the player prepare playback for a specific {@link Uri}. This can decrease
+ * the time it takes to start playback when a play command is received. Preparation is not
+ * required. You can call {@link #playFromUri} without calling this method beforehand.
*
* @param uri The URI of the requested media.
* @param extras Optional extras that can include extra information about the media item
@@ -1310,8 +1385,6 @@
try {
mBinder.asBinder().linkToDeath(callback, 0);
mBinder.registerCallbackListener((IMediaControllerCallback) callback.mCallbackObj);
- callback.setHandler(handler);
- callback.mRegistered = true;
} catch (RemoteException e) {
Log.e(TAG, "Dead object in registerCallback.", e);
callback.onSessionDestroyed();
@@ -1327,7 +1400,6 @@
mBinder.unregisterCallbackListener(
(IMediaControllerCallback) callback.mCallbackObj);
mBinder.asBinder().unlinkToDeath(callback, 0);
- callback.mRegistered = false;
} catch (RemoteException e) {
Log.e(TAG, "Dead object in unregisterCallback.", e);
}
@@ -1831,7 +1903,6 @@
MediaControllerCompatApi21.registerCallback(
mControllerObj, callback.mCallbackObj, handler);
if (mExtraBinder != null) {
- callback.setHandler(handler);
ExtraCallback extraCallback = new ExtraCallback(callback);
mCallbackMap.put(callback, extraCallback);
callback.mHasExtraCallback = true;
@@ -1841,7 +1912,6 @@
Log.e(TAG, "Dead object in registerCallback.", e);
}
} else {
- callback.setHandler(handler);
synchronized (mPendingCallbacks) {
mPendingCallbacks.add(callback);
}
@@ -2102,21 +2172,9 @@
}
}
- private static class ExtraCallback extends IMediaControllerCallback.Stub {
- private Callback mCallback;
-
+ private static class ExtraCallback extends Callback.StubCompat {
ExtraCallback(Callback callback) {
- mCallback = callback;
- }
-
- @Override
- public void onEvent(final String event, final Bundle extras) throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onSessionEvent(event, extras);
- }
- });
+ super(callback);
}
@Override
@@ -2126,17 +2184,6 @@
}
@Override
- public void onPlaybackStateChanged(final PlaybackStateCompat state)
- throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onPlaybackStateChanged(state);
- }
- });
- }
-
- @Override
public void onMetadataChanged(MediaMetadataCompat metadata) throws RemoteException {
// Will not be called.
throw new AssertionError();
@@ -2155,47 +2202,6 @@
}
@Override
- public void onCaptioningEnabledChanged(final boolean enabled) throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onCaptioningEnabledChanged(enabled);
- }
- });
- }
-
- @Override
- public void onRepeatModeChanged(final int repeatMode) throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onRepeatModeChanged(repeatMode);
- }
- });
- }
-
- @Override
- public void onShuffleModeChangedDeprecated(final boolean enabled)
- throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onShuffleModeChanged(enabled);
- }
- });
- }
-
- @Override
- public void onShuffleModeChanged(final int shuffleMode) throws RemoteException {
- mCallback.mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onShuffleModeChanged(shuffleMode);
- }
- });
- }
-
- @Override
public void onExtrasChanged(Bundle extras) throws RemoteException {
// Will not be called.
throw new AssertionError();
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 654e7bc..aaf0a62 100644
--- a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -979,21 +979,16 @@
}
/**
- * Override to handle requests to prepare playback. During the preparation, a session
- * should not hold audio focus in order to allow other session play seamlessly.
- * The state of playback should be updated to {@link PlaybackStateCompat#STATE_PAUSED}
- * after the preparation is done.
+ * Override to handle requests to prepare playback. Override {@link #onPlay} to handle
+ * requests for starting playback.
*/
public void onPrepare() {
}
/**
* Override to handle requests to prepare for playing a specific mediaId that was provided
- * by your app. During the preparation, a session should not hold audio focus in order to
- * allow other session play seamlessly. The state of playback should be updated to
- * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback
- * of the prepared content should start in the implementation of {@link #onPlay}. Override
- * {@link #onPlayFromMediaId} to handle requests for starting playback without preparation.
+ * by your app. Override {@link #onPlayFromMediaId} to handle requests for starting
+ * playback.
*/
public void onPrepareFromMediaId(String mediaId, Bundle extras) {
}
@@ -1001,24 +996,17 @@
/**
* Override to handle requests to prepare playback from a search query. An
* empty query indicates that the app may prepare any music. The
- * implementation should attempt to make a smart choice about what to
- * play. During the preparation, a session should not hold audio focus in order to allow
- * other session play seamlessly. The state of playback should be updated to
- * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done.
- * The playback of the prepared content should start in the implementation of
- * {@link #onPlay}. Override {@link #onPlayFromSearch} to handle requests for
- * starting playback without preparation.
+ * implementation should attempt to make a smart choice about what to play.
+ * Override {@link #onPlayFromSearch} to handle requests
+ * for starting playback.
*/
public void onPrepareFromSearch(String query, Bundle extras) {
}
/**
* Override to handle requests to prepare a specific media item represented by a URI.
- * During the preparation, a session should not hold audio focus in order to allow other
- * session play seamlessly. The state of playback should be updated to
- * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback of
- * the prepared content should start in the implementation of {@link #onPlay}. Override
- * {@link #onPlayFromUri} to handle requests for starting playback without preparation.
+ * Override {@link #onPlayFromUri} to handle requests
+ * for starting playback.
*/
public void onPrepareFromUri(Uri uri, Bundle extras) {
}
diff --git a/media-compat/lint-baseline.xml b/media-compat/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/media-compat/lint-baseline.xml
+++ b/media-compat/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/media-compat/res-public/values/public_styles.xml b/media-compat/res-public/values/public_styles.xml
new file mode 100644
index 0000000..9113f6e
--- /dev/null
+++ b/media-compat/res-public/values/public_styles.xml
@@ -0,0 +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.
+ -->
+
+<!-- Definitions of styles to be exposed as public -->
+<resources>
+ <public type="style" name="TextAppearance.Compat.Notification.Media"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Title.Media"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Info.Media"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Time.Media"/>
+ <public type="style" name="TextAppearance.Compat.Notification.Line2.Media"/>
+</resources>
diff --git a/media-compat/res/layout/notification_media_action.xml b/media-compat/res/layout/notification_media_action.xml
new file mode 100644
index 0000000..f71acdd
--- /dev/null
+++ b/media-compat/res/layout/notification_media_action.xml
@@ -0,0 +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.
+-->
+
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?android:attr/borderlessButtonStyle"
+ android:id="@+id/action0"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_weight="1"
+ android:gravity="center"/>
\ No newline at end of file
diff --git a/media-compat/res/layout/notification_media_cancel_action.xml b/media-compat/res/layout/notification_media_cancel_action.xml
new file mode 100644
index 0000000..b0b50b4
--- /dev/null
+++ b/media-compat/res/layout/notification_media_cancel_action.xml
@@ -0,0 +1,29 @@
+<?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.
+ -->
+
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ style="?android:attr/borderlessButtonStyle"
+ android:id="@+id/cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_weight="1"
+ android:src="@android:drawable/ic_menu_close_clear_cancel"
+ android:gravity="center"
+ android:visibility="gone"/>
\ No newline at end of file
diff --git a/media-compat/res/layout/notification_template_big_media.xml b/media-compat/res/layout/notification_template_big_media.xml
new file mode 100644
index 0000000..8dd93dc
--- /dev/null
+++ b/media-compat/res/layout/notification_template_big_media.xml
@@ -0,0 +1,60 @@
+<?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.
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="128dp"
+ >
+ <include layout="@layout/notification_template_icon_group"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ />
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true" />
+ <include layout="@layout/notification_template_lines_media"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="fill_vertical"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
+ android:layout_marginStart="@dimen/notification_large_icon_width"
+ android:layout_toLeftOf="@id/cancel_action"
+ android:layout_toStartOf="@id/cancel_action"/>
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_alignParentBottom="true"
+ android:layout_marginLeft="12dp"
+ android:layout_marginRight="12dp"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_above="@id/media_actions"
+ android:id="@+id/action_divider"
+ android:background="?android:attr/dividerHorizontal" />
+</RelativeLayout>
diff --git a/media-compat/res/layout/notification_template_big_media_custom.xml b/media-compat/res/layout/notification_template_big_media_custom.xml
new file mode 100644
index 0000000..cccda1d
--- /dev/null
+++ b/media-compat/res/layout/notification_template_big_media_custom.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="128dp"
+ >
+ <include layout="@layout/notification_template_icon_group"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ />
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"/>
+ <LinearLayout
+ android:id="@+id/notification_main_column_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/notification_large_icon_height"
+ android:layout_marginStart="@dimen/notification_large_icon_height"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:paddingTop="@dimen/notification_main_column_padding_top"
+ android:orientation="horizontal"
+ android:layout_toLeftOf="@id/cancel_action"
+ android:layout_toStartOf="@id/cancel_action">
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="8dp"
+ />
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="@dimen/notification_right_side_padding_top">
+ <DateTimeView android:id="@+id/time"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <Chronometer android:id="@+id/chronometer"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_gravity="end|bottom"
+ android:singleLine="true"
+ />
+ </FrameLayout>
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_alignParentBottom="true"
+ android:layout_marginLeft="12dp"
+ android:layout_marginRight="12dp"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_above="@id/media_actions"
+ android:id="@+id/action_divider"
+ android:background="?android:attr/dividerHorizontal" />
+</RelativeLayout>
diff --git a/media-compat/res/layout/notification_template_big_media_narrow.xml b/media-compat/res/layout/notification_template_big_media_narrow.xml
new file mode 100644
index 0000000..ca8e289
--- /dev/null
+++ b/media-compat/res/layout/notification_template_big_media_narrow.xml
@@ -0,0 +1,68 @@
+<?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.
+ -->
+
+<!-- Layout to be used with only max 3 actions. It has a much larger picture at the left side-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="128dp"
+ >
+ <ImageView android:id="@+id/icon"
+ android:layout_width="128dp"
+ android:layout_height="128dp"
+ android:scaleType="centerCrop"
+ />
+
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"/>
+
+ <include layout="@layout/notification_template_lines_media"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="128dp"
+ android:layout_marginStart="128dp"
+ android:layout_toLeftOf="@id/cancel_action"
+ android:layout_toStartOf="@id/cancel_action"/>
+
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_toRightOf="@id/icon"
+ android:layout_toEndOf="@id/icon"
+ android:layout_alignParentBottom="true"
+ android:layout_marginLeft="12dp"
+ android:layout_marginRight="12dp"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_toRightOf="@id/icon"
+ android:layout_toEndOf="@id/icon"
+ android:layout_above="@id/media_actions"
+ android:id="@+id/action_divider"
+ android:background="?android:attr/dividerHorizontal" />
+</RelativeLayout>
diff --git a/media-compat/res/layout/notification_template_big_media_narrow_custom.xml b/media-compat/res/layout/notification_template_big_media_narrow_custom.xml
new file mode 100644
index 0000000..db78467
--- /dev/null
+++ b/media-compat/res/layout/notification_template_big_media_narrow_custom.xml
@@ -0,0 +1,115 @@
+<?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.
+ -->
+
+<!-- Layout to be used with only max 3 actions. It has a much larger picture at the left side-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="128dp"
+ >
+ <ImageView android:id="@+id/icon"
+ android:layout_width="128dp"
+ android:layout_height="128dp"
+ android:scaleType="centerCrop"
+ />
+
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"/>
+
+ <LinearLayout
+ android:id="@+id/notification_main_column_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="128dp"
+ android:layout_marginStart="128dp"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:paddingTop="@dimen/notification_main_column_padding_top"
+ android:orientation="horizontal"
+ android:layout_toLeftOf="@id/cancel_action"
+ android:layout_toStartOf="@id/cancel_action">
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/notification_media_narrow_margin"
+ android:layout_marginStart="@dimen/notification_media_narrow_margin"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="8dp"/>
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="@dimen/notification_right_side_padding_top">
+ <DateTimeView android:id="@+id/time"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <Chronometer android:id="@+id/chronometer"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_gravity="end|bottom"
+ android:singleLine="true"
+ />
+ </FrameLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_toRightOf="@id/icon"
+ android:layout_toEndOf="@id/icon"
+ android:layout_alignParentBottom="true"
+ android:layout_marginLeft="12dp"
+ android:layout_marginRight="12dp"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_toRightOf="@id/icon"
+ android:layout_toEndOf="@id/icon"
+ android:layout_above="@id/media_actions"
+ android:id="@+id/action_divider"
+ android:background="?android:attr/dividerHorizontal" />
+</RelativeLayout>
diff --git a/media-compat/res/layout/notification_template_lines_media.xml b/media-compat/res/layout/notification_template_lines_media.xml
new file mode 100644
index 0000000..385a01b
--- /dev/null
+++ b/media-compat/res/layout/notification_template_lines_media.xml
@@ -0,0 +1,112 @@
+<?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"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingRight="8dp"
+ android:paddingEnd="8dp"
+ android:paddingTop="2dp"
+ android:paddingBottom="2dp"
+ >
+ <LinearLayout
+ android:id="@+id/line1"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dp"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:orientation="horizontal"
+ >
+ <TextView android:id="@+id/title"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Title.Media"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ android:layout_weight="1"
+ />
+ <DateTimeView android:id="@+id/time"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="center"
+ android:layout_weight="0"
+ android:visibility="gone"
+ android:paddingLeft="8dp"
+ android:paddingStart="8dp"
+ />
+ <Chronometer android:id="@+id/chronometer"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="center"
+ android:layout_weight="0"
+ android:visibility="gone"
+ android:paddingLeft="8dp"
+ android:paddingStart="8dp"
+ />
+ </LinearLayout>
+ <TextView android:id="@+id/text2"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Line2.Media"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-2dp"
+ android:layout_marginBottom="-2dp"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:singleLine="true"
+ android:fadingEdge="horizontal"
+ android:ellipsize="marquee"
+ android:visibility="gone"
+ />
+ <LinearLayout
+ android:id="@+id/line3"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ >
+ <TextView android:id="@+id/text"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Media"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_gravity="center"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ />
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_weight="0"
+ android:singleLine="true"
+ android:gravity="center"
+ android:paddingLeft="8dp"
+ android:paddingStart="8dp"
+ />
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/media-compat/res/layout/notification_template_media.xml b/media-compat/res/layout/notification_template_media.xml
new file mode 100644
index 0000000..f57070a
--- /dev/null
+++ b/media-compat/res/layout/notification_template_media.xml
@@ -0,0 +1,51 @@
+<?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"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:orientation="horizontal"
+ >
+ <include layout="@layout/notification_template_icon_group"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ />
+ <include layout="@layout/notification_template_lines_media"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical|end"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:layout_marginEnd="6dp"/>
+ <ImageView android:id="@+id/end_padder"
+ android:layout_width="6dp"
+ android:layout_height="match_parent"
+ />
+</LinearLayout>
diff --git a/media-compat/res/layout/notification_template_media_custom.xml b/media-compat/res/layout/notification_template_media_custom.xml
new file mode 100644
index 0000000..36a479c
--- /dev/null
+++ b/media-compat/res/layout/notification_template_media_custom.xml
@@ -0,0 +1,100 @@
+<?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"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:orientation="horizontal"
+ >
+ <include layout="@layout/notification_template_icon_group"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ />
+ <LinearLayout
+ android:id="@+id/notification_main_column_container"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/notification_main_column_padding_top"
+ android:minHeight="@dimen/notification_large_icon_height"
+ android:orientation="horizontal"
+ android:layout_toLeftOf="@id/cancel_action"
+ android:layout_toStartOf="@id/cancel_action">
+ <FrameLayout
+ android:id="@+id/notification_main_column"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="8dp"/>
+ <FrameLayout
+ android:id="@+id/right_side"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:paddingTop="@dimen/notification_right_side_padding_top">
+ <DateTimeView android:id="@+id/time"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <Chronometer android:id="@+id/chronometer"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Time.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_gravity="end|top"
+ android:visibility="gone"
+ />
+ <TextView android:id="@+id/info"
+ android:textAppearance="@style/TextAppearance.Compat.Notification.Info.Media"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_gravity="end|bottom"
+ android:singleLine="true"
+ />
+ </FrameLayout>
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/media_actions"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical|end"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr"
+ >
+ <!-- media buttons will be added here -->
+ </LinearLayout>
+ <include layout="@layout/notification_media_cancel_action"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:layout_marginEnd="6dp"/>
+ <ImageView android:id="@+id/end_padder"
+ android:layout_width="6dp"
+ android:layout_height="match_parent"
+ />
+</LinearLayout>
diff --git a/media-compat/res/values-v21/styles.xml b/media-compat/res/values-v21/styles.xml
new file mode 100644
index 0000000..b785197
--- /dev/null
+++ b/media-compat/res/values-v21/styles.xml
@@ -0,0 +1,33 @@
+<!--
+ ~ 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="TextAppearance.Compat.Notification.Media" >
+ <item name="android:textColor">@color/secondary_text_default_material_dark</item>
+ </style>
+
+ <style name="TextAppearance.Compat.Notification.Title.Media" >
+ <item name="android:textColor">@color/primary_text_default_material_dark</item>
+ </style>
+
+ <style name="TextAppearance.Compat.Notification.Info.Media">
+ <item name="android:textColor">@color/secondary_text_default_material_dark</item>
+ </style>
+
+ <style name="TextAppearance.Compat.Notification.Time.Media">
+ <item name="android:textColor">@color/secondary_text_default_material_dark</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/media-compat/res/values-v24/styles.xml b/media-compat/res/values-v24/styles.xml
new file mode 100644
index 0000000..31b4224
--- /dev/null
+++ b/media-compat/res/values-v24/styles.xml
@@ -0,0 +1,26 @@
+<!--
+ ~ 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>
+ <!-- Use platform styles, Media is dark again -->
+ <style name="TextAppearance.Compat.Notification.Media" />
+
+ <style name="TextAppearance.Compat.Notification.Title.Media" />
+
+ <style name="TextAppearance.Compat.Notification.Info.Media" />
+
+ <style name="TextAppearance.Compat.Notification.Time.Media" />
+</resources>
\ No newline at end of file
diff --git a/media-compat/res/values/colors.xml b/media-compat/res/values/colors.xml
new file mode 100644
index 0000000..67a2521
--- /dev/null
+++ b/media-compat/res/values/colors.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.
+ -->
+<resources>
+
+ <!-- The color of the material notification background for media notifications when no custom
+ color is specified -->
+ <color name="notification_material_background_media_default_color">#ff424242</color>
+
+</resources>
\ No newline at end of file
diff --git a/media-compat/res/values/colors_material.xml b/media-compat/res/values/colors_material.xml
new file mode 100644
index 0000000..9eea922
--- /dev/null
+++ b/media-compat/res/values/colors_material.xml
@@ -0,0 +1,26 @@
+<?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.
+ -->
+
+<!-- Colors specific to Material themes. -->
+<resources>
+
+ <!-- 100% white -->
+ <color name="primary_text_default_material_dark">#ffffffff</color>
+ <!-- 70% white -->
+ <color name="secondary_text_default_material_dark">#b3ffffff</color>
+
+</resources>
diff --git a/media-compat/res/values/config.xml b/media-compat/res/values/config.xml
new file mode 100644
index 0000000..15c4328
--- /dev/null
+++ b/media-compat/res/values/config.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.
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+
+ <integer name="cancel_button_image_alpha">127</integer>
+
+</resources>
diff --git a/media-compat/res/values/styles.xml b/media-compat/res/values/styles.xml
new file mode 100644
index 0000000..ce351a4
--- /dev/null
+++ b/media-compat/res/values/styles.xml
@@ -0,0 +1,28 @@
+<?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="TextAppearance.Compat.Notification.Media" />
+
+ <style name="TextAppearance.Compat.Notification.Title.Media" />
+
+ <style name="TextAppearance.Compat.Notification.Info.Media"/>
+
+ <style name="TextAppearance.Compat.Notification.Time.Media"/>
+
+ <style name="TextAppearance.Compat.Notification.Line2.Media" parent="TextAppearance.Compat.Notification.Info.Media"/>
+</resources>
diff --git a/paging/common/build.gradle b/paging/common/build.gradle
new file mode 100644
index 0000000..4b0dad1
--- /dev/null
+++ b/paging/common/build.gradle
@@ -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.
+ */
+
+apply plugin: 'java'
+apply plugin: 'maven'
+
+sourceCompatibility = 1.7
+// disable paging for now.
+project.ext.noDocs = true
+uploadArchives.enabled = false
+dependencies {
+ compile libs.support.annotations
+ compile project(":arch:common")
+
+ testCompile libs.junit
+ testCompile libs.mockito_core
+ compile 'com.android.support:support-annotations:25.3.1'
+ compile project(path: ':arch:common')
+ compile 'junit:junit:4.12'
+}
+
+archivesBaseName = "common"
+
+createAndroidCheckstyle(project)
diff --git a/paging/common/src/main/java/android/arch/util/paging/CountedDataSource.java b/paging/common/src/main/java/android/arch/util/paging/CountedDataSource.java
new file mode 100644
index 0000000..dd7d41c
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/CountedDataSource.java
@@ -0,0 +1,96 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
+
+import java.util.List;
+
+/**
+ * Incremental data loader for paging content when the total number of items is known.
+ * <p>
+ * All loading methods in CountedDataSource should only be called on a background thread.
+ * loadAfter and loadBefore specifically may be called in parallel with each other, if loading in
+ * both directions is required (often for prefetching).
+ * <p>
+ * Items returned from a CountedDataSource must be treated as immutable in all properties used by
+ * {@link #loadAfter(int, Object, int)} and {@link #loadBefore(int, Object, int)}. For example, if
+ * loadAfter(...User user...) is called, with <code>user.id</code> being used to load users after
+ * that user's ID, the <code>id</code> field in User must remain immutable.
+ * <p>
+ * If the loadAfter and loadBefore methods only require indices to function, CountedDataSource does
+ * not require items returned to be immutable in any way.
+ *
+ * @param <Type> Type of the items this CountedDataSource will produce.
+ */
+public abstract class CountedDataSource<Type> extends DataSourceBase {
+ /**
+ * @return The number of items in the DataSource.
+ */
+ @WorkerThread
+ public abstract int loadCount();
+
+ /**
+ * Load initial data, starting after the passed position.
+ *
+ * @param position Position just before data to be loaded. -1 is passed to request data
+ * from beginning of data source.
+ * @param pageSize Suggested number of items to load.
+ * @return List of initial items, representing data starting at position + 1. Null if the
+ * DataSource is no longer valid, and should not be queried again.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadAfterInitial(int position, int pageSize);
+
+ /**
+ * Load data after the given position / item.
+ * <p>
+ * It's valid to return a different list size than the page size, if it's easier for this data
+ * source. It is generally safer to increase number loaded than reduce.
+ *
+ * @param currentEndIndex Load items after this index, starting with currentEndIndex + 1.
+ * @param currentEndItem Load items after this item, can be used for precise querying based on
+ * item contents.
+ * @param pageSize Suggested number of items to load.
+ * @return List of items, starting at position currentEndIndex + 1. Null if the data source is
+ * no longer valid, and should not be queried again.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadAfter(int currentEndIndex,
+ @NonNull Type currentEndItem, int pageSize);
+
+ /**
+ * Load data before the given position / item.
+ * <p>
+ * It's valid to return a different list size than the page size, if it's easier for this data
+ * source. It is generally safer to increase number loaded than reduce.
+ *
+ * @param currentBeginIndex Load items before this index, starting with currentBeginIndex - 1.
+ * @param currentBeginItem Load items after this item, can be used for precise querying based on
+ * item contents.
+ * @param pageSize Suggested number of items to load.
+ * @return List of items, in descending order, starting at position currentBeginIndex - 1.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadBefore(int currentBeginIndex,
+ @NonNull Type currentBeginItem, int pageSize);
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/DataSource.java b/paging/common/src/main/java/android/arch/util/paging/DataSource.java
new file mode 100644
index 0000000..e6af7e7
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/DataSource.java
@@ -0,0 +1,83 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
+
+import java.util.List;
+
+
+/**
+ * Incremental data loader for list paging.
+ *
+ * @param <Key> Type of the key used to load initial data.
+ * @param <Type> Type of the items this CountedDataSource will produce.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class DataSource<Key, Type> extends DataSourceBase {
+
+ /**
+ * Get key from item.
+ *
+ * @param item The item.
+ * @return The Key.
+ */
+ public abstract Key getKey(@NonNull Type item);
+
+ /**
+ * Load initial data, starting after the passed key.
+ *
+ * @param key Key just before the data to be loaded.
+ * @param pageSize Suggested number of items to load.
+ * @return List of initial items, representing data starting at key + 1. Null if the
+ * DataSource is no longer valid, and should not be queried again.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadAfterInitial(@Nullable Key key, int pageSize);
+
+ /**
+ * Load data, starting after the passed item.
+ *
+ * @param currentEndItem Load items after this item, can be used for precise querying based on
+ * item contents.
+ * @param pageSize Suggested number of items to load.
+ * @return List of initial items, representing data starting at key + 1. Null if the
+ * DataSource is no longer valid, and should not be queried again.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadAfter(@NonNull Type currentEndItem, int pageSize);
+
+ /**
+ * Load data, before the passed item.
+ *
+ * @param currentBeginItem Load items after this item, can be used for precise querying based on
+ * item contents.
+ * @param pageSize Suggested number of items to load.
+ * @return List of initial items, representing data starting at key + 1. Null if the
+ * DataSource is no longer valid, and should not be queried again.
+ */
+ @WorkerThread
+ @Nullable
+ public abstract List<Type> loadBefore(@NonNull Type currentBeginItem, int pageSize);
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/DataSourceBase.java b/paging/common/src/main/java/android/arch/util/paging/DataSourceBase.java
new file mode 100644
index 0000000..50d245d
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/DataSourceBase.java
@@ -0,0 +1,91 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.AnyThread;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Data Source base class, with common invalidation functionality.
+ */
+class DataSourceBase {
+ public interface InvalidatedCallback {
+ /*
+ * Called when the data backing the list has become invalid. This callback is typically used
+ * to signal that a new data source is needed, if the data source remains in use.
+ * <p>
+ * This callback will be invoked on the thread that calls {@link #invalidate()}. It is valid
+ * for the data source to invalidate itself during its load methods, or for an outside
+ * source to invalidate it.
+ */
+ @AnyThread
+ void onInvalidated();
+ }
+
+ private AtomicBoolean mInvalid = new AtomicBoolean(false);
+
+ private CopyOnWriteArrayList<InvalidatedCallback> mOnInvalidatedCallbacks =
+ new CopyOnWriteArrayList<>();
+ /**
+ * Add a callback to invoke when the DataSource is first invalidated.
+ * <p>
+ * Once invalidated, a data source will not become valid again.
+ * <p>
+ * A data source will only invoke its callbacks once - the first time {@link #invalidate()}
+ * is called, on that thread.
+ *
+ * @param onInvalidatedCallback The callback, will be invoked on thread that
+ * {@link #invalidate()} is called on.
+ */
+ @AnyThread
+ public void addInvalidatedCallback(InvalidatedCallback onInvalidatedCallback) {
+ mOnInvalidatedCallbacks.add(onInvalidatedCallback);
+ }
+
+ /**
+ * Remove a previously added invalidate callback.
+ *
+ * @param onInvalidatedCallback The previously added callback.
+ */
+ @AnyThread
+ public void removeInvalidatedCallback(InvalidatedCallback onInvalidatedCallback) {
+ mOnInvalidatedCallbacks.remove(onInvalidatedCallback);
+ }
+
+ /**
+ * Signal the data source to stop loading, and notify its callback.
+ * <p>
+ * If invalidate has already been called, this method does nothing.
+ */
+ @AnyThread
+ public void invalidate() {
+ if (mInvalid.compareAndSet(false, true)) {
+ for (InvalidatedCallback callback : mOnInvalidatedCallbacks) {
+ callback.onInvalidated();
+ }
+ }
+ }
+
+ /**
+ * @return True if the data source is invalid, and can no longer return data.
+ */
+ public boolean isInvalid() {
+ return mInvalid.get();
+ }
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/LazyList.java b/paging/common/src/main/java/android/arch/util/paging/LazyList.java
new file mode 100644
index 0000000..706df63
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/LazyList.java
@@ -0,0 +1,315 @@
+/*
+ * 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.arch.util.paging;
+
+import android.arch.core.internal.SafeIterableMap;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * Lazy-loading list, which defaults each entry to be null and pages content in on-demand,
+ * with prefetching.
+ *
+ * When a list item is read as null, content is paged in from the CountedDataSource asynchronously.
+ *
+ * This class is NOT thread safe. All accesses to get()/access() and mutations should be made on the
+ * thread defined by the mainThreadExecutor.
+ *
+ * @param <Type> Data type held by this list.
+ */
+public class LazyList<Type> extends PagerBase<Type> {
+ private int mMissedMinIndex = Integer.MAX_VALUE;
+ private int mMissedMaxIndex = -1;
+
+ private int mStartPos; // position is inclusive
+ private final int mSize;
+
+ // last position accessed via get()
+ private volatile int mLastAccessed;
+
+ private SafeIterableMap<ChangeCallback,
+ ChangeCallbackWrapper> mCallbacks = new SafeIterableMap<>();
+
+ private CountedDataSource<Type> mCountedDataSource;
+
+ @WorkerThread
+ public LazyList(@NonNull CountedDataSource<Type> countedDataSource,
+ @NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ @NonNull ListConfig config) {
+ super(mainThreadExecutor, backgroundThreadExecutor, config);
+ mCountedDataSource = countedDataSource;
+ mSize = mCountedDataSource.loadCount();
+ }
+
+ // ---- List ----
+
+ @Override
+ @Nullable
+ public Type get(int index) {
+ if (index < 0 || index >= mSize) {
+ throw new IndexOutOfBoundsException(index + " is out of bounds. Size:" + mSize);
+ }
+
+ mLastAccessed = index;
+
+ final boolean initialLoadComplete = mItems != null;
+
+ // note: intentionally avoid triggering prefetching, so that prefetches aren't outstanding
+ // when LazyList is passed to consumers
+
+ // prefetch
+ int minTarget = Math.max(0, index - mConfig.mPrefetchDistance);
+ int maxTarget = Math.min(mSize, index + mConfig.mPrefetchDistance);
+ if (minTarget < mMissedMinIndex) {
+ mMissedMinIndex = minTarget;
+ if (initialLoadComplete) {
+ loadBeforeIfNeeded();
+ }
+ }
+ if (maxTarget > mMissedMaxIndex) {
+ mMissedMaxIndex = maxTarget;
+ if (initialLoadComplete) {
+ loadAfterIfNeeded();
+ }
+ }
+
+ if (initialLoadComplete) {
+ return access(index);
+ } else {
+ triggerInitialLoad(getInitialLoadPositionFor(index));
+ return null;
+ }
+ }
+
+ @Override
+ public int size() {
+ return mSize;
+ }
+
+ @Override
+ @Nullable
+ public Type access(int index) {
+ if (index < 0 || index >= mSize) {
+ throw new IndexOutOfBoundsException(index + " is out of bounds. Size:" + mSize);
+ }
+ if (mItems == null || index < mStartPos || index >= mStartPos + mItems.size()) {
+ return null;
+ } else {
+ return mItems.get(index - mStartPos);
+ }
+ }
+
+ // ---- Initial data ----
+
+ private int getInitialLoadPositionFor(int index) {
+ return Math.max(-1, index - mConfig.mPageSize / 2);
+ }
+
+ /**
+ * @return Suggested initial load position for a new LazyList to load the initial state at.
+ */
+ public int getInitialLoadPosition() {
+ return getInitialLoadPositionFor(mLastAccessed);
+ }
+
+ @MainThread
+ private void triggerInitialLoad(final int loadAfterPos) {
+ if (mInitialized) {
+ return;
+ }
+ mInitialized = true;
+ mBackgroundThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+ // find a good start point to center the index
+ final List<Type> load = mCountedDataSource.loadAfterInitial(
+ loadAfterPos, mConfig.mPageSize);
+
+ if (load != null) {
+ mMainThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+ setInitialDataAndDispatch(loadAfterPos, load);
+ }
+ });
+ } else {
+ freeze();
+ }
+ }
+ });
+ }
+
+ /**
+ *
+ * @param loadAfterPos Position to pass to {@link CountedDataSource#loadAfterInitial(int, int)}
+ * for warmup.
+ * @return True on success.
+ */
+ public boolean internalInit(int loadAfterPos) {
+ List<Type> load = mCountedDataSource.loadAfterInitial(loadAfterPos, mConfig.mPageSize);
+ if (load != null) {
+ setInitialDataAndDispatch(loadAfterPos, load);
+ mInitialized = true;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void setInitialDataAndDispatch(int loadAfterPos, List<Type> items) {
+ mStartPos = loadAfterPos + 1;
+ setInitialData(items);
+ dispatchChange();
+ }
+
+ // ---- Callback ----
+
+ /**
+ * Adds a change callback, to observe when new content is loaded into the list. The callback is
+ * invoked once nulls in the list are loaded from the data source.
+ *
+ * @param callback The callback, invoked on the main thread.
+ *
+ * @see #removeCallback(ChangeCallback)
+ */
+ @SuppressWarnings("WeakerAccess")
+ public void addCallback(ChangeCallback callback) {
+ int start = mStartPos;
+ int end = mStartPos + (mItems == null ? 0 : mItems.size());
+ ChangeCallbackWrapper wrapper = new ChangeCallbackWrapper(callback, start, end);
+ // do not notify the latest data so the observer can distinguish whether the data has
+ // really changed or not.
+ mCallbacks.putIfAbsent(callback, wrapper);
+ }
+
+ /**
+ * Removes a previously added change callback.
+ *
+ * @param callback The callback, invoked on the main thread.
+ *
+ * @see #addCallback(ChangeCallback)
+ */
+ @SuppressWarnings("WeakerAccess")
+ public void removeCallback(ChangeCallback callback) {
+ mCallbacks.remove(callback);
+ }
+
+ private void dispatchChange() {
+ int start = mStartPos;
+ int end = mStartPos + mItems.size();
+ for (Map.Entry<ChangeCallback, ChangeCallbackWrapper> mCallback : mCallbacks) {
+ mCallback.getValue().dispatchLoaded(start, end);
+ }
+ }
+
+ /**
+ * Callback that signals when new content is loaded in the list.
+ */
+ public abstract static class ChangeCallback {
+ /**
+ * Called when new content is loaded into the LazyList.
+ *
+ * @param start Start index of the newly loaded items.
+ * @param count Number of newly loaded items.
+ */
+ public abstract void onLoaded(int start, int count);
+ }
+
+ private static class ChangeCallbackWrapper {
+ private final ChangeCallback mChangeCallback;
+ private int mKnownStart;
+ private int mKnownEnd;
+
+ ChangeCallbackWrapper(@NonNull ChangeCallback changeCallback,
+ int knownStart, int knownEnd) {
+ mChangeCallback = changeCallback;
+ mKnownStart = knownStart;
+ mKnownEnd = knownEnd;
+ }
+
+ void dispatchLoaded(int currentStart, int currentEnd) {
+ if (currentEnd > mKnownEnd) {
+ mChangeCallback.onLoaded(mKnownEnd, currentEnd - mKnownEnd);
+ mKnownEnd = currentEnd;
+ }
+ if (currentStart < mKnownStart) {
+ mChangeCallback.onLoaded(currentStart, mKnownStart - currentStart);
+ mKnownStart = currentStart;
+ }
+ }
+ }
+
+
+ // ---- PagerBase implementation ----
+
+ @Override
+ void onItemsPrepended(int count) {
+ mStartPos -= count;
+ dispatchChange();
+ }
+
+ @Override
+ void onItemsAppended(int count) {
+ dispatchChange();
+ }
+
+ @Override
+ void loadBeforeIfNeeded() {
+ if (mMissedMinIndex >= mStartPos) {
+ // done loading
+ mMissedMinIndex = Integer.MAX_VALUE;
+ } else {
+ // not done, resume loading
+ loadBefore(mStartPos);
+ }
+ }
+
+ @Override
+ void loadAfterIfNeeded() {
+ if (mMissedMaxIndex <= mStartPos + mItems.size() - 1) {
+ // done loading
+ mMissedMaxIndex = 0;
+ } else {
+ // not done, resume loading
+ loadAfter(mStartPos + mItems.size() - 1);
+ }
+ }
+
+ @Nullable
+ @Override
+ List<Type> loadBeforeImpl(int position, Type item) {
+ return mCountedDataSource.loadBefore(position, item, mConfig.mPageSize);
+ }
+
+ @Nullable
+ @Override
+ List<Type> loadAfterImpl(int position, Type item) {
+ return mCountedDataSource.loadAfter(position, item, mConfig.mPageSize);
+ }
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/ListConfig.java b/paging/common/src/main/java/android/arch/util/paging/ListConfig.java
new file mode 100644
index 0000000..8c3777c
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/ListConfig.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.arch.util.paging;
+
+/**
+ * Configuration object for list paging. Used to inform how and when a {@link LazyList} loads
+ * content from a {@link CountedDataSource}.
+ */
+public class ListConfig {
+ final int mPageSize;
+ final int mPrefetchDistance;
+
+ ListConfig(int pageSize, int prefetchDistance) {
+ mPageSize = pageSize;
+ mPrefetchDistance = prefetchDistance;
+ }
+
+ /**
+ * Creates a {@link Builder} that can be used to construct a {@link ListConfig}.
+ *
+ * @return a new {@link Builder}.
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Builder class for {@link ListConfig}.
+ * <p>
+ * You must at minimum specify a {@link Builder#pageSize(int)}.
+ */
+ public static class Builder {
+ private int mPageSize = -1;
+ private int mPrefetchDistance = -1;
+
+ /**
+ * Defines the number of items loaded at once from the DataSource.
+ * <p>
+ * Should be several times the number of visible items onscreen.
+ */
+ public Builder pageSize(int pageSize) {
+ this.mPageSize = pageSize;
+ return this;
+ }
+
+ /**
+ * Defines how far from the edge of loaded content an access must be to trigger further
+ * loading. Defaults to page size.
+ * <p>
+ * A value of 0 indicates that no list items will be loaded before they are first requested.
+ * <p>
+ * Should be several times the number of visible items onscreen.
+ */
+ public Builder prefetchDistance(int prefetchDistance) {
+ this.mPrefetchDistance = prefetchDistance;
+ return this;
+ }
+
+ /**
+ * Creates a {@link ListConfig} with the given parameters.
+ *
+ * @return A new ListConfig.
+ */
+ public ListConfig create() {
+ if (mPageSize < 1) {
+ throw new IllegalArgumentException("Page size must be a positive number");
+ }
+ if (mPrefetchDistance < 0) {
+ mPrefetchDistance = mPageSize;
+ }
+ return new ListConfig(mPageSize, mPrefetchDistance);
+ }
+ }
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/PagedList.java b/paging/common/src/main/java/android/arch/util/paging/PagedList.java
new file mode 100644
index 0000000..283b062
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/PagedList.java
@@ -0,0 +1,321 @@
+/*
+ * 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.arch.util.paging;
+
+import android.arch.core.internal.SafeIterableMap;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * Lazy loading list that starts at size 0, and expands its size by loading pages
+ * asynchronously from a DataSource.
+ *
+ * @param <Type> Data type held by this list.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class PagedList<Type> extends PagerBase<Type> {
+ private static final int INVALID_DATA_POSITION = -1;
+
+ // Distance from front of list that should be prefetched.
+ private int mMinTarget = 0;
+
+ // Distance from tail of list that should be prefetched.
+ private int mMaxTarget = 0;
+
+ /**
+ * Stores the delta between the anchor and the most recently accessed item.
+ *
+ * The most recently accessed item's index can be referenced
+ * by adding this value to {@link #mAnchor}.
+ */
+ private volatile int mInterestedKeyOffset = -1;
+
+ // anchor position used to calculate deltas based on what revision observers last saw
+ private int mAnchor = 0;
+
+ private DataSource<Object, Type> mDataSource;
+
+ private SafeIterableMap<ChangeCallback,
+ ChangeCallbackWrapper> mCallbacks = new SafeIterableMap<>();
+
+ @WorkerThread
+ public <Key> PagedList(@NonNull DataSource<Key, Type> dataSource,
+ @NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ @NonNull ListConfig config) {
+ super(mainThreadExecutor, backgroundThreadExecutor, config);
+ if (config.mPrefetchDistance <= 0) {
+ // TODO: catch this in PagedListAdapterHelper too
+ throw new IllegalArgumentException("PagedList requires a positive prefetch distance"
+ + " to be able to trigger page loading.");
+ }
+
+ mDataSource = (DataSource<Object, Type>) dataSource;
+ }
+
+ // ---- List ----
+
+ @Override
+ @NonNull
+ public Type get(int index) {
+ if (index < 0 || index >= size()) {
+ throw new IllegalArgumentException();
+ }
+ final int prefetchDistance = mConfig.mPrefetchDistance;
+ int minTarget = prefetchDistance - index;
+ if (minTarget > mMinTarget) {
+ mMinTarget = minTarget;
+ loadBeforeIfNeeded();
+ }
+ int maxTarget = index + prefetchDistance - size();
+ if (maxTarget > mMaxTarget) {
+ mMaxTarget = maxTarget;
+ loadAfterIfNeeded();
+ }
+
+ mInterestedKeyOffset = index - mAnchor;
+
+ return mItems.get(index);
+ }
+
+ @Override
+ @NonNull
+ public Type access(int index) {
+ if (index < 0 || index >= size()) {
+ throw new IllegalArgumentException();
+ }
+ return mItems.get(index);
+ }
+
+ @Override
+ public int size() {
+ return mItems == null ? 0 : mItems.size();
+ }
+
+
+ // ---- Initial data ----
+
+ /**
+ * Post a background task to execute loadAfter(null), and initialize the PagedList
+ * with its result.
+ */
+ @MainThread
+ public <Key> void triggerInitialLoad(final Key initialLoadKey) {
+ if (mInitialized) {
+ return;
+ }
+ mInitialized = true;
+ mBackgroundThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+
+ final List<Type> initialData =
+ mDataSource.loadAfterInitial(initialLoadKey, mConfig.mPageSize);
+ if (initialData != null) {
+ mMainThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+ setInitialDataAndDispatch(initialData);
+ }
+ });
+ } else {
+ freeze();
+ }
+ }
+ });
+ }
+
+ /**
+ * Initialize the PagedList from the most-recently-accessed position information from the 'old'
+ * PagedList.
+ *
+ * This may be called on a background thread, and will only access immutable-once-invalid state
+ * in the old list, plus the volatile mInterestedKeyOffset field.
+ */
+ @WorkerThread
+ public boolean initializeFrom(PagedList<Type> old) {
+ // Note: even though old may be actively used on the foreground thread, we carefully only
+ // access parts that are immutable once old is invalid:
+ // mAnchor, and mItems (since no further prepends/appends can occur)
+
+ int targetIndex = (old.mAnchor + old.mInterestedKeyOffset);
+ int loadAfterIndex = Math.max(0, targetIndex - mConfig.mPageSize / 2) - 1;
+
+ Object loadAfterKey = null;
+ if (loadAfterIndex >= 0) {
+ Type loadAfterItem = old.mItems.get(loadAfterIndex);
+ loadAfterKey = mDataSource.getKey(loadAfterItem);
+ }
+
+ List<Type> initialData =
+ mDataSource.loadAfterInitial(loadAfterKey, mConfig.mPageSize);
+ if (initialData != null) {
+ setInitialDataAndDispatch(initialData);
+ mInitialized = true;
+ return true;
+ } else {
+ freeze();
+ return false;
+ }
+ }
+
+ // ---- Callback ----
+
+ private void setInitialDataAndDispatch(List<Type> items) {
+ // NOTE: while it's possible to prefetch given initial data, but we defer first prefetch
+ // until a consumer triggers it, so that the list is immutable until get() is called.
+
+ setInitialData(items);
+ dispatchChange();
+ }
+
+ /**
+ * Adds a change callback, to observe when new content is loaded into the list. The callback is
+ * invoked when the list has newly loaded content prepended, or appended.
+ *
+ * @param callback The callback, invoked on the main thread.
+ *
+ * @see #removeCallback(ChangeCallback)
+ */
+ @SuppressWarnings("WeakerAccess")
+ public void addCallback(ChangeCallback callback) {
+ ChangeCallbackWrapper wrapper = new ChangeCallbackWrapper(callback, mAnchor, size());
+ // do not notify the latest data so the observer can distinguish whether the data has
+ // really changed or not.
+ mCallbacks.putIfAbsent(callback, wrapper);
+ }
+
+ /**
+ * Removes a previously added change callback.
+ *
+ * @param callback The callback, invoked on the main thread.
+ *
+ * @see #addCallback(ChangeCallback)
+ */
+ @SuppressWarnings("WeakerAccess")
+ public void removeCallback(ChangeCallback callback) {
+ mCallbacks.remove(callback);
+ }
+
+ private void dispatchChange() {
+ int anchor = mAnchor;
+ int size = mItems.size();
+ for (Map.Entry<ChangeCallback, ChangeCallbackWrapper> mCallback : mCallbacks) {
+ mCallback.getValue().dispatchLoaded(anchor, size);
+ }
+ }
+
+ /**
+ * Callback that signals when new content is loaded in the list.
+ */
+ public abstract static class ChangeCallback {
+ /**
+ * Called when new content is inserted into the PagedList.
+ *
+ * @param start Index where the items have been inserted.
+ * @param count Number of newly inserted items.
+ */
+ public abstract void onInserted(int start, int count);
+ }
+
+ static class ChangeCallbackWrapper {
+ final ChangeCallback mChangeCallback;
+ private int mKnownAnchor;
+ private int mKnownSize;
+
+ ChangeCallbackWrapper(@NonNull ChangeCallback changeCallback,
+ int knownAnchor, int knownSize) {
+ mChangeCallback = changeCallback;
+ mKnownAnchor = knownAnchor;
+ mKnownSize = knownSize;
+ }
+
+ void dispatchLoaded(int currentAnchor, int currentSize) {
+ if (currentAnchor > mKnownAnchor) {
+ int itemsAddedToFront = currentAnchor - mKnownAnchor;
+ mChangeCallback.onInserted(0, itemsAddedToFront);
+ mKnownSize += itemsAddedToFront;
+ mKnownAnchor = currentAnchor;
+ }
+ if (mKnownSize < currentSize) {
+ int itemsAddedToBack = currentSize - mKnownSize;
+ mChangeCallback.onInserted(mKnownSize, itemsAddedToBack);
+ mKnownSize += itemsAddedToBack;
+ }
+ }
+ }
+
+
+ // ---- PagerBase implementation ----
+
+ @Override
+ void onItemsPrepended(int count) {
+ if (mMinTarget > 0) {
+ mMinTarget -= count;
+ }
+ mAnchor += count;
+ dispatchChange();
+ }
+
+ @Override
+ void onItemsAppended(int count) {
+ if (mMaxTarget > 0) {
+ mMaxTarget -= count;
+ }
+ dispatchChange();
+ }
+
+ @Override
+ void loadBeforeIfNeeded() {
+ if (mMinTarget > 0) {
+ loadBefore(INVALID_DATA_POSITION);
+ }
+ }
+
+ @Override
+ void loadAfterIfNeeded() {
+ if (mMaxTarget > 0) {
+ loadAfter(INVALID_DATA_POSITION);
+ }
+ }
+
+ @Nullable
+ @Override
+ List<Type> loadBeforeImpl(int position, Type item) {
+ return mDataSource.loadBefore(item, mConfig.mPageSize);
+ }
+
+ @Nullable
+ @Override
+ List<Type> loadAfterImpl(int position, Type item) {
+ return mDataSource.loadAfter(item, mConfig.mPageSize);
+ }
+}
diff --git a/paging/common/src/main/java/android/arch/util/paging/PagerBase.java b/paging/common/src/main/java/android/arch/util/paging/PagerBase.java
new file mode 100644
index 0000000..d53446d
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/util/paging/PagerBase.java
@@ -0,0 +1,211 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @param <Type> Data type held by this list.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class PagerBase<Type> {
+ List<Type> mItems;
+
+ private boolean mLoadBefore = false;
+ private boolean mLoadAfter = false;
+
+ /**
+ * Gets an item from the specified index, and loads content appropriately as a side effect.
+ * Must be between 0 and {@link #size()}.
+ *
+ * @param index Index of item to return.
+ * @return Item requested.
+ */
+ public abstract Type get(int index);
+
+ /**
+ * Gets an item from the specified index, but without side effects. Must be between 0 and
+ * {@link #size()}.
+ *
+ * @param index Index of item to return.
+ * @return Item requested.
+ */
+ public abstract Type access(int index);
+
+ /**
+ * @return Size of list.
+ */
+ public abstract int size();
+
+ boolean mInitialized;
+
+ @NonNull
+ final Executor mMainThreadExecutor;
+ @NonNull
+ final Executor mBackgroundThreadExecutor;
+
+ @Nullable
+ abstract List<Type> loadBeforeImpl(int position, Type item);
+
+ @Nullable
+ abstract List<Type> loadAfterImpl(int position, Type item);
+
+ // trigger loadBefore if positions loaded after/before aren't good enough
+ abstract void loadBeforeIfNeeded();
+
+ abstract void loadAfterIfNeeded();
+
+ // used to communicated to list provider to issue a new version
+ abstract void onItemsPrepended(int count);
+
+ abstract void onItemsAppended(int count);
+
+ AtomicBoolean mInvalid = new AtomicBoolean(false);
+ final ListConfig mConfig;
+
+ @WorkerThread
+ PagerBase(@NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ ListConfig configuration) {
+ mConfig = configuration;
+ mMainThreadExecutor = mainThreadExecutor;
+ mBackgroundThreadExecutor = backgroundThreadExecutor;
+ }
+
+ void freeze() {
+ mInvalid.set(true);
+ }
+
+ void setInitialData(List<Type> items) {
+ mItems = new ArrayList<>(items);
+ if (mItems.size() == 0) {
+ // No data loaded, so display no data, and don't try to load more.
+ mLoadBefore = mLoadAfter = true;
+ }
+ loadAfterIfNeeded();
+ loadBeforeIfNeeded();
+ }
+
+ @MainThread
+ protected void loadBefore(final int position) {
+ if (mLoadBefore) {
+ return;
+ }
+ mLoadBefore = true;
+
+ final Type item = mItems.get(0);
+ mBackgroundThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+
+ if (mInvalid.get()) {
+ return;
+ }
+
+ final List<Type> data = loadBeforeImpl(position, item);
+ if (data != null) {
+ mMainThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+ prepend(data);
+ }
+ });
+ } else {
+ freeze();
+ }
+ }
+ });
+ }
+
+ @MainThread
+ protected void loadAfter(final int position) {
+ if (mLoadAfter) {
+ return;
+ }
+ mLoadAfter = true;
+
+ final Type item = mItems.get(mItems.size() - 1);
+ mBackgroundThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+
+ final List<Type> data = loadAfterImpl(position, item);
+ if (data != null) {
+ mMainThreadExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mInvalid.get()) {
+ return;
+ }
+ append(data);
+ }
+ });
+ } else {
+ freeze();
+ }
+ }
+ });
+ }
+
+ @MainThread
+ private void prepend(List<Type> before) {
+ final int count = before.size();
+ if (count == 0) {
+ // Nothing returned from source, stop loading in this direction
+ return;
+ }
+
+ Collections.reverse(before);
+ mItems.addAll(0, before);
+ onItemsPrepended(count);
+
+ mLoadBefore = false;
+ loadBeforeIfNeeded();
+ }
+
+ @MainThread
+ private void append(List<Type> after) {
+ final int count = after.size();
+ if (count == 0) {
+ // Nothing returned from source, stop loading in this direction
+ return;
+ }
+
+ mItems.addAll(after);
+ onItemsAppended(count);
+
+ mLoadAfter = false;
+ loadAfterIfNeeded();
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/LazyListTest.java b/paging/common/src/test/java/android/arch/util/paging/LazyListTest.java
new file mode 100644
index 0000000..7bede2e
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/LazyListTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.arch.util.paging;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
+@RunWith(JUnit4.class)
+public class LazyListTest {
+ private TestExecutor mMainThread = new TestExecutor();
+ private TestExecutor mBackgroundThread = new TestExecutor();
+ private TestCountedDataSource mDataSource;
+
+ private LazyList.ChangeCallback mChangeCallback = Mockito.mock(LazyList.ChangeCallback.class);
+
+ private LazyList<User> createLazyList(int pageSize, int prefetchCount) {
+ LazyList<User> lazyList = new LazyList<>(mDataSource, mMainThread, mBackgroundThread,
+ new ListConfig(pageSize, prefetchCount));
+ lazyList.addCallback(mChangeCallback);
+ return lazyList;
+ }
+
+ @Before
+ public void setup() {
+ mDataSource = new TestCountedDataSource();
+ }
+
+ @Test
+ public void initial() {
+ LazyList<User> lazyList = createLazyList(20, 5);
+ assertNull(lazyList.get(0));
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 20);
+
+ lazyList = createLazyList(10, 5);
+ assertNull(lazyList.get(0));
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 10);
+ }
+
+ @Test
+ public void initialReturnsEmpty() {
+ mDataSource.setCount(200);
+ LazyList<User> lazyList = createLazyList(20, 5);
+ assertEquals(200, lazyList.size());
+
+
+ // trigger initial load that returns nothing
+ mDataSource.setCount(0);
+ lazyList.get(0);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 0);
+
+ // now further accesses don't trigger loads
+ mDataSource.setCount(200);
+ lazyList.get(100);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 0);
+ }
+
+ @Test
+ public void initialPrefetch() {
+ LazyList<User> lazyList = createLazyList(20, 20);
+ assertNull(lazyList.get(9));
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 40);
+ }
+
+ @Test
+ public void initialPrefetchMultiple() {
+ LazyList<User> lazyList = createLazyList(20, 90);
+ lazyList.get(0);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 100);
+ }
+
+ @Test
+ public void incrementalLoading() {
+ LazyList<User> lazyList = createLazyList(20, 20);
+ lazyList.get(0);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 40);
+
+ lazyList.get(39);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 60);
+
+ lazyList.get(41);
+ drain();
+ TestCountedDataSource.verifyRange(lazyList, 0, 80);
+ }
+
+ private static <T> List<T> reverse(List<T> input) {
+ ArrayList<T> result = new ArrayList<>(input);
+ Collections.reverse(result);
+ return result;
+ }
+
+ private void drain() {
+ boolean executed;
+ do {
+ executed = mBackgroundThread.executeAll();
+ executed |= mMainThread.executeAll();
+ } while (executed);
+
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/PagedListTest.java b/paging/common/src/test/java/android/arch/util/paging/PagedListTest.java
new file mode 100644
index 0000000..8cd4665
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/PagedListTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.arch.util.paging;
+
+import static junit.framework.TestCase.fail;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
+
+@RunWith(JUnit4.class)
+public class PagedListTest {
+ private TestExecutor mMainThread = new TestExecutor();
+ private TestExecutor mBackgroundThread = new TestExecutor();
+ private TestDataSource mDataSource = new TestDataSource();
+
+ private PagedList.ChangeCallback mChangeCallback = Mockito.mock(PagedList.ChangeCallback.class);
+
+ @Test
+ public void callbackSimple() {
+ PagedList.ChangeCallback callback = Mockito.mock(PagedList.ChangeCallback.class);
+ PagedList.ChangeCallbackWrapper wrapper =
+ new PagedList.ChangeCallbackWrapper(callback, 0, 0);
+
+ wrapper.dispatchLoaded(0, 10);
+ verify(callback).onInserted(0, 10);
+ verifyNoMoreInteractions(callback);
+
+ wrapper.dispatchLoaded(0, 10);
+ verifyNoMoreInteractions(callback);
+
+ wrapper.dispatchLoaded(0, 20);
+ verify(callback).onInserted(10, 10);
+ verifyNoMoreInteractions(callback);
+ }
+
+ @Test
+ public void callbackComplex() {
+ PagedList.ChangeCallback callback = Mockito.mock(PagedList.ChangeCallback.class);
+ PagedList.ChangeCallbackWrapper wrapper =
+ new PagedList.ChangeCallbackWrapper(callback, 0, 0);
+
+ wrapper.dispatchLoaded(0, 8);
+ verify(callback).onInserted(0, 8);
+ verifyNoMoreInteractions(callback);
+
+ wrapper.dispatchLoaded(10, 18);
+ verify(callback).onInserted(0, 10);
+ verifyNoMoreInteractions(callback);
+
+ wrapper.dispatchLoaded(10, 22);
+ verify(callback).onInserted(18, 4);
+ verifyNoMoreInteractions(callback);
+
+ // Note: prepend before append is impl detail
+ wrapper.dispatchLoaded(12, 25);
+ verify(callback).onInserted(0, 2);
+ verify(callback).onInserted(24, 1);
+ verifyNoMoreInteractions(callback);
+ }
+
+ private PagedList<User> createPagedList(int pageSize, int prefetchDistance) {
+ PagedList<User> pagedList = new PagedList<>(
+ mDataSource, mMainThread, mBackgroundThread,
+ new ListConfig(pageSize, prefetchDistance));
+ pagedList.addCallback(mChangeCallback);
+ return pagedList;
+ }
+
+ private PagedList<User> createPagedListInitializedFrom(PagedList<User> old) {
+ PagedList<User> pagedList = new PagedList<>(
+ mDataSource, mMainThread, mBackgroundThread,
+ old.mConfig);
+ if (!pagedList.initializeFrom(old)) {
+ fail();
+ }
+ return pagedList;
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void requirePrefetch() {
+ createPagedList(20, 0);
+ }
+
+ @Test
+ public void initial() {
+ PagedList<User> pagedList = createPagedList(20, 5);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 20);
+
+ pagedList = createPagedList(10, 5);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 10);
+ }
+
+ @Test
+ public void initialPrefetch() {
+ PagedList<User> pagedList = createPagedList(20, 20);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 20);
+
+ // Note: pagedList doesn't prefetch after initial load until first get call
+ pagedList.get(10);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 40);
+ }
+
+ @Test
+ public void initialPrefetchMultiple() {
+ PagedList<User> pagedList = createPagedList(20, 90);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 20);
+
+ // Note: pagedList doesn't prefetch after initial load until first get call
+ pagedList.get(0);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 100);
+ }
+
+ @Test
+ public void incrementalLoading() {
+ PagedList<User> pagedList = createPagedList(20, 20);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 20);
+
+ pagedList.get(5);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 40);
+
+ pagedList.get(39);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 60);
+
+ pagedList.get(41);
+ drain();
+ TestDataSource.verifyRange(pagedList, 0, 80);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void get_tooEarly() {
+ PagedList<User> pagedList = createPagedList(20, 20);
+ pagedList.triggerInitialLoad(null);
+ assertEquals(0, pagedList.size());
+ pagedList.get(0); // task hasn't run, zero size currently
+ }
+
+ @Test
+ public void initializeFrom() {
+ PagedList<User> pagedList = createPagedList(20, 20);
+ pagedList.triggerInitialLoad(null);
+ drain();
+ }
+
+ private void drain() {
+ boolean executed;
+ do {
+ executed = mBackgroundThread.executeAll();
+ executed |= mMainThread.executeAll();
+ } while (executed);
+
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/TestCountedDataSource.java b/paging/common/src/test/java/android/arch/util/paging/TestCountedDataSource.java
new file mode 100644
index 0000000..04ad89a
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/TestCountedDataSource.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.arch.util.paging;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestCountedDataSource extends CountedDataSource<User> {
+ private static final ArrayList<User> sUsers = TestDataSource.sUsers;
+
+ private int mCount = sUsers.size();
+
+ static void verifyRange(LazyList<User> list, int start, int end) {
+ assertEquals("size should be same", end - start, list.mItems.size());
+ for (int i = 0; i < list.mItems.size(); i++) {
+ // NOTE: avoid getter, to avoid signaling
+ assertSame(sUsers.get(start + i), list.mItems.get(i));
+ }
+ }
+
+ public void setCount(int count) {
+ assertTrue(count <= sUsers.size());
+ mCount = count;
+ }
+
+ @Override
+ public int loadCount() {
+ return mCount;
+ }
+
+ private List<User> getClampedRange(int start, int end) {
+ start = Math.max(0, start);
+ end = Math.min(loadCount(), end);
+ return sUsers.subList(start, end);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(int position, int pageSize) {
+ return getClampedRange(position + 1, position + 1 + pageSize);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(int currentEndIndex, @NonNull User currentEndItem, int pageSize) {
+ return getClampedRange(currentEndIndex + 1, currentEndIndex + 1 + pageSize);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(int currentBeginIndex, @NonNull User currentBeginItem,
+ int pageSize) {
+ return getClampedRange(currentBeginIndex - 1 - pageSize, currentBeginIndex);
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/TestDataSource.java b/paging/common/src/test/java/android/arch/util/paging/TestDataSource.java
new file mode 100644
index 0000000..11fd2eb
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/TestDataSource.java
@@ -0,0 +1,89 @@
+/*
+ * 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.arch.util.paging;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestDataSource extends DataSource<String, User> {
+ static final ArrayList<User> sUsers = new ArrayList<>();
+ static {
+ for (int i = 0; i < 300; i++) {
+ sUsers.add(new User(String.format("%03d", i), "Usernr " + i));
+ }
+ }
+
+ static void verifyRange(PagedList<User> list, int start, int end) {
+ assertEquals(end - start, list.size());
+ for (int i = 0; i < list.size(); i++) {
+ // NOTE: avoid getter, to avoid signaling
+ assertSame(sUsers.get(start + i), list.mItems.get(i));
+ }
+ }
+
+ @Override
+ public String getKey(@NonNull User item) {
+ return item.name;
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(@Nullable String itemName, int pageSize) {
+ if (itemName == null) {
+ itemName = "";
+ }
+ ArrayList<User> users = new ArrayList<>();
+ int index;
+ for (index = 0; index < sUsers.size(); index++) {
+ if (itemName.compareTo(sUsers.get(index).name) < 0) {
+ break;
+ }
+ }
+ for (int i = 0; i < pageSize && index + i < sUsers.size(); i++) {
+ users.add(sUsers.get(index + i));
+ }
+ return users;
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(@NonNull User currentEndItem, int pageSize) {
+ return loadAfterInitial(currentEndItem.name, pageSize);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(@NonNull User currentBeginItem, int pageSize) {
+ ArrayList<User> users = new ArrayList<>();
+ int index;
+ for (index = sUsers.size() - 1; index >= 0; index--) {
+ if (currentBeginItem.name.compareTo(sUsers.get(index).name) > 0) {
+ break;
+ }
+ }
+ for (int i = 0; i < pageSize && index - i >= 0; i++) {
+ users.add(sUsers.get(index - i));
+ }
+ return users;
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/TestExecutor.java b/paging/common/src/test/java/android/arch/util/paging/TestExecutor.java
new file mode 100644
index 0000000..6a3f188
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/TestExecutor.java
@@ -0,0 +1,41 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.NonNull;
+
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+
+public class TestExecutor implements Executor {
+ private Queue<Runnable> mTasks = new LinkedList<>();
+
+ @Override
+ public void execute(@NonNull Runnable command) {
+ mTasks.add(command);
+ }
+
+ boolean executeAll() {
+ boolean consumed = !mTasks.isEmpty();
+ Runnable task;
+ while ((task = mTasks.poll()) != null) {
+ task.run();
+ }
+ return consumed;
+ }
+}
diff --git a/paging/common/src/test/java/android/arch/util/paging/User.java b/paging/common/src/test/java/android/arch/util/paging/User.java
new file mode 100644
index 0000000..f486955
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/util/paging/User.java
@@ -0,0 +1,32 @@
+/*
+ * 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.arch.util.paging;
+
+public class User {
+ public final String name;
+ public final String info;
+
+ public User(String name, String info) {
+ this.name = name;
+ this.info = info;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/samples-flatfoot/MusicPlayer/app/.gitignore b/paging/integration-tests/testapp/.gitignore
similarity index 100%
rename from samples-flatfoot/MusicPlayer/app/.gitignore
rename to paging/integration-tests/testapp/.gitignore
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
new file mode 100644
index 0000000..5356dd4
--- /dev/null
+++ b/paging/integration-tests/testapp/build.gradle
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+apply plugin: 'com.android.application'
+
+project.ext.noDocs = true
+
+android {
+ compileSdkVersion tools.current_sdk
+ buildToolsVersion tools.build_tools_version
+
+ defaultConfig {
+ minSdkVersion flatfoot.min_sdk
+ targetSdkVersion tools.current_sdk
+ versionCode 1
+ versionName "1.0"
+ }
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+}
+
+dependencies {
+ compile project(':arch:runtime')
+ compile project(':arch:common')
+ compile project(':paging:common')
+ compile project(':lifecycle:extensions')
+ compile project(':lifecycle:runtime')
+ compile project(':lifecycle:common')
+ compile project(':paging:runtime')
+ compile 'com.android.support:multidex:1.0.1'
+
+ compile libs.support.recyclerview
+ compile libs.support.app_compat
+}
+
+createAndroidCheckstyle(project)
+tasks['check'].dependsOn(tasks['connectedCheck'])
+
+uploadArchives.enabled = false
diff --git a/paging/integration-tests/testapp/proguard-rules.pro b/paging/integration-tests/testapp/proguard-rules.pro
new file mode 100644
index 0000000..b7210d1
--- /dev/null
+++ b/paging/integration-tests/testapp/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/yboyar/android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/paging/integration-tests/testapp/src/main/AndroidManifest.xml b/paging/integration-tests/testapp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..fc86e8d
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -0,0 +1,41 @@
+<?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.arch.paging.integration.testapp">
+ <application
+ android:allowBackup="true"
+ android:supportsRtl="true">
+ <activity
+ android:name=".lazylist.LazyListRecyclerViewActivity"
+ android:label="LazyList"
+ android:theme="@style/Theme.AppCompat">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name=".pagedlist.PagedListRecyclerViewActivity"
+ android:label="PagedList"
+ android:theme="@style/Theme.AppCompat">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+ </manifest>
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
new file mode 100644
index 0000000..0a7b0f0
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.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.arch.paging.integration.testapp;
+
+import android.arch.util.paging.DiffCallback;
+import android.support.annotation.NonNull;
+
+/**
+ * Sample item.
+ */
+public class Item {
+ public final int id;
+ public final String text;
+ public final int bgColor;
+
+ public Item(int id, String text, int bgColor) {
+ this.id = id;
+ this.text = text;
+ this.bgColor = bgColor;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Item item = (Item) o;
+ return this.id == item.id
+ && this.bgColor == item.bgColor
+ && this.text.equals(item.text);
+ }
+
+ public static final DiffCallback<Item> DIFF_CALLBACK = new DiffCallback<Item>() {
+ @Override
+ public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
+ return oldItem.equals(newItem);
+ }
+
+ @Override
+ public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
+ return oldItem.id == newItem.id;
+ }
+ };
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemCountedDataSource.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemCountedDataSource.java
new file mode 100644
index 0000000..89dd844
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemCountedDataSource.java
@@ -0,0 +1,92 @@
+/*
+ * 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.arch.paging.integration.testapp;
+
+import android.arch.util.paging.CountedDataSource;
+import android.graphics.Color;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample data source with artificial data.
+ */
+public class ItemCountedDataSource extends CountedDataSource<Item> {
+ @ColorInt
+ private static final int[] COLORS = new int[] {
+ Color.RED,
+ Color.BLUE,
+ Color.BLACK,
+ };
+
+ private static int sGenerationId;
+ private final int mGenerationId = sGenerationId++;
+
+ @Override
+ public int loadCount() {
+ return 10000;
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadAfterInitial(int position, int pageSize) {
+ return createItems(position + 1, pageSize, 1);
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadAfter(int currentEndIndex, @NonNull Item currentEndItem, int pageSize) {
+ return createItems(currentEndIndex + 1, pageSize, 1);
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadBefore(int currentBeginIndex, @NonNull Item currentBeginItem,
+ int pageSize) {
+ return createItems(currentBeginIndex - 1, pageSize, -1);
+ }
+
+ @Nullable
+ private List<Item> createItems(int start, int count, int direction) {
+ if (isInvalid()) {
+ // abort!
+ return null;
+ }
+
+ List<Item> items = new ArrayList<>();
+ int end = Math.max(-1, Math.min(loadCount(), start + direction * count));
+ int bgColor = COLORS[mGenerationId % COLORS.length];
+
+ try {
+ Thread.sleep(300);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ for (int i = start; i != end; i += direction) {
+ items.add(new Item(i, "item " + i, bgColor));
+ }
+
+ if (isInvalid()) {
+ // abort!
+ return null;
+ }
+ return items;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemDataSource.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemDataSource.java
new file mode 100644
index 0000000..cbfc247
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/ItemDataSource.java
@@ -0,0 +1,96 @@
+/*
+ * 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.arch.paging.integration.testapp;
+
+import android.arch.util.paging.DataSource;
+import android.graphics.Color;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample data source with artificial data.
+ */
+public class ItemDataSource extends DataSource<Integer, Item> {
+ private static final int COUNT = 10000;
+
+ @ColorInt
+ private static final int[] COLORS = new int[] {
+ Color.RED,
+ Color.BLUE,
+ Color.BLACK,
+ };
+
+
+ private static int sGenerationId;
+ private final int mGenerationId = sGenerationId++;
+
+ @Override
+ public Integer getKey(@NonNull Item item) {
+ return item.id;
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadAfterInitial(@Nullable Integer position, int pageSize) {
+ if (position == null) {
+ position = -1;
+ }
+ return createItems(position + 1, pageSize, 1);
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadAfter(@NonNull Item currentEndItem, int pageSize) {
+ return createItems(currentEndItem.id + 1, pageSize, 1);
+ }
+
+ @Nullable
+ @Override
+ public List<Item> loadBefore(@NonNull Item currentBeginItem, int pageSize) {
+ return createItems(currentBeginItem.id - 1, pageSize, -1);
+ }
+
+ private List<Item> createItems(int start, int count, int direction) {
+ if (isInvalid()) {
+ // abort!
+ return null;
+ }
+
+ List<Item> items = new ArrayList<>();
+ int end = Math.max(-1, Math.min(COUNT, start + direction * count));
+ int bgColor = COLORS[mGenerationId % COLORS.length];
+
+ try {
+ Thread.sleep(300);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ for (int i = start; i != end; i += direction) {
+ items.add(new Item(i, "item " + i, bgColor));
+ }
+
+ if (isInvalid()) {
+ // abort!
+ return null;
+ }
+ return items;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemAdapter.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemAdapter.java
new file mode 100644
index 0000000..f24b717
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemAdapter.java
@@ -0,0 +1,63 @@
+/*
+ * 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.arch.paging.integration.testapp.lazylist;
+
+import android.arch.paging.integration.testapp.Item;
+import android.arch.util.paging.LazyList;
+import android.arch.util.paging.LazyListAdapterHelper;
+import android.graphics.Color;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * Sample LazyList adapter, which uses a LazyListAdapterHelper.
+ */
+public class LazyListItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private final LazyListAdapterHelper<Item> mHelper;
+
+ LazyListItemAdapter() {
+ mHelper = LazyListAdapterHelper.<Item>builder()
+ .adapter(this)
+ .diffCallback(Item.DIFF_CALLBACK)
+ .create();
+ }
+
+ void setLazyList(LazyList<Item> list) {
+ mHelper.setLazyList(list);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new RecyclerView.ViewHolder(new TextView(parent.getContext())) {
+ };
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ Item item = mHelper.get(position);
+ ((TextView) (holder.itemView)).setText(item == null ? "loading" : item.text);
+ holder.itemView.setBackgroundColor(item == null ? Color.TRANSPARENT : item.bgColor);
+ holder.itemView.setMinimumHeight(400);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mHelper.getItemCount();
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemViewModel.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemViewModel.java
new file mode 100644
index 0000000..3d0b3b4
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListItemViewModel.java
@@ -0,0 +1,54 @@
+/*
+ * 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.arch.paging.integration.testapp.lazylist;
+
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.ViewModel;
+import android.arch.paging.integration.testapp.Item;
+import android.arch.paging.integration.testapp.ItemCountedDataSource;
+import android.arch.util.paging.CountedDataSource;
+import android.arch.util.paging.LazyList;
+import android.arch.util.paging.ListConfig;
+import android.arch.util.paging.LiveLazyListProvider;
+
+/**
+ * Sample ViewModel backed by an artificial data source
+ */
+public class LazyListItemViewModel extends ViewModel {
+ private final LiveData<LazyList<Item>> mLiveLazyList;
+ private ItemCountedDataSource mDataSource;
+
+ public LazyListItemViewModel() {
+ mLiveLazyList = new LiveLazyListProvider<Item>() {
+ @Override
+ protected CountedDataSource<Item> createDataSource() {
+ mDataSource = new ItemCountedDataSource();
+ return mDataSource;
+ }
+ }.create(ListConfig.builder().pageSize(20).prefetchDistance(40).create());
+ }
+
+ void invalidateList() {
+ if (mDataSource != null) {
+ mDataSource.invalidate();
+ }
+ }
+
+ LiveData<LazyList<Item>> getLazyList() {
+ return mLiveLazyList;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListRecyclerViewActivity.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListRecyclerViewActivity.java
new file mode 100644
index 0000000..3e499d3
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/lazylist/LazyListRecyclerViewActivity.java
@@ -0,0 +1,74 @@
+/*
+ * 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.arch.paging.integration.testapp.lazylist;
+
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.LifecycleRegistryOwner;
+import android.arch.lifecycle.Observer;
+import android.arch.lifecycle.ViewModelProviders;
+import android.arch.paging.integration.testapp.Item;
+import android.arch.paging.integration.testapp.R;
+import android.arch.util.paging.LazyList;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+
+/**
+ * Sample LazyList activity.
+ */
+public class LazyListRecyclerViewActivity extends AppCompatActivity
+ implements LifecycleRegistryOwner {
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final LazyListItemViewModel viewModel = ViewModelProviders.of(this)
+ .get(LazyListItemViewModel.class);
+ setContentView(R.layout.activity_recycler_view);
+
+ final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
+ final LazyListItemAdapter adapter = new LazyListItemAdapter();
+
+
+ // TODO: helper initialization, with owner, recyclerview, LiveData<LazyList<Item>>
+ viewModel.getLazyList().observe(this, new Observer<LazyList<Item>>() {
+ @Override
+ public void onChanged(@Nullable LazyList<Item> itemLazyList) {
+ adapter.setLazyList(itemLazyList);
+ if (recyclerView.getAdapter() == null) {
+ recyclerView.setAdapter(adapter);
+ }
+ }
+ });
+ final Button button = (Button) findViewById(R.id.button);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ viewModel.invalidateList();
+ }
+ });
+ }
+
+ private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
+ @Override
+ public LifecycleRegistry getLifecycle() {
+ return mLifecycleRegistry;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemAdapter.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemAdapter.java
new file mode 100644
index 0000000..3f41267
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemAdapter.java
@@ -0,0 +1,65 @@
+/*
+ * 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.arch.paging.integration.testapp.pagedlist;
+
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.paging.integration.testapp.Item;
+import android.arch.util.paging.PagedList;
+import android.arch.util.paging.PagedListAdapterHelper;
+import android.arch.util.paging.PagerBaseAdapterHelper;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * Sample PagedList adapter, which uses a PagedListAdapterHelper.
+ */
+public class PagedListItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final PagedListAdapterHelper<Item> mHelper;
+
+ PagedListItemAdapter() {
+ mHelper = new PagedListAdapterHelper<>(
+ AppToolkitTaskExecutor.getMainThreadExecutor(),
+ AppToolkitTaskExecutor.getIOThreadExecutor(),
+ new PagerBaseAdapterHelper.AdapterCallback(this),
+ Item.DIFF_CALLBACK);
+ }
+
+ void setPagedList(PagedList<Item> list) {
+ mHelper.setPagedList(list);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ RecyclerView.ViewHolder holder = new RecyclerView.ViewHolder(
+ new TextView(parent.getContext())) {};
+ holder.itemView.setMinimumHeight(400);
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ Item item = mHelper.get(position);
+ ((TextView) (holder.itemView)).setText(item.text);
+ holder.itemView.setBackgroundColor(item.bgColor);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mHelper.getItemCount();
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemViewModel.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemViewModel.java
new file mode 100644
index 0000000..e8fe13f
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListItemViewModel.java
@@ -0,0 +1,54 @@
+/*
+ * 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.arch.paging.integration.testapp.pagedlist;
+
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.ViewModel;
+import android.arch.paging.integration.testapp.Item;
+import android.arch.paging.integration.testapp.ItemDataSource;
+import android.arch.util.paging.DataSource;
+import android.arch.util.paging.ListConfig;
+import android.arch.util.paging.LivePagedListProvider;
+import android.arch.util.paging.PagedList;
+
+/**
+ * Sample ViewModel backed by an artificial data source
+ */
+public class PagedListItemViewModel extends ViewModel {
+ private final LiveData<PagedList<Item>> mLivePagedList;
+ private ItemDataSource mDataSource;
+
+ public PagedListItemViewModel() {
+ mLivePagedList = new LivePagedListProvider<Integer, Item>() {
+ @Override
+ protected DataSource<Integer, Item> createDataSource() {
+ mDataSource = new ItemDataSource();
+ return mDataSource;
+ }
+ }.create(ListConfig.builder().pageSize(20).prefetchDistance(40).create());
+ }
+
+ void invalidateList() {
+ if (mDataSource != null) {
+ mDataSource.invalidate();
+ }
+ }
+
+ LiveData<PagedList<Item>> getPagedList() {
+ return mLivePagedList;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListRecyclerViewActivity.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListRecyclerViewActivity.java
new file mode 100644
index 0000000..28e70f5
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/pagedlist/PagedListRecyclerViewActivity.java
@@ -0,0 +1,75 @@
+/*
+ * 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.arch.paging.integration.testapp.pagedlist;
+
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.LifecycleRegistryOwner;
+import android.arch.lifecycle.Observer;
+import android.arch.lifecycle.ViewModelProviders;
+import android.arch.paging.integration.testapp.Item;
+import android.arch.paging.integration.testapp.R;
+import android.arch.util.paging.PagedList;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+
+/**
+ * Sample PagedList activity.
+ */
+public class PagedListRecyclerViewActivity extends AppCompatActivity
+ implements LifecycleRegistryOwner {
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final PagedListItemViewModel viewModel = ViewModelProviders.of(this)
+ .get(PagedListItemViewModel.class);
+ setContentView(R.layout.activity_recycler_view);
+
+ final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
+ final PagedListItemAdapter adapter = new PagedListItemAdapter();
+
+ // TODO: Create and use PagedListAdapterHelper.builder
+ viewModel.getPagedList().observe(this, new Observer<PagedList<Item>>() {
+ @Override
+ public void onChanged(@Nullable PagedList<Item> itemPagedList) {
+ adapter.setPagedList(itemPagedList);
+ if (recyclerView.getAdapter() == null && itemPagedList != null) {
+ itemPagedList.triggerInitialLoad(null); // TODO: Persist
+ recyclerView.setAdapter(adapter);
+ }
+ }
+ });
+ final Button button = (Button) findViewById(R.id.button);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ viewModel.invalidateList();
+ }
+ });
+ }
+
+ private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
+
+ @Override
+ public LifecycleRegistry getLifecycle() {
+ return mLifecycleRegistry;
+ }
+}
diff --git a/paging/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml b/paging/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml
new file mode 100644
index 0000000..73a3e89
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml
@@ -0,0 +1,43 @@
+<?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.
+ -->
+<RelativeLayout
+ 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/activity_recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".lazylist.LazyListRecyclerViewActivity">
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/recyclerview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layoutManager="LinearLayoutManager"
+ android:clipToPadding="false"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ />
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:text="Update"/>
+</RelativeLayout>
diff --git a/paging/integration-tests/testapp/src/main/res/values-w820dp/dimens.xml b/paging/integration-tests/testapp/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..edff918
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/res/values-w820dp/dimens.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.
+-->
+
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/paging/integration-tests/testapp/src/main/res/values/dimens.xml b/paging/integration-tests/testapp/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..3358489
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/res/values/dimens.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>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/paging/integration-tests/testapp/src/main/res/values/strings.xml b/paging/integration-tests/testapp/src/main/res/values/strings.xml
new file mode 100644
index 0000000..bed7093
--- /dev/null
+++ b/paging/integration-tests/testapp/src/main/res/values/strings.xml
@@ -0,0 +1,18 @@
+<!--
+~ 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>
+</resources>
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
new file mode 100644
index 0000000..ba3a764
--- /dev/null
+++ b/paging/runtime/build.gradle
@@ -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.
+ */
+import com.android.builder.core.BuilderConstants
+apply plugin: 'com.android.library'
+apply plugin: 'maven'
+// disable paging for now.
+project.ext.noDocs = true
+uploadArchives.enabled = false
+android {
+ compileSdkVersion tools.current_sdk
+ buildToolsVersion tools.build_tools_version
+
+ defaultConfig {
+ minSdkVersion flatfoot.min_sdk
+ targetSdkVersion tools.current_sdk
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes.all {
+ consumerProguardFiles 'proguard-rules.pro'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ }
+ }
+
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+}
+
+dependencies {
+ compile project(":arch:runtime")
+ compile project(":paging:common")
+ compile project(":lifecycle:runtime")
+ compile project(':lifecycle:extensions')
+
+ compile libs.support.recyclerview
+ testCompile libs.junit
+ androidTestCompile libs.mockito_core
+ androidTestCompile libs.dexmaker_mockito
+ testCompile libs.support.annotations
+
+ androidTestCompile libs.junit
+ androidTestCompile(libs.test_runner) {
+ exclude module: 'support-annotations'
+ }
+ androidTestCompile(libs.espresso_core, {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+
+}
+
+archivesBaseName = "runtime"
+
+createAndroidCheckstyle(project)
+
+android.libraryVariants.all { variant ->
+ def name = variant.buildType.name
+ def suffix = name.capitalize()
+ project.tasks.create(name: "jar${suffix}", type: Jar){
+ dependsOn variant.javaCompile
+ from variant.javaCompile.destinationDir
+ destinationDir new File(project.buildDir, "libJar")
+ }
+}
diff --git a/paging/runtime/proguard-rules.pro b/paging/runtime/proguard-rules.pro
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/paging/runtime/proguard-rules.pro
@@ -0,0 +1 @@
+
diff --git a/paging/runtime/src/androidTest/java/android/arch/util/paging/LazyListAdapterHelperTest.java b/paging/runtime/src/androidTest/java/android/arch/util/paging/LazyListAdapterHelperTest.java
new file mode 100644
index 0000000..a8b9572
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/arch/util/paging/LazyListAdapterHelperTest.java
@@ -0,0 +1,259 @@
+/*
+ * 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.arch.util.paging;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.support.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.v7.util.ListUpdateCallback;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+
+@SmallTest
+@RunWith(JUnit4.class)
+public class LazyListAdapterHelperTest {
+ public class TestExecutor implements Executor {
+ private Queue<Runnable> mTasks = new LinkedList<>();
+ @Override
+ public void execute(@NonNull Runnable command) {
+ mTasks.add(command);
+ }
+
+ boolean executeAll() {
+ boolean consumed = !mTasks.isEmpty();
+ Runnable task;
+ while ((task = mTasks.poll()) != null) {
+ task.run();
+ }
+ return consumed;
+ }
+ }
+
+ private TestExecutor mMainThread = new TestExecutor();
+ private TestExecutor mBackgroundThread = new TestExecutor();
+ private CountedDataSource<Item> mDataSource = new CountedDataSource<Item>() {
+ @Override
+ public int loadCount() {
+ return mItemData.size();
+ }
+
+ private List<Item> getClampedRange(int start, int end) {
+ start = Math.max(0, start);
+ end = Math.min(loadCount(), end);
+ return mItemData.subList(start, end);
+ }
+
+ @Override
+ public List<Item> loadAfterInitial(int position, int pageSize) {
+ return getClampedRange(position + 1, position + pageSize + 1);
+ }
+
+ @Override
+ public List<Item> loadAfter(int currentEndIndex, @NonNull Item currentEndItem,
+ int pageSize) {
+ return getClampedRange(currentEndIndex + 1, currentEndIndex + 1 + pageSize);
+ }
+
+ @Override
+ public List<Item> loadBefore(int currentBeginIndex, @NonNull Item currentBeginItem,
+ int pageSize) {
+ return getClampedRange(currentBeginIndex - 1 - pageSize, currentBeginIndex);
+ }
+ };
+
+ private static class Item {
+ int mId = 0;
+ int mGeneration = 0;
+
+ static final DiffCallback<Item> DIFF_CALLBACK = new DiffCallback<Item>() {
+ @Override
+ public boolean areContentsTheSame(@NonNull Item oldItem,
+ @NonNull Item newItem) {
+ return oldItem.mId == newItem.mId;
+ }
+
+ @Override
+ public boolean areItemsTheSame(@NonNull Item oldItem,
+ @NonNull Item newItem) {
+ return oldItem.equals(newItem);
+ }
+ };
+ }
+
+ private List<Item> mItemData = new ArrayList<>();
+
+ @Before
+ public void setup() {
+ for (int i = 0; i < 100; i++) {
+ Item item = new Item();
+ item.mId = i;
+ item.mGeneration = 0;
+ mItemData.add(item);
+ }
+ }
+
+ private LazyList<Item> createLazyList() {
+ return new LazyList<>(mDataSource, mMainThread, mBackgroundThread,
+ ListConfig.builder().pageSize(10).prefetchDistance(10).create());
+ }
+
+ private LazyListAdapterHelper<Item> createHelper(ListUpdateCallback callback) {
+ return LazyListAdapterHelper.<Item>builder()
+ .mainThreadExecutor(mMainThread)
+ .backgroundThreadExecutor(mBackgroundThread)
+ .updateCallback(callback)
+ .diffCallback(Item.DIFF_CALLBACK).create();
+ }
+
+ @Test
+ public void create() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ createHelper(callback);
+ verifyZeroInteractions(callback);
+ }
+
+ @Test
+ public void setEmpty() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ LazyListAdapterHelper<Item> helper = createHelper(callback);
+ verifyZeroInteractions(callback);
+
+ LazyList<Item> list = createLazyList();
+ helper.setLazyList(list);
+ drain();
+ verify(callback).onInserted(0, 100);
+ verifyNoMoreInteractions(callback);
+ }
+
+ @Test
+ public void setEmptyAndLoad() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ LazyListAdapterHelper<Item> helper = createHelper(callback);
+ verifyZeroInteractions(callback);
+
+ LazyList<Item> list = createLazyList();
+ helper.setLazyList(list);
+ drain();
+ verify(callback).onInserted(0, 100);
+ verifyNoMoreInteractions(callback);
+
+ helper.get(0);
+ verifyNoMoreInteractions(callback);
+ drain();
+ verify(callback).onChanged(0, 10, null);
+ verify(callback).onChanged(10, 10, null);
+ verifyNoMoreInteractions(callback);
+ }
+
+ @Test
+ public void setEmptyAndClear() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ LazyListAdapterHelper<Item> helper = createHelper(callback);
+ verifyZeroInteractions(callback);
+
+ LazyList<Item> list = createLazyList();
+ helper.setLazyList(list);
+ drain();
+ verify(callback).onInserted(0, 100);
+ verifyNoMoreInteractions(callback);
+
+ helper.setLazyList(null);
+ verify(callback).onRemoved(0, 100);
+ drain();
+ verifyNoMoreInteractions(callback);
+ }
+
+ @Test
+ public void setNonEmpty() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ LazyListAdapterHelper<Item> helper = createHelper(callback);
+
+ LazyList<Item> list = createLazyList();
+ list.get(0);
+ drain();
+
+ verifyZeroInteractions(callback);
+
+ // setting doesn't trigger callbacks
+ helper.setLazyList(list);
+ drain();
+ verify(callback).onInserted(0, 100);
+ verifyNoMoreInteractions(callback);
+
+ // helper has correct data, but will trigger loads on access
+ assertNotNull(helper.get(19));
+ assertNull(helper.get(20));
+ verifyNoMoreInteractions(callback);
+ drain();
+ verify(callback).onChanged(20, 10, null);
+ verify(callback).onChanged(30, 10, null);
+ verifyNoMoreInteractions(callback);
+ }
+
+ @Test
+ public void simpleDiffCalc() {
+ ListUpdateCallback callback = Mockito.mock(ListUpdateCallback.class);
+ LazyListAdapterHelper<Item> helper = createHelper(callback);
+ verifyZeroInteractions(callback);
+
+ LazyList<Item> list = createLazyList();
+ helper.setLazyList(list);
+ drain();
+ verify(callback).onInserted(0, 100);
+ verifyNoMoreInteractions(callback);
+
+ list = createLazyList();
+ list.get(0); // TODO: also test more interesting number
+ drain();
+ verifyNoMoreInteractions(callback);
+
+ helper.setLazyList(list);
+ verifyNoMoreInteractions(callback);
+ drain();
+
+ // NOTE: these aren't ideal, but they're what we currently produce.
+ // Should ideally be onChanged(0, 20)
+ verify(callback).onRemoved(80, 20);
+ verify(callback).onInserted(0, 20);
+ verifyNoMoreInteractions(callback);
+ }
+
+
+ private void drain() {
+ boolean executed;
+ do {
+ executed = mBackgroundThread.executeAll();
+ executed |= mMainThread.executeAll();
+ } while (executed);
+
+ }
+}
diff --git a/paging/runtime/src/main/AndroidManifest.xml b/paging/runtime/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..95247e5
--- /dev/null
+++ b/paging/runtime/src/main/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<!--
+ ~ 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.arch.util.paging.runtime">
+</manifest>
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/DiffCallback.java b/paging/runtime/src/main/java/android/arch/util/paging/DiffCallback.java
new file mode 100644
index 0000000..de66424
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/DiffCallback.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.arch.util.paging;
+
+import android.support.annotation.NonNull;
+
+/**
+ * Interface that informs {@link LazyListAdapterHelper} how to compute list updates when using
+ * {@link android.support.v7.util.DiffUtil} on a background thread.
+ * <p>
+ * The AdapterHelper will pass items from different lists to this callback in order to implement
+ * the {@link android.support.v7.util.DiffUtil.Callback} it uses to compute differences between
+ * lists.
+ *
+ * @param <Value> Type of items to compare.
+ */
+public abstract class DiffCallback<Value> {
+
+ /**
+ * Called to decide whether two objects represent the same item.
+ *
+ * @param oldItem The item in the old list.
+ * @param newItem The item in the new list.
+ * @return True if the two items represent the same object or false if they are different.
+ */
+ public abstract boolean areItemsTheSame(@NonNull Value oldItem, @NonNull Value newItem);
+
+ /**
+ * Called to decide whether two items have the same data. This information is used to detect if
+ * the contents of an item have changed.
+ *
+ * @param oldItem The item in the old list.
+ * @param newItem The item in the new list.
+ * @return True if the contents of the items are the same or false if they are different.
+ */
+ public abstract boolean areContentsTheSame(@NonNull Value oldItem, @NonNull Value newItem);
+}
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/LazyListAdapterHelper.java b/paging/runtime/src/main/java/android/arch/util/paging/LazyListAdapterHelper.java
new file mode 100644
index 0000000..64931e9
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/LazyListAdapterHelper.java
@@ -0,0 +1,367 @@
+/*
+ * 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.arch.util.paging;
+
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.Observer;
+import android.arch.lifecycle.OnLifecycleEvent;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.util.ListUpdateCallback;
+import android.support.v7.widget.RecyclerView;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Helper object for mapping a {@link LazyList} into a
+ * {@link android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter} - both the internal
+ * paging of the list as more data is loaded, and updates in the form of new LazyLists.
+ * <p>
+ * The LazyListAdapterHelper can take a {@link LiveData} of LazyList and present the data simply for
+ * an adapter. It listens to LazyList loading callbacks, and uses DiffUtil on a background thread to
+ * compute updates as new LazyLists are received.
+ * <p>
+ * It provides a simple list-like API with {@link #get(int)} and {@link #getItemCount()} for an
+ * adapter to acquire and present data objects.
+ * <p>
+ * A complete usage pattern with Room would look like this:
+ * <pre>
+ * {@literal @}Dao
+ * interface UserDao {
+ * {@literal @}Query("SELECT * FROM user ORDER BY lastName ASC")
+ * LiveLazyListProvider<User> usersByLastName();
+ * }
+ *
+ * class MyViewModel extends ViewModel {
+ * public final LiveData<LazyList<User>> usersList;
+ * public MyViewModel(UserDao userDao) {
+ * usersList = userDao.usersByLastName().create(
+ * ListConfig.builder()
+ * .pageSize(50)
+ * .prefetchDistance(50)
+ * .create());
+ * }
+ * }
+ *
+ * class MyActivity extends Activity implements LifecycleRegistryOwner {
+ * {@literal @}Override
+ * public void onCreate(Bundle savedState) {
+ * super.onCreate(savedState);
+ * MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
+ * RecyclerView recyclerView = findViewById(R.id.user_list);
+ * UserAdapter<User> adapter = new UserAdapter(
+ * LazyListAdapterHelper.<User>builder()
+ * .lifecycle(this)
+ * .diffCallback(User.DIFF_CALLBACK)
+ * .source(viewModel.usersList));
+ * recyclerView.setAdapter(adapter);
+ * }
+ * }
+ *
+ * class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {
+ * private final LazyListAdapterHelper<User> helper;
+ * public UserAdapter(LazyListAdapterHelper.Builder<User> builder) {
+ * helper = builder.adapter(this).create();
+ * }
+ * {@literal @}Override
+ * public int getItemCount() {
+ * return mHelper.getItemCount();
+ * }
+ * {@literal @}Override
+ * public void onBindViewHolder(UserViewHolder holder, int position) {
+ * User user = mHelper.get(position);
+ * if (user == null) {
+ * // AdapterHelper will automatically call invalidate on this row when the actual
+ * // object is loaded from the database
+ * holder.clear();
+ * } else {
+ * holder.bindTo(user);
+ * }
+ * }
+ * }
+ * </pre>
+ *
+ * @param <Value> Type of the LazyLists this helper will receive.
+ */
+public class LazyListAdapterHelper<Value> extends PagerBaseAdapterHelper<Value> {
+ /**
+ * set to false if the helper is observing a LiveData.
+ */
+ private final boolean mCanSetList;
+ private LazyList.ChangeCallback mChangeCallback = new LazyList.ChangeCallback() {
+ @Override
+ public void onLoaded(int start, int count) {
+ mListUpdateCallback.onChanged(start, count, null);
+ }
+ };
+
+ private LazyListAdapterHelper(
+ @NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ @NonNull ListUpdateCallback listUpdateCallback,
+ @NonNull DiffCallback<Value> diffCallback, boolean canSetList) {
+ super(mainThreadExecutor, backgroundThreadExecutor, listUpdateCallback, diffCallback);
+ mCanSetList = canSetList;
+ }
+
+ /**
+ * Returns the item at the given index.
+ * <p>
+ * Might be null if the item is not loaded yet.
+ *
+ * @param index The position of the item
+ * @return The item at the given index or {@code null} if it is not loaded into memory yet.
+ */
+ @Override
+ @Nullable
+ public Value get(int index) {
+ return super.get(index);
+ }
+
+ /**
+ * Sets the lazy list for this adapter helper. If you are manually observing the
+ * {@link LazyList} for changes, you should call this method with the new
+ * {@link LazyList} when the previous one is invalidated.
+ * <p>
+ * Adapter helper will calculate the diff between this list and the previous one on a background
+ * thread then replace the data with this one, while unsubscribing from the previous list and
+ * subscribing to the new one.
+ * <p>
+ * If you have already provided a {@link LiveData} source via {@link Builder#source(LiveData)},
+ * calling this method will throw an {@link IllegalStateException}.
+ *
+ * @param newList The new LazyList to observe.
+ */
+ @MainThread
+ public void setLazyList(@Nullable LazyList<Value> newList) {
+ if (mCanSetList) {
+ setPagerBase(newList);
+ } else {
+ throw new IllegalStateException("When an AdapterHelper is observing a LiveData, you"
+ + " cannot set the list on it because it will be overridden by the LiveData"
+ + " source");
+ }
+ }
+
+ @SuppressWarnings("WeakerAccess")
+ @MainThread
+ void internalSetLazyList(@Nullable LazyList<Value> newList) {
+ setPagerBase(newList);
+ }
+
+ @Override
+ void addCallback(PagerBase<Value> list) {
+ ((LazyList<Value>) list).addCallback(mChangeCallback);
+ }
+
+ @Override
+ void removeCallback(PagerBase<Value> list) {
+ ((LazyList<Value>) list).removeCallback(mChangeCallback);
+ }
+
+ /**
+ * Creates a {@link Builder} that can be used to construct a {@link LazyListAdapterHelper}.
+ *
+ * @param <Value> The type parameter for the {@link LazyListAdapterHelper}.
+ * @return a new {@link Builder}.
+ */
+ public static <Value> Builder<Value> builder() {
+ return new Builder<>();
+ }
+
+
+ /**
+ * Builder class for {@link LazyListAdapterHelper}.
+ * <p>
+ * You must at least provide an {@link DiffCallback} and also one of the
+ * {@link Builder#adapter(RecyclerView.Adapter)} or
+ * {@link Builder#updateCallback(ListUpdateCallback)}.
+ *
+ * @param <Value> Data type held by the adapter helper.
+ */
+ @SuppressWarnings("WeakerAccess")
+ public static class Builder<Value> {
+ private DiffCallback<Value> mDiffCallback;
+ private ListUpdateCallback mUpdateCallback;
+ private LifecycleOwner mLifecycle;
+ private LiveData<LazyList<Value>> mLiveData;
+ private Executor mMainThreadExecutor;
+ private Executor mBackgroundThreadExecutor;
+
+ /**
+ * Sets the {@link android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter}
+ * instance that will receive the update events.
+ * <p>
+ * If you have a more complex case where your adapter has additional items from different
+ * data sources, you can use the {@link #updateCallback(ListUpdateCallback)} to manually
+ * dispatch changes to your adapter.
+ *
+ * @param adapter The adapter to receive change/move/insert/remove updates when the data
+ * provided by the helper changes.
+ */
+ public Builder<Value> adapter(RecyclerView.Adapter adapter) {
+ return updateCallback(new PagerBaseAdapterHelper.AdapterCallback(adapter));
+ }
+
+ /**
+ * Sets the ListUpdateCallback that will receive updates as the data maintained by the
+ * helper is updated.
+ * <p>
+ * In simple cases, you can instead pass your Adapter to
+ * {@link #adapter(RecyclerView.Adapter)} to receive updates in the form of e.g.
+ * {@link android.support.v7.widget.RecyclerView.Adapter#notifyItemRangeChanged(int, int)}
+ * or
+ * {@link android.support.v7.widget.RecyclerView.Adapter#notifyItemRangeInserted(int, int)}
+ * on your adapter.
+ *
+ * @param callback The callback to receive change/move/insert/remove updates when the data
+ * provided by the helper changes.
+ */
+ public Builder<Value> updateCallback(ListUpdateCallback callback) {
+ mUpdateCallback = callback;
+ return this;
+ }
+
+ /**
+ * The {@link DiffCallback} to be used while diffing an old list with the updated one.
+ * Must be provided.
+ *
+ * @param diffCallback The {@link DiffCallback} instance to compare items in the list.
+ * @return this
+ */
+ public Builder<Value> diffCallback(DiffCallback<Value> diffCallback) {
+ mDiffCallback = diffCallback;
+ return this;
+ }
+
+ /**
+ * Assigns a lifecycle to the {@link LazyListAdapterHelper} so that it can cancel the
+ * observers automatically when the lifecycle is destroyed. This is especially useful if
+ * the actual {@link LazyList} is owned by a
+ * {@link android.arch.lifecycle.ViewModel ViewModel} or any other class that outlives
+ * the {@link android.app.Activity Activity} or the
+ * {@link android.support.v4.app.Fragment Fragment}.
+ * <p>
+ * Optional. If you don't provide this and the {@link LazyList} outlives the
+ * {@link android.support.v7.widget.RecyclerView.Adapter Adapter}, you should call
+ * {@link LazyListAdapterHelper#setLazyList(LazyList)} with {@code null} when the UI
+ * element is destroyed.
+ *
+ * @param lifecycleOwner The {@link LifecycleOwner} where the adapter lives.
+ * @return this
+ */
+ public Builder<Value> lifecycle(LifecycleOwner lifecycleOwner) {
+ mLifecycle = lifecycleOwner;
+ return this;
+ }
+
+ /**
+ * If provided, the created {@link LazyListAdapterHelper} will observe the given
+ * {@code source} automatically. If you provide a {@code source}, you must also provide a
+ * {@link LifecycleOwner} via the {@link #lifecycle(LifecycleOwner)} method.
+ *
+ * @param source The LiveData source that should be observed.
+ * @return this
+ */
+ public Builder<Value> source(LiveData<LazyList<Value>> source) {
+ mLiveData = source;
+ return this;
+ }
+
+ /**
+ * If provided, {@link LazyListAdapterHelper} will use the given executor to execute adapter
+ * update notifications on the main thread.
+ * <p>
+ * If not provided, it will default to the UI thread.
+ *
+ * @param executor The executor which can run tasks in the UI thread.
+ * @return this
+ */
+ public Builder<Value> mainThreadExecutor(Executor executor) {
+ mMainThreadExecutor = executor;
+ return this;
+ }
+
+ /**
+ * If provided, {@link LazyListAdapterHelper} will use the given executor to calculate the
+ * diff between an old and a new list.
+ * <p>
+ * If not provided, defaults to the IO thread pool from Architecture Components.
+ *
+ * @param executor The background executor to run list diffing.
+ * @return this
+ */
+ public Builder<Value> backgroundThreadExecutor(Executor executor) {
+ mBackgroundThreadExecutor = executor;
+ return this;
+ }
+
+ /**
+ * Creates a {@link LazyListAdapterHelper} with the given parameters.
+ *
+ * @return A new LazyListAdapterHelper.
+ */
+ public LazyListAdapterHelper<Value> create() {
+ if (mDiffCallback == null) {
+ throw new IllegalArgumentException("Must provide a diffCallback");
+ }
+ if (mUpdateCallback == null) {
+ throw new IllegalArgumentException(
+ "must provide either an adapter or update callback");
+ }
+ if (mBackgroundThreadExecutor == null) {
+ mBackgroundThreadExecutor = AppToolkitTaskExecutor.getIOThreadExecutor();
+ }
+ if (mMainThreadExecutor == null) {
+ mMainThreadExecutor = AppToolkitTaskExecutor.getMainThreadExecutor();
+ }
+ final LazyListAdapterHelper<Value> result =
+ new LazyListAdapterHelper<>(
+ mMainThreadExecutor,
+ mBackgroundThreadExecutor,
+ mUpdateCallback, mDiffCallback,
+ mLiveData == null);
+
+ if (mLifecycle != null) {
+ mLifecycle.getLifecycle().addObserver(new LifecycleObserver() {
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void clear() {
+ result.internalSetLazyList(null);
+ }
+ });
+ }
+ if (mLiveData != null) {
+ if (mLifecycle == null) {
+ throw new IllegalArgumentException(
+ "If you provide a LiveData to be observed, you must also provide a"
+ + " Livecycle via the lifecycle() method.");
+ }
+ mLiveData.observe(mLifecycle, new Observer<LazyList<Value>>() {
+ @Override
+ public void onChanged(@Nullable LazyList<Value> valueLazyList) {
+ result.internalSetLazyList(valueLazyList);
+ }
+ });
+ }
+ return result;
+ }
+ }
+}
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/LiveLazyListProvider.java b/paging/runtime/src/main/java/android/arch/util/paging/LiveLazyListProvider.java
new file mode 100644
index 0000000..f39ce85
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/LiveLazyListProvider.java
@@ -0,0 +1,96 @@
+/*
+ * 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.arch.util.paging;
+
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.lifecycle.ComputableLiveData;
+import android.arch.lifecycle.LiveData;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
+
+/**
+ * This class wraps to {@link android.arch.util.paging.CountedDataSource CountedDataSource} and can
+ * provide a {@link android.arch.lifecycle.LiveData LiveData} of
+ * {@link android.arch.util.paging.LazyList LazyList}.
+ *
+ * @param <T> Data type produced by the CountedDataSource, and held by the LazyLists.
+ *
+ * @see LazyListAdapterHelper
+ */
+public abstract class LiveLazyListProvider<T> {
+
+ /**
+ * Construct a new data source to be wrapped in a new LazyList, which will be returned through
+ * the LiveData.
+ *
+ * @return The data source.
+ */
+ @SuppressWarnings("WeakerAccess")
+ @WorkerThread
+ protected abstract CountedDataSource<T> createDataSource();
+
+ /**
+ * Creates a LiveData of LazyLists, given the ListConfig.
+ * <p>
+ * This LiveData can be passed to a {@link LazyListAdapterHelper} to be displayed with a
+ * {@link android.support.v7.widget.RecyclerView}.
+ *
+ * @param configuration ListConfig to use with created LazyLists. This specifies how the lists
+ * will load data.
+ *
+ * @return The LiveData of LazyLists.
+ */
+ public LiveData<LazyList<T>> create(final ListConfig configuration) {
+ return new ComputableLiveData<LazyList<T>>() {
+ @Nullable
+ private LazyList<T> mList;
+ @Nullable
+ private CountedDataSource<T> mDataSource;
+
+ private final DataSourceBase.InvalidatedCallback mCallback =
+ new DataSourceBase.InvalidatedCallback() {
+ @Override
+ public void onInvalidated() {
+ invalidate();
+ }
+ };
+
+ @Override
+ protected LazyList<T> compute() {
+ int loadAfterPos = mList == null ? -2 : mList.getInitialLoadPosition();
+
+ boolean done = true;
+ do {
+ if (mDataSource != null) {
+ mDataSource.removeInvalidatedCallback(mCallback);
+ }
+
+ mDataSource = createDataSource();
+ mDataSource.addInvalidatedCallback(mCallback);
+ mList = new LazyList<>(mDataSource,
+ AppToolkitTaskExecutor.getMainThreadExecutor(),
+ AppToolkitTaskExecutor.getIOThreadExecutor(),
+ configuration);
+ if (loadAfterPos >= -1) {
+ done = mList.internalInit(loadAfterPos);
+ }
+ } while (!done);
+ return mList;
+ }
+ }.getLiveData();
+ }
+}
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/LivePagedListProvider.java b/paging/runtime/src/main/java/android/arch/util/paging/LivePagedListProvider.java
new file mode 100644
index 0000000..177e639
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/LivePagedListProvider.java
@@ -0,0 +1,95 @@
+/*
+ * 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.arch.util.paging;
+
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.lifecycle.ComputableLiveData;
+import android.arch.lifecycle.LiveData;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
+
+/**
+ * @param <K> Key type of the DataSource, used to initialize PagedLists.
+ * @param <T> Data type produced by the DataSource, and held by the PagedLists.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class LivePagedListProvider<K, T> {
+
+ /**
+ * Construct a new data source to be wrapped in a new PagedList, which will be returned through
+ * the LiveData.
+ *
+ * @return The data source.
+ */
+ @SuppressWarnings("WeakerAccess")
+ @WorkerThread
+ protected abstract DataSource<K, T> createDataSource();
+
+ /**
+ * Creates a LiveData of PagedLists, given the ListConfig.
+ * <p>
+ * This LiveData can be passed to a {@link PagedListAdapterHelper} to be displayed with a
+ * {@link android.support.v7.widget.RecyclerView}.
+ *
+ * @param configuration ListConfig to use with created PagedLists. This specifies how the lists
+ * will load data.
+ *
+ * @return The LiveData of LazyLists.
+ */
+ public LiveData<PagedList<T>> create(final ListConfig configuration) {
+ return new ComputableLiveData<PagedList<T>>() {
+ @Nullable
+ private PagedList<T> mList;
+ @Nullable
+ private DataSource<K, T> mDataSource;
+
+ private final DataSourceBase.InvalidatedCallback mCallback =
+ new DataSourceBase.InvalidatedCallback() {
+ @Override
+ public void onInvalidated() {
+ invalidate();
+ }
+ };
+
+ @Override
+ protected PagedList<T> compute() {
+ PagedList<T> old = mList;
+
+ boolean done = true;
+ do {
+ if (mDataSource != null) {
+ mDataSource.removeInvalidatedCallback(mCallback);
+ }
+
+ mDataSource = createDataSource();
+ mDataSource.addInvalidatedCallback(mCallback);
+ mList = new PagedList<>(mDataSource,
+ AppToolkitTaskExecutor.getMainThreadExecutor(),
+ AppToolkitTaskExecutor.getIOThreadExecutor(),
+ configuration);
+ if (old != null) {
+ done = mList.initializeFrom(old);
+ }
+ } while (!done);
+ return mList;
+ }
+ }.getLiveData();
+ }
+}
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/PagedListAdapterHelper.java b/paging/runtime/src/main/java/android/arch/util/paging/PagedListAdapterHelper.java
new file mode 100644
index 0000000..0f29cbb
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/PagedListAdapterHelper.java
@@ -0,0 +1,83 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v7.util.ListUpdateCallback;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Helper object for mapping a {@link PagedList} into a
+ * {@link android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter} - both the paging in
+ * of new content as more data is loaded, and updates in the form of new PagedLists.
+ *
+ * @param <Value> Type of the PagedLists this helper will receive.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class PagedListAdapterHelper<Value> extends PagerBaseAdapterHelper<Value> {
+ private PagedList.ChangeCallback mChangeCallback = new PagedList.ChangeCallback() {
+ @Override
+ public void onInserted(int start, int count) {
+ mListUpdateCallback.onInserted(start, count);
+ }
+ };
+
+ public PagedListAdapterHelper(
+ @NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ @NonNull ListUpdateCallback listUpdateCallback,
+ @NonNull DiffCallback<Value> diffCallback) {
+ super(mainThreadExecutor, backgroundThreadExecutor, listUpdateCallback, diffCallback);
+ }
+
+ @Override
+ @NonNull
+ public Value get(int index) {
+ return super.get(index);
+ }
+
+ /**
+ * Sets the paged list for this adapter helper. If you are manually observing the
+ * {@link PagedList} for changes, you should call this method with the new
+ * {@link PagedList} when the previous one is invalidated.
+ * <p>
+ * Adapter helper will calculate the diff between this list and the previous one on a background
+ * thread then replace the data with this one, while unsubscribing from the previous list and
+ * subscribing to the new one.
+ *
+ * @param newList The new PagedList to observe.
+ */
+ @MainThread
+ public void setPagedList(@Nullable PagedList<Value> newList) {
+ setPagerBase(newList);
+ }
+
+ @Override
+ void addCallback(PagerBase<Value> list) {
+ ((PagedList<Value>) list).addCallback(mChangeCallback);
+ }
+
+ @Override
+ void removeCallback(PagerBase<Value> list) {
+ ((PagedList<Value>) list).removeCallback(mChangeCallback);
+ }
+}
diff --git a/paging/runtime/src/main/java/android/arch/util/paging/PagerBaseAdapterHelper.java b/paging/runtime/src/main/java/android/arch/util/paging/PagerBaseAdapterHelper.java
new file mode 100644
index 0000000..659298f
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/util/paging/PagerBaseAdapterHelper.java
@@ -0,0 +1,240 @@
+/*
+ * 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.arch.util.paging;
+
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
+import android.support.v7.util.DiffUtil;
+import android.support.v7.util.ListUpdateCallback;
+import android.support.v7.widget.RecyclerView;
+
+import java.util.concurrent.Executor;
+
+/**
+ * @param <Value> Type of the PagerBases this helper will receive.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class PagerBaseAdapterHelper<Value> {
+ final ListUpdateCallback mListUpdateCallback;
+ private final DiffCallback<Value> mDiffCallback;
+ private final Executor mMainThreadExecutor;
+ private final Executor mBackgroundThreadExecutor;
+
+ /**
+ * Default ListUpdateCallback that dispatches directly to an adapter. Can be replaced by a
+ * custom ListUpdateCallback if e.g. your adapter has a header in it, and so has an offset
+ * between list positions and adapter positions.
+ */
+ public static class AdapterCallback implements ListUpdateCallback {
+ private final RecyclerView.Adapter mAdapter;
+
+ public AdapterCallback(RecyclerView.Adapter adapter) {
+ mAdapter = adapter;
+ }
+
+ @Override
+ public void onInserted(int position, int count) {
+ mAdapter.notifyItemRangeInserted(position, count);
+ }
+
+ @Override
+ public void onRemoved(int position, int count) {
+ mAdapter.notifyItemRangeRemoved(position, count);
+ }
+
+ @Override
+ public void onMoved(int fromPosition, int toPosition) {
+ mAdapter.notifyItemMoved(fromPosition, toPosition);
+ }
+
+ @Override
+ public void onChanged(int position, int count, Object payload) {
+ mAdapter.notifyItemRangeChanged(position, count, payload);
+ }
+ }
+
+ PagerBaseAdapterHelper(
+ @NonNull Executor mainThreadExecutor, @NonNull Executor backgroundThreadExecutor,
+ @NonNull ListUpdateCallback listUpdateCallback,
+ @NonNull DiffCallback<Value> diffCallback) {
+ mMainThreadExecutor = mainThreadExecutor;
+ mBackgroundThreadExecutor = backgroundThreadExecutor;
+ mListUpdateCallback = listUpdateCallback;
+ mDiffCallback = diffCallback;
+ }
+
+ private PagerBase<Value> mList;
+ private PagerBase<Value> mProcessingList;
+ private PagerBase<Value> mQueuedList;
+ private DiffUtil.DiffResult mDiffResult;
+
+ /**
+ * Get the current list item at the given index. Index must be less than value of
+ * {@link #getItemCount()}.
+ */
+ public Value get(int index) {
+ return mList.get(index);
+ }
+
+ /**
+ * Returns the number of items in the list. This count includes all items (even the ones that
+ * are not yet loaded into memory).
+ *
+ * @return The number of items in the list.
+ */
+ public int getItemCount() {
+ return mList == null ? 0 : mList.size();
+ }
+
+ @NonNull
+ private DiffUtil.DiffResult computeDiff(
+ final PagerBase<Value> oldList, final PagerBase<Value> newList) {
+ return DiffUtil.calculateDiff(new DiffUtil.Callback() {
+ @Nullable
+ @Override
+ public Object getChangePayload(int oldItemPosition, int newItemPosition) {
+ return null;
+ }
+
+ @Override
+ public int getOldListSize() {
+ return oldList.size();
+ }
+
+ @Override
+ public int getNewListSize() {
+ return newList.size();
+ }
+
+ @Override
+ public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
+ Value oldItem = oldList.access(oldItemPosition);
+ Value newItem = newList.access(newItemPosition);
+ if (oldItem == newItem) {
+ return true;
+ }
+ if (oldItem == null || newItem == null) {
+ return false;
+ }
+ return mDiffCallback.areItemsTheSame(oldItem, newItem);
+ }
+
+ @Override
+ public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
+ Value oldItem = oldList.access(oldItemPosition);
+ Value newItem = newList.access(newItemPosition);
+ if (oldItem == newItem) {
+ return true;
+ }
+ if (oldItem == null || newItem == null) {
+ return false;
+ }
+
+ return mDiffCallback.areContentsTheSame(oldItem, newItem);
+ }
+ }, false);
+ }
+
+ private void applyDiff(DiffUtil.DiffResult diffResult) {
+ diffResult.dispatchUpdatesTo(mListUpdateCallback);
+ }
+
+ private Runnable mBackgroundDiffRunnable = new Runnable() {
+ @WorkerThread
+ @Override
+ public void run() {
+ mDiffResult = computeDiff(mList, mProcessingList);
+ mMainThreadExecutor.execute(mApplyDiffRunnable);
+ }
+ };
+
+ private Runnable mApplyDiffRunnable = new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ if (mQueuedList == null) {
+ // null list queued, trigger immediately
+ removeCallback(mList);
+ mListUpdateCallback.onRemoved(0, mList.size());
+ mList = null;
+ mProcessingList = null;
+ mDiffResult = null;
+ return;
+ }
+
+ // apply processing list, dispatching updates
+ removeCallback(mList);
+ mList = mProcessingList;
+ addCallback(mList);
+
+ applyDiff(mDiffResult);
+ mDiffResult = null;
+
+ if (mQueuedList == mProcessingList) {
+ // no further work
+ mProcessingList = null;
+ mQueuedList = null;
+ } else {
+ // enqueue diff for most recent PagerBase
+ mProcessingList = mQueuedList;
+ mBackgroundThreadExecutor.execute(mBackgroundDiffRunnable);
+ }
+ }
+ };
+
+ @MainThread
+ void setPagerBase(@Nullable PagerBase<Value> newList) {
+ if (mList == null) {
+ // first list
+ mList = newList;
+ if (mList != null) {
+ addCallback(mList);
+ mListUpdateCallback.onInserted(0, mList.size());
+ }
+ } else if (mProcessingList == null) {
+ if (newList == null) {
+ // swap in immediately
+ removeCallback(mList);
+ mListUpdateCallback.onRemoved(0, mList.size());
+ mList = null;
+ } else {
+ // not working on a list, enqueue runnable
+ mProcessingList = newList;
+ mQueuedList = newList;
+ mBackgroundThreadExecutor.execute(mBackgroundDiffRunnable);
+ }
+ } else {
+ // already working on new list, enqueue work. Note that this includes a null list,
+ // which is greedily applied in mApplyDiffRunnable. For simplicity, we don't attempt to
+ mQueuedList = newList;
+ }
+
+ }
+
+ abstract void addCallback(PagerBase<Value> list);
+ abstract void removeCallback(PagerBase<Value> list);
+
+ @Override
+ public String toString() {
+ return mList + ", " + mProcessingList + ", " + mQueuedList;
+ }
+}
diff --git a/percent/build.gradle b/percent/build.gradle
index 90c2962..bd129d7 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -2,11 +2,12 @@
archivesBaseName = 'percent'
dependencies {
- compile project(':support-compat')
- androidTestCompile (libs.test_runner) {
+ api project(':support-compat')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
}
diff --git a/percent/lint-baseline.xml b/percent/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/percent/lint-baseline.xml
+++ b/percent/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index 9becae9..86743d3 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -2,7 +2,7 @@
archivesBaseName = 'recommendation'
dependencies {
- compile project(':support-v4')
+ api project(':support-v4')
}
android {
diff --git a/recommendation/lint-baseline.xml b/recommendation/lint-baseline.xml
index 4d3d334..e961253 100644
--- a/recommendation/lint-baseline.xml
+++ b/recommendation/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/room/common/src/main/java/android/arch/persistence/room/Query.java b/room/common/src/main/java/android/arch/persistence/room/Query.java
index 4462547..bd838e8 100644
--- a/room/common/src/main/java/android/arch/persistence/room/Query.java
+++ b/room/common/src/main/java/android/arch/persistence/room/Query.java
@@ -68,6 +68,12 @@
* (like fetching an {@link Entity} row that does not exist).
* You can return {@code Flowable<T[]>} or {@code Flowable<List<T>>} to workaround this limitation.
* <p>
+ * Both {@code Flowable<T>} and {@code Publisher<T>} will observe the database for changes and
+ * re-dispatch if data changes. If you want to query the database without observing changes, you can
+ * use {@code Maybe<T>} or {@code Single<T>}. If a {@code Single<T>} query returns {@code null},
+ * Room will throw
+ * {@link android.arch.persistence.room.EmptyResultSetException EmptyResultSetException}.
+ * <p>
* UPDATE or DELETE queries can return {@code void} or {@code int}. If it is an {@code int},
* the value is the number of rows affected by this query.
* <p>
diff --git a/room/common/src/main/java/android/arch/persistence/room/Relation.java b/room/common/src/main/java/android/arch/persistence/room/Relation.java
index 5cb4bf7..0d2f152 100644
--- a/room/common/src/main/java/android/arch/persistence/room/Relation.java
+++ b/room/common/src/main/java/android/arch/persistence/room/Relation.java
@@ -16,6 +16,11 @@
package android.arch.persistence.room;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
/**
* A convenience annotation which can be used in a Pojo to automatically fetch relation entities.
* When the Pojo is returned from a query, all of its relations are also fetched by Room.
@@ -57,7 +62,7 @@
* public class UserAllPets {
* {@literal @}Embedded
* public User user;
- * {@literal @}Relation(parentColumn = "user.id", entityColumn = "userId", entity = Pet.class)
+ * {@literal @}Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class)
* public List<PetNameAndId> pets;
* }
* {@literal @}Dao
@@ -78,7 +83,7 @@
* public class UserAndAllPets {
* {@literal @}Embedded
* public User user;
- * {@literal @}Relation(parentColumn = "user.id", entityColumn = "userId", entity = Pet.class,
+ * {@literal @}Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class,
* projection = {"name"})
* public List<String> petNames;
* }
@@ -88,7 +93,12 @@
* cannot have relations. This is a design decision to avoid common pitfalls in {@link Entity}
* setups. You can read more about it in the main Room documentation. When loading data, you can
* simply work around this limitation by creating Pojo classes that extend the {@link Entity}.
+ *
+ * Note that the {@code @Relation} annotated field cannot be a constructor parameter, it must be
+ * public or have a public setter.
*/
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.CLASS)
public @interface Relation {
/**
* The entity to fetch the item from. You don't need to set this if the entity matches the
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index b189e44..0802a06 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -24,6 +24,14 @@
main.java.srcDirs += antlrOut
}
project.ext.noDocs = true
+
+// Temporary hack to stop AS to adding two guavas into test's classpath
+configurations.all {
+ resolutionStrategy {
+ force libs.guava
+ }
+}
+
dependencies {
// taken from ButterKnife
def logger = new com.android.build.gradle.internal.LoggerWrapper(project.logger)
@@ -37,6 +45,7 @@
compile libs.xerial
compile libs.apache.commons.codec
testCompile libs.google_compile_testing
+ testCompile project(":paging:common")
testCompile libs.junit
testCompile libs.ij_annotations
testCompile libs.mockito_core
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/element_ext.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/element_ext.kt
index 87846e3..09b6221 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/element_ext.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/element_ext.kt
@@ -41,6 +41,11 @@
return MoreElements.isAnnotationPresent(this, klass.java)
}
+fun Element.isNonNull() =
+ asType().kind.isPrimitive
+ || hasAnnotation(android.support.annotation.NonNull::class)
+ || hasAnnotation(org.jetbrains.annotations.NotNull::class)
+
/**
* Checks if it has all of the annotations
*/
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
index 72b9427..fa2f342 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
@@ -78,6 +78,21 @@
ClassName.get("android.arch.persistence.room.util", "TableInfo.Column")
val TABLE_INFO_FOREIGN_KEY : ClassName =
ClassName.get("android.arch.persistence.room.util", "TableInfo.ForeignKey")
+ val LIMIT_OFFSET_DATA_SOURCE : ClassName =
+ ClassName.get("android.arch.persistence.room.paging", "LimitOffsetDataSource")
+}
+
+object ArchTypeNames {
+ val APP_EXECUTOR : ClassName =
+ ClassName.get("android.arch.core.executor", "AppToolkitTaskExecutor")
+}
+
+object PagingTypeNames {
+ val COUNTED_DATA_SOURCE : ClassName =
+ ClassName.get("android.arch.util.paging", "CountedDataSource")
+ val LIVE_LAZY_LIST_PROVIDER: ClassName =
+ ClassName.get("android.arch.util.paging", "LiveLazyListProvider")
+
}
object LifecyclesTypeNames {
@@ -95,10 +110,13 @@
val LIST = ClassName.get("java.util", "List")
val SET = ClassName.get("java.util", "Set")
val STRING = ClassName.get("java.lang", "String")
+ val INTEGER = ClassName.get("java.lang", "Integer")
}
object RxJava2TypeNames {
val FLOWABLE = ClassName.get("io.reactivex", "Flowable")
+ val MAYBE = ClassName.get("io.reactivex", "Maybe")
+ val SINGLE = ClassName.get("io.reactivex", "Single")
}
object ReactiveStreamsTypeNames {
@@ -107,6 +125,8 @@
object RoomRxJava2TypeNames {
val RX_ROOM = ClassName.get("android.arch.persistence.room", "RxRoom")
+ val RX_EMPTY_RESULT_SET_EXCEPTION = ClassName.get("android.arch.persistence.room",
+ "EmptyResultSetException")
}
fun TypeName.defaultValue() : String {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
index a03ac7e..baa351d 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
@@ -477,11 +477,12 @@
return true
}
val types = context.processingEnv.typeUtils
+
val matching = candidates
.filter {
- types.isSameType(field.element.asType(), getType(it))
- && field.nameWithVariations.contains(it.simpleName.toString())
- || nameVariations.contains(it.simpleName.toString())
+ types.isAssignable(getType(it), field.element.asType())
+ && (field.nameWithVariations.contains(it.simpleName.toString())
+ || nameVariations.contains(it.simpleName.toString()))
}
.groupBy {
if (it.hasAnyOf(PUBLIC)) PUBLIC else PROTECTED
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/QueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/QueryResultBinderProvider.kt
new file mode 100644
index 0000000..b76be3e
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/QueryResultBinderProvider.kt
@@ -0,0 +1,26 @@
+/*
+ * 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.arch.persistence.room.solver
+
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import javax.lang.model.type.DeclaredType
+
+interface QueryResultBinderProvider {
+ fun provide(declared : DeclaredType, query: ParsedQuery) : QueryResultBinder
+ fun matches(declared: DeclaredType) : Boolean
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
index b966818..eca5986 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
@@ -17,10 +17,6 @@
package android.arch.persistence.room.solver
import android.arch.persistence.room.Entity
-import android.arch.persistence.room.ext.AndroidTypeNames
-import android.arch.persistence.room.ext.LifecyclesTypeNames
-import android.arch.persistence.room.ext.RoomRxJava2TypeNames
-import android.arch.persistence.room.ext.RxJava2TypeNames
import android.arch.persistence.room.ext.hasAnnotation
import android.arch.persistence.room.parser.ParsedQuery
import android.arch.persistence.room.parser.SQLTypeAffinity
@@ -28,18 +24,22 @@
import android.arch.persistence.room.processor.EntityProcessor
import android.arch.persistence.room.processor.FieldProcessor
import android.arch.persistence.room.processor.PojoProcessor
-import android.arch.persistence.room.processor.ProcessorErrors
+import android.arch.persistence.room.solver.binderprovider.CountedDataSourceQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.CursorQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.FlowableQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.InstantQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.LiveDataQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.LiveLazyListQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.RxMaybeQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.RxSingleQueryResultBinderProvider
import android.arch.persistence.room.solver.query.parameter.ArrayQueryParameterAdapter
import android.arch.persistence.room.solver.query.parameter.BasicQueryParameterAdapter
import android.arch.persistence.room.solver.query.parameter.CollectionQueryParameterAdapter
import android.arch.persistence.room.solver.query.parameter.QueryParameterAdapter
import android.arch.persistence.room.solver.query.result.ArrayQueryResultAdapter
-import android.arch.persistence.room.solver.query.result.CursorQueryResultBinder
import android.arch.persistence.room.solver.query.result.EntityRowAdapter
-import android.arch.persistence.room.solver.query.result.FlowableQueryResultBinder
import android.arch.persistence.room.solver.query.result.InstantQueryResultBinder
import android.arch.persistence.room.solver.query.result.ListQueryResultAdapter
-import android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder
import android.arch.persistence.room.solver.query.result.PojoRowAdapter
import android.arch.persistence.room.solver.query.result.QueryResultAdapter
import android.arch.persistence.room.solver.query.result.QueryResultBinder
@@ -62,13 +62,10 @@
import com.google.auto.common.MoreElements
import com.google.auto.common.MoreTypes
import com.google.common.annotations.VisibleForTesting
-import com.squareup.javapoet.TypeName
-import java.util.LinkedList
+import java.util.LinkedList;
import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
import javax.lang.model.type.TypeKind
import javax.lang.model.type.TypeMirror
-import javax.lang.model.util.Types
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
/**
@@ -87,13 +84,13 @@
companion object {
- fun copy(context : Context, store : TypeAdapterStore) : TypeAdapterStore {
+ fun copy(context: Context, store: TypeAdapterStore): TypeAdapterStore {
return TypeAdapterStore(context = context,
columnTypeAdapters = store.columnTypeAdapters,
typeConverters = store.typeConverters)
}
- fun create(context: Context, @VisibleForTesting vararg extras: Any) : TypeAdapterStore {
+ fun create(context: Context, @VisibleForTesting vararg extras: Any): TypeAdapterStore {
val adapters = arrayListOf<ColumnTypeAdapter>()
val converters = arrayListOf<TypeConverter>()
@@ -131,30 +128,26 @@
}
}
- val hasRxJava2Artifact by lazy {
- context.processingEnv.elementUtils
- .getTypeElement(RoomRxJava2TypeNames.RX_ROOM.toString()) != null
- }
+ val queryResultBinderProviders = listOf(
+ CursorQueryResultBinderProvider(context),
+ LiveDataQueryResultBinderProvider(context),
+ FlowableQueryResultBinderProvider(context),
+ RxMaybeQueryResultBinderProvider(context),
+ RxSingleQueryResultBinderProvider(context),
+ CountedDataSourceQueryResultBinderProvider(context),
+ LiveLazyListQueryResultBinderProvider(context),
+ InstantQueryResultBinderProvider(context)
+ )
// type mirrors that be converted into columns w/o an extra converter
private val knownColumnTypeMirrors by lazy {
columnTypeAdapters.map { it.out }
}
- private val liveDataTypeMirror: TypeMirror? by lazy {
- context.processingEnv.elementUtils
- .getTypeElement(LifecyclesTypeNames.LIVE_DATA.toString())?.asType()
- }
-
- private val flowableTypeMirror: TypeMirror? by lazy {
- context.processingEnv.elementUtils
- .getTypeElement(RxJava2TypeNames.FLOWABLE.toString())?.asType()
- }
-
/**
* Searches 1 way to bind a value into a statement.
*/
- fun findStatementValueBinder(input : TypeMirror, affinity: SQLTypeAffinity?)
+ fun findStatementValueBinder(input: TypeMirror, affinity: SQLTypeAffinity?)
: StatementValueBinder? {
if (input.kind == TypeKind.ERROR) {
return null
@@ -171,9 +164,9 @@
/**
* Returns which entities targets the given affinity.
*/
- private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?) : List<TypeMirror> {
+ private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?): List<TypeMirror> {
val specifiedTargets = affinity?.getTypeMirrors(context.processingEnv)
- return if(specifiedTargets == null || specifiedTargets.isEmpty()) {
+ return if (specifiedTargets == null || specifiedTargets.isEmpty()) {
knownColumnTypeMirrors
} else {
specifiedTargets
@@ -183,7 +176,7 @@
/**
* Searches 1 way to read it from cursor
*/
- fun findCursorValueReader(output: TypeMirror, affinity: SQLTypeAffinity?) : CursorValueReader? {
+ fun findCursorValueReader(output: TypeMirror, affinity: SQLTypeAffinity?): CursorValueReader? {
if (output.kind == TypeKind.ERROR) {
return null
}
@@ -203,10 +196,10 @@
* Tries to reverse the converter going through the same nodes, if possible.
*/
@VisibleForTesting
- fun reverse(converter : TypeConverter) : TypeConverter? {
- return when(converter) {
+ fun reverse(converter: TypeConverter): TypeConverter? {
+ return when (converter) {
is NoOpConverter -> converter
- is CompositeTypeConverter -> {
+ is CompositeTypeConverter -> {
val r1 = reverse(converter.conv1) ?: return null
val r2 = reverse(converter.conv2) ?: return null
CompositeTypeConverter(r2, r1)
@@ -255,55 +248,18 @@
return findTypeConverter(listOf(input), listOf(output))
}
- @VisibleForTesting
- fun isLiveData(declared: DeclaredType): Boolean {
- if (liveDataTypeMirror == null) {
- return false
- }
- val erasure = context.processingEnv.typeUtils.erasure(declared)
- return context.processingEnv.typeUtils.isAssignable(liveDataTypeMirror, erasure)
- }
-
- @VisibleForTesting
- fun isRxJava2Publisher(declared: DeclaredType): Boolean {
- if (flowableTypeMirror == null) {
- return false
- }
- val erasure = context.processingEnv.typeUtils.erasure(declared)
- val match = context.processingEnv.typeUtils.isAssignable(flowableTypeMirror, erasure)
- if (match && !hasRxJava2Artifact) {
- context.logger.e(ProcessorErrors.MISSING_ROOM_RXJAVA2_ARTIFACT)
- }
- return match
- }
-
fun findQueryResultBinder(typeMirror: TypeMirror, query: ParsedQuery): QueryResultBinder {
return if (typeMirror.kind == TypeKind.DECLARED) {
val declared = MoreTypes.asDeclared(typeMirror)
- if (declared.typeArguments.isEmpty()) {
- if (TypeName.get(declared) == AndroidTypeNames.CURSOR) {
- return CursorQueryResultBinder()
- }
- InstantQueryResultBinder(findQueryResultAdapter(typeMirror, query))
- } else {
- if (isLiveData(declared)) {
- val liveDataTypeArg = declared.typeArguments.first()
- LiveDataQueryResultBinder(liveDataTypeArg, query.tables.map { it.name },
- findQueryResultAdapter(liveDataTypeArg, query))
- } else if (isRxJava2Publisher(declared)) {
- val typeArg = declared.typeArguments.first()
- FlowableQueryResultBinder(typeArg, query.tables.map { it.name },
- findQueryResultAdapter(typeArg, query))
- } else {
- InstantQueryResultBinder(findQueryResultAdapter(typeMirror, query))
- }
- }
+ return queryResultBinderProviders.first {
+ it.matches(declared)
+ }.provide(declared, query)
} else {
InstantQueryResultBinder(findQueryResultAdapter(typeMirror, query))
}
}
- private fun findQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery)
+ fun findQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery)
: QueryResultAdapter? {
if (typeMirror.kind == TypeKind.ERROR) {
return null
@@ -422,7 +378,7 @@
return findTypeConverter(listOf(input), outputs)
}
- private fun findTypeConverter(input: List<TypeMirror>, output : TypeMirror): TypeConverter? {
+ private fun findTypeConverter(input: List<TypeMirror>, output: TypeMirror): TypeConverter? {
return findTypeConverter(input, listOf(output))
}
@@ -441,7 +397,7 @@
val excludes = arrayListOf<TypeMirror>()
val queue = LinkedList<TypeConverter>()
- fun exactMatch(candidates: List<TypeConverter>, outputs: List<TypeMirror>, types: Types)
+ fun exactMatch(candidates: List<TypeConverter>)
: TypeConverter? {
return candidates.firstOrNull {
outputs.any { output -> types.isSameType(output, it.to) }
@@ -449,7 +405,7 @@
}
inputs.forEach { input ->
val candidates = getAllTypeConverters(input, excludes)
- val match = exactMatch(candidates, outputs, types)
+ val match = exactMatch(candidates)
if (match != null) {
return match
}
@@ -463,7 +419,7 @@
val prev = queue.pop()
val from = prev.to
val candidates = getAllTypeConverters(from, excludes)
- val match = exactMatch(candidates, outputs, types)
+ val match = exactMatch(candidates)
if (match != null) {
return CompositeTypeConverter(prev, match)
}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CountedDataSourceQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CountedDataSourceQueryResultBinderProvider.kt
new file mode 100644
index 0000000..c23e31f
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CountedDataSourceQueryResultBinderProvider.kt
@@ -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 android.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.PagingTypeNames
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.CountedDataSourceQueryResultBinder
+import android.arch.persistence.room.solver.query.result.ListQueryResultAdapter
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import com.google.common.annotations.VisibleForTesting
+import javax.lang.model.type.DeclaredType
+import javax.lang.model.type.TypeMirror
+
+class CountedDataSourceQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
+ private val countedDataSourceTypeMirror: TypeMirror? by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(PagingTypeNames.COUNTED_DATA_SOURCE.toString())?.asType()
+ }
+
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ val typeArg = declared.typeArguments.first()
+ val listAdapter = context.typeAdapterStore.findRowAdapter(typeArg, query)?.let {
+ ListQueryResultAdapter(it)
+ }
+ return CountedDataSourceQueryResultBinder(listAdapter, query.tables.map { it.name })
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 1 && isCountedDataSource(declared)
+
+ private fun isCountedDataSource(declared: DeclaredType): Boolean {
+ if (countedDataSourceTypeMirror == null) {
+ return false
+ }
+ val erasure = context.processingEnv.typeUtils.erasure(declared)
+ return context.processingEnv.typeUtils.isAssignable(countedDataSourceTypeMirror
+ , erasure)
+ }
+
+
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CursorQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
new file mode 100644
index 0000000..e160672
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.AndroidTypeNames
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.CursorQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import com.squareup.javapoet.TypeName
+import javax.lang.model.type.DeclaredType
+
+class CursorQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ return CursorQueryResultBinder()
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 0 && TypeName.get(declared) == AndroidTypeNames.CURSOR
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt
new file mode 100644
index 0000000..828f5a7
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.RoomRxJava2TypeNames
+import android.arch.persistence.room.ext.RxJava2TypeNames
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.processor.ProcessorErrors
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.FlowableQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import com.google.common.annotations.VisibleForTesting
+import javax.lang.model.type.DeclaredType
+import javax.lang.model.type.TypeMirror
+
+class FlowableQueryResultBinderProvider(val context : Context) : QueryResultBinderProvider {
+ private val flowableTypeMirror: TypeMirror? by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(RxJava2TypeNames.FLOWABLE.toString())?.asType()
+ }
+
+ private val hasRxJava2Artifact by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(RoomRxJava2TypeNames.RX_ROOM.toString()) != null
+ }
+
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ val typeArg = declared.typeArguments.first()
+ return FlowableQueryResultBinder(typeArg, query.tables.map { it.name },
+ context.typeAdapterStore.findQueryResultAdapter(typeArg, query))
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 1 && isRxJava2Publisher(declared)
+
+ private fun isRxJava2Publisher(declared: DeclaredType): Boolean {
+ if (flowableTypeMirror == null) {
+ return false
+ }
+ val erasure = context.processingEnv.typeUtils.erasure(declared)
+ val match = context.processingEnv.typeUtils.isAssignable(flowableTypeMirror, erasure)
+ if (match && !hasRxJava2Artifact) {
+ context.logger.e(ProcessorErrors.MISSING_ROOM_RXJAVA2_ARTIFACT)
+ }
+ return match
+ }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/InstantQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
new file mode 100644
index 0000000..af03a88
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.InstantQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import javax.lang.model.type.DeclaredType
+
+class InstantQueryResultBinderProvider(val context : Context) : QueryResultBinderProvider {
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ return InstantQueryResultBinder(
+ context.typeAdapterStore.findQueryResultAdapter(declared, query))
+ }
+
+ override fun matches(declared: DeclaredType): Boolean = true
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
new file mode 100644
index 0000000..2aee5d2
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
@@ -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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.LifecyclesTypeNames
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import com.google.common.annotations.VisibleForTesting
+import javax.lang.model.type.DeclaredType
+import javax.lang.model.type.TypeMirror
+
+class LiveDataQueryResultBinderProvider(val context : Context) : QueryResultBinderProvider {
+ private val liveDataTypeMirror: TypeMirror? by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(LifecyclesTypeNames.LIVE_DATA.toString())?.asType()
+ }
+
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ val liveDataTypeArg = declared.typeArguments.first()
+ return LiveDataQueryResultBinder(liveDataTypeArg, query.tables.map { it.name },
+ context.typeAdapterStore.findQueryResultAdapter(liveDataTypeArg, query))
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 1 && isLiveData(declared)
+
+ private fun isLiveData(declared: DeclaredType): Boolean {
+ if (liveDataTypeMirror == null) {
+ return false
+ }
+ val erasure = context.processingEnv.typeUtils.erasure(declared)
+ return context.processingEnv.typeUtils.isAssignable(liveDataTypeMirror, erasure)
+ }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveLazyListQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveLazyListQueryResultBinderProvider.kt
new file mode 100644
index 0000000..c931d69
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveLazyListQueryResultBinderProvider.kt
@@ -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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.PagingTypeNames
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.CountedDataSourceQueryResultBinder
+import android.arch.persistence.room.solver.query.result.ListQueryResultAdapter
+import android.arch.persistence.room.solver.query.result.LiveLazyListQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import com.google.common.annotations.VisibleForTesting
+import javax.lang.model.type.DeclaredType
+import javax.lang.model.type.TypeMirror
+
+class LiveLazyListQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
+ private val livePagedListTypeMirror: TypeMirror? by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(PagingTypeNames.LIVE_LAZY_LIST_PROVIDER.toString())?.asType()
+ }
+
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ val typeArg = declared.typeArguments.first()
+ val listAdapter = context.typeAdapterStore.findRowAdapter(typeArg, query)?.let {
+ ListQueryResultAdapter(it)
+ }
+ val countedBinder = CountedDataSourceQueryResultBinder(listAdapter,
+ query.tables.map { it.name })
+ return LiveLazyListQueryResultBinder(countedBinder)
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 1 && isLivePagedList(declared)
+
+ private fun isLivePagedList(declared: DeclaredType): Boolean {
+ if (livePagedListTypeMirror == null) {
+ return false
+ }
+ val erasure = context.processingEnv.typeUtils.erasure(declared)
+ // we don't want to return paged list unless explicitly requested
+ return context.processingEnv.typeUtils.isAssignable(livePagedListTypeMirror, erasure)
+ }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
new file mode 100644
index 0000000..84c71eb
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.arch.persistence.room.solver.binderprovider
+
+import android.arch.persistence.room.ext.RoomRxJava2TypeNames
+import android.arch.persistence.room.ext.typeName
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.processor.ProcessorErrors
+import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.query.result.InstantQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import android.arch.persistence.room.solver.query.result.RxCallableQueryResultBinder
+import javax.lang.model.type.DeclaredType
+
+sealed class RxCallableQueryResultBinderProvider(val context: Context,
+ val rxType: RxCallableQueryResultBinder.RxType)
+ : QueryResultBinderProvider {
+ private val hasRxJava2Artifact by lazy {
+ context.processingEnv.elementUtils
+ .getTypeElement(RoomRxJava2TypeNames.RX_ROOM.toString()) != null
+ }
+
+ override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+ val typeArg = declared.typeArguments.first()
+ val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
+ return RxCallableQueryResultBinder(rxType,
+ typeArg, InstantQueryResultBinder(adapter), adapter)
+ }
+
+ override fun matches(declared: DeclaredType): Boolean =
+ declared.typeArguments.size == 1 && matchesRxType(declared)
+
+ private fun matchesRxType(declared: DeclaredType): Boolean {
+ val erasure = context.processingEnv.typeUtils.erasure(declared)
+ val match = erasure.typeName() == rxType.className
+ if (match && !hasRxJava2Artifact) {
+ context.logger.e(ProcessorErrors.MISSING_ROOM_RXJAVA2_ARTIFACT)
+ }
+ return match
+ }
+}
+
+class RxSingleQueryResultBinderProvider(context: Context)
+ : RxCallableQueryResultBinderProvider(context, RxCallableQueryResultBinder.RxType.SINGLE)
+
+class RxMaybeQueryResultBinderProvider(context: Context)
+ : RxCallableQueryResultBinderProvider(context, RxCallableQueryResultBinder.RxType.MAYBE)
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CountedDataSourceQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CountedDataSourceQueryResultBinder.kt
new file mode 100644
index 0000000..f91a09a
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CountedDataSourceQueryResultBinder.kt
@@ -0,0 +1,67 @@
+/*
+ * 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.arch.persistence.room.solver.query.result
+
+import android.arch.persistence.room.ext.AndroidTypeNames
+import android.arch.persistence.room.ext.CommonTypeNames
+import android.arch.persistence.room.ext.L
+import android.arch.persistence.room.ext.N
+import android.arch.persistence.room.ext.RoomTypeNames
+import android.arch.persistence.room.ext.typeName
+import android.arch.persistence.room.solver.CodeGenScope
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.ParameterSpec
+import com.squareup.javapoet.ParameterizedTypeName
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.TypeSpec
+import javax.lang.model.element.Modifier
+
+class CountedDataSourceQueryResultBinder(val listAdapter : ListQueryResultAdapter?,
+ val tableNames : List<String>)
+ : QueryResultBinder(listAdapter) {
+ val itemTypeName : TypeName = listAdapter?.rowAdapter?.out?.typeName() ?: TypeName.OBJECT
+ val typeName : ParameterizedTypeName = ParameterizedTypeName.get(
+ RoomTypeNames.LIMIT_OFFSET_DATA_SOURCE, itemTypeName)
+ override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+ scope: CodeGenScope) {
+ val tableNamesList = tableNames.joinToString(",") { "\"$it\"" }
+ val spec = TypeSpec.anonymousClassBuilder("$N, $L, $L",
+ dbField, roomSQLiteQueryVar, tableNamesList).apply {
+ superclass(typeName)
+ addMethod(createConvertRowsMethod(scope))
+ }.build()
+ scope.builder().apply {
+ addStatement("return $L", spec)
+ }
+ }
+
+ fun createConvertRowsMethod(scope : CodeGenScope): MethodSpec =
+ MethodSpec.methodBuilder("convertRows").apply {
+ addAnnotation(Override::class.java)
+ addModifiers(Modifier.PROTECTED)
+ returns(ParameterizedTypeName.get(CommonTypeNames.LIST, itemTypeName))
+ val cursorParam = ParameterSpec.builder(AndroidTypeNames.CURSOR, "cursor")
+ .build()
+ addParameter(cursorParam)
+ val resultVar = scope.getTmpVar("_res")
+ val rowsScope = scope.fork()
+ listAdapter?.convert(resultVar, cursorParam.name, rowsScope)
+ addCode(rowsScope.builder().build())
+ addStatement("return $L", resultVar)
+ }.build()
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveLazyListQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveLazyListQueryResultBinder.kt
new file mode 100644
index 0000000..c46698b
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveLazyListQueryResultBinder.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.arch.persistence.room.solver.query.result
+
+import android.arch.persistence.room.ext.L
+import android.arch.persistence.room.ext.PagingTypeNames
+import android.arch.persistence.room.ext.RoomTypeNames
+import android.arch.persistence.room.solver.CodeGenScope
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.ParameterizedTypeName
+import com.squareup.javapoet.TypeSpec
+import javax.lang.model.element.Modifier
+
+class LiveLazyListQueryResultBinder(
+ val countedDataSourceQueryResultBinder: CountedDataSourceQueryResultBinder)
+ : QueryResultBinder(countedDataSourceQueryResultBinder.listAdapter) {
+ @Suppress("HasPlatformType")
+ val typeName = countedDataSourceQueryResultBinder.itemTypeName
+ override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+ scope: CodeGenScope) {
+ scope.builder().apply {
+ val lazyListProvider = TypeSpec
+ .anonymousClassBuilder("").apply {
+ superclass(ParameterizedTypeName.get(PagingTypeNames.LIVE_LAZY_LIST_PROVIDER,
+ typeName))
+ addMethod(createCreateDataSourceMethod(roomSQLiteQueryVar, dbField, scope))
+ }.build()
+ addStatement("return $L", lazyListProvider)
+ }
+ }
+
+ private fun createCreateDataSourceMethod(roomSQLiteQueryVar: String,
+ dbField: FieldSpec,
+ scope: CodeGenScope): MethodSpec
+ = MethodSpec.methodBuilder("createDataSource").apply {
+ addAnnotation(Override::class.java)
+ addModifiers(Modifier.PROTECTED)
+ returns(countedDataSourceQueryResultBinder.typeName)
+ val countedBinderScope = scope.fork()
+ countedDataSourceQueryResultBinder.convertAndReturn(roomSQLiteQueryVar, dbField,
+ countedBinderScope)
+ addCode(countedBinderScope.builder().build())
+ }.build()
+}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
index b2cc1e0..062b179 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
@@ -112,14 +112,8 @@
outPojo = pojo,
cursorVar = cursorVarName,
fieldsWithIndices = mapping.fieldsWithIndices,
+ relationCollectors = relationCollectors,
scope = scope)
- relationCollectors.forEach {
- it.writeReadParentKeyCode(
- cursorVarName = cursorVarName,
- itemVar = outVarName,
- fieldsWithIndices = mapping.fieldsWithIndices,
- scope = scope)
- }
}
}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt
new file mode 100644
index 0000000..da960f6
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt
@@ -0,0 +1,93 @@
+/*
+ * 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.arch.persistence.room.solver.query.result
+
+import android.arch.persistence.room.ext.AndroidTypeNames
+import android.arch.persistence.room.ext.L
+import android.arch.persistence.room.ext.N
+import android.arch.persistence.room.ext.RoomRxJava2TypeNames
+import android.arch.persistence.room.ext.RxJava2TypeNames
+import android.arch.persistence.room.ext.S
+import android.arch.persistence.room.ext.T
+import android.arch.persistence.room.ext.typeName
+import android.arch.persistence.room.solver.CodeGenScope
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.ParameterizedTypeName
+import com.squareup.javapoet.TypeSpec
+import javax.lang.model.element.Modifier
+import javax.lang.model.type.TypeMirror
+
+/**
+ * Generic Result binder for Rx classes that accept a callable.
+ */
+class RxCallableQueryResultBinder(val rxType: RxType,
+ val typeArg: TypeMirror,
+ val instantBinder : InstantQueryResultBinder,
+ adapter: QueryResultAdapter?) : QueryResultBinder(adapter) {
+ override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+ scope: CodeGenScope) {
+ val callable = TypeSpec.anonymousClassBuilder("").apply {
+ val typeName = typeArg.typeName()
+ superclass(ParameterizedTypeName.get(java.util.concurrent.Callable::class.typeName(),
+ typeName))
+ addMethod(createCallMethod(roomSQLiteQueryVar, dbField, scope))
+ }.build()
+ scope.builder().apply {
+ addStatement("return $T.fromCallable($L)", rxType.className, callable)
+ }
+ }
+
+ fun createCallMethod(roomSQLiteQueryVar: String, dbField: FieldSpec,
+ scope: CodeGenScope): MethodSpec {
+ val adapterScope = scope.fork()
+ return MethodSpec.methodBuilder("call").apply {
+ returns(typeArg.typeName())
+ addException(Exception::class.typeName())
+ addModifiers(Modifier.PUBLIC)
+ val outVar = scope.getTmpVar("_result")
+ val cursorVar = scope.getTmpVar("_cursor")
+ addStatement("final $T $L = $N.query($L)", AndroidTypeNames.CURSOR, cursorVar,
+ dbField, roomSQLiteQueryVar)
+ beginControlFlow("try").apply {
+ adapter?.convert(outVar, cursorVar, adapterScope)
+ addCode(adapterScope.generate())
+ if (!rxType.canBeNull) {
+ beginControlFlow("if($L == null)", outVar).apply {
+ addStatement("throw new $T($S + $L.getSql())",
+ RoomRxJava2TypeNames.RX_EMPTY_RESULT_SET_EXCEPTION,
+ "Query returned empty result set: ",
+ roomSQLiteQueryVar)
+ }
+ endControlFlow()
+ }
+ addStatement("return $L", outVar)
+ }
+ nextControlFlow("finally").apply {
+ addStatement("$L.close()", cursorVar)
+ addStatement("$L.release()", roomSQLiteQueryVar)
+ }
+ endControlFlow()
+ }.build()
+ }
+
+ enum class RxType(val className : ClassName, val canBeNull : Boolean) {
+ SINGLE(RxJava2TypeNames.SINGLE, canBeNull = false),
+ MAYBE(RxJava2TypeNames.MAYBE, canBeNull = true);
+ }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/EmbeddedField.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/EmbeddedField.kt
index c6af79a..55e9cc4 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/EmbeddedField.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/EmbeddedField.kt
@@ -42,4 +42,8 @@
return parent.isDescendantOf(other)
}
}
+
+ fun isNonNullRecursively(): Boolean {
+ return field.nonNull && (parent == null || parent.isNonNullRecursively())
+ }
}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Field.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Field.kt
index 1bfeaee..ee6f8a1 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Field.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Field.kt
@@ -16,6 +16,7 @@
package android.arch.persistence.room.vo
+import android.arch.persistence.room.ext.isNonNull
import android.arch.persistence.room.ext.typeName
import android.arch.persistence.room.migration.bundle.FieldBundle
import android.arch.persistence.room.parser.SQLTypeAffinity
@@ -41,6 +42,9 @@
var cursorValueReader: CursorValueReader? = null
val typeName: TypeName by lazy { type.typeName() }
+ /** Whether the table column for this field should be NOT NULL */
+ val nonNull = element.isNonNull() && (parent == null || parent.isNonNullRecursively())
+
/**
* Used when reporting errors on duplicate names
*/
@@ -106,15 +110,17 @@
* definition to be used in create query
*/
fun databaseDefinition(autoIncrementPKey : Boolean) : String {
- val columnSpec = if (autoIncrementPKey) {
- " PRIMARY KEY AUTOINCREMENT"
- } else {
- ""
+ val columnSpec = StringBuilder("")
+ if (autoIncrementPKey) {
+ columnSpec.append(" PRIMARY KEY AUTOINCREMENT")
+ }
+ if (nonNull) {
+ columnSpec.append(" NOT NULL")
}
return "`$columnName` ${(affinity ?: SQLTypeAffinity.TEXT).name}$columnSpec"
}
fun toBundle(): FieldBundle = FieldBundle(pathWithDotNotation, columnName,
- affinity?.name ?: SQLTypeAffinity.TEXT.name
+ affinity?.name ?: SQLTypeAffinity.TEXT.name, nonNull
)
}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
index 26d41e4..29a6ba7 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
@@ -121,7 +121,7 @@
val fieldImpl = PreparedStatementWriter(queryWriter)
.createAnonymous(this@DaoWriter, dbField)
val methodBody = createPreparedDeleteQueryMethodBody(method, fieldSpec, queryWriter)
- PreparedStmtQuery(mapOf(method.parameters.first().name
+ PreparedStmtQuery(mapOf(PreparedStmtQuery.NO_PARAM_FIELD
to (fieldSpec to fieldImpl)), methodBody)
}
}
@@ -353,11 +353,11 @@
val scope = CodeGenScope(this)
val sqlVar = scope.getTmpVar("_sql")
val stmtVar = scope.getTmpVar("_stmt")
- queryWriter.prepareQuery(sqlVar, scope)
+ val listSizeArgs = queryWriter.prepareQuery(sqlVar, scope)
scope.builder().apply {
addStatement("$T $L = $N.compileStatement($L)",
SupportDbTypeNames.SQLITE_STMT, stmtVar, dbField, sqlVar)
- queryWriter.bindArgs(stmtVar, emptyList(), scope)
+ queryWriter.bindArgs(stmtVar, listSizeArgs, scope)
addStatement("$N.beginTransaction()", dbField)
beginControlFlow("try").apply {
if (method.returnsValue) {
@@ -402,8 +402,22 @@
}
}
+ /**
+ * Represents a query statement prepared in Dao implementation.
+ *
+ * @param fields This map holds all the member fields necessary for this query. The key is the
+ * corresponding parameter name in the defining query method. The value is a pair from the field
+ * declaration to definition.
+ * @param methodImpl The body of the query method implementation.
+ */
data class PreparedStmtQuery(val fields: Map<String, Pair<FieldSpec, TypeSpec>>,
- val methodImpl: MethodSpec)
+ val methodImpl: MethodSpec) {
+ companion object {
+ // The key to be used in `fields` where the method requires a field that is not
+ // associated with any of its parameters
+ const val NO_PARAM_FIELD = "-"
+ }
+ }
private class InsertionMethodField(val entity: Entity, val onConflictText: String)
: SharedFieldSpec(
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/EntityCursorConverterWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/EntityCursorConverterWriter.kt
index 1a8af7e..a83d191 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/EntityCursorConverterWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/EntityCursorConverterWriter.kt
@@ -78,6 +78,7 @@
outPojo = entity,
cursorVar = cursorParam.name,
fieldsWithIndices = fieldsWithIndices,
+ relationCollectors = emptyList(), // no relationship for entities
scope = scope)
addStatement("return $L", entityVar)
}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/FieldReadWriteWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/FieldReadWriteWriter.kt
index efe57e7..8df3feb 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/FieldReadWriteWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/FieldReadWriteWriter.kt
@@ -27,6 +27,7 @@
import android.arch.persistence.room.vo.EmbeddedField
import android.arch.persistence.room.vo.FieldWithIndex
import android.arch.persistence.room.vo.Pojo
+import android.arch.persistence.room.vo.RelationCollector
import com.squareup.javapoet.TypeName
/**
@@ -166,7 +167,8 @@
outPojo : Pojo,
cursorVar: String,
fieldsWithIndices: List<FieldWithIndex>,
- scope: CodeGenScope) {
+ scope: CodeGenScope,
+ relationCollectors : List<RelationCollector>) {
fun visitNode(node: Node) {
val fieldParent = node.fieldParent
fun readNode() {
@@ -203,6 +205,16 @@
cursorVar = cursorVar,
scope = scope)
}
+ // assign relationship fields which will be read later
+ relationCollectors.filter { (relation) ->
+ relation.field.parent === fieldParent
+ }.forEach {
+ it.writeReadParentKeyCode(
+ cursorVarName = cursorVar,
+ itemVar = node.varName,
+ fieldsWithIndices = fieldsWithIndices,
+ scope = scope)
+ }
// assign sub modes to fields if they were not part of the constructor.
node.subNodes.map {
val setter = it.fieldParent?.setter
@@ -211,9 +223,7 @@
} else {
null
}
- }.filterNotNull().forEach { pair ->
- val varName = pair.first
- val setter = pair.second
+ }.filterNotNull().forEach { (varName, setter) ->
setter.writeSet(
ownerVar = node.varName,
inVar = varName,
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/QueryWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/QueryWriter.kt
index 9e72bef..2bf471a 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/QueryWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/QueryWriter.kt
@@ -50,8 +50,9 @@
bindArgs(outRoomSQLiteQueryVar, listSizeVars, scope)
}
- fun prepareQuery(outSqlQueryName: String, scope: CodeGenScope) {
- createSqlQueryAndArgs(outSqlQueryName, null, scope)
+ fun prepareQuery(outSqlQueryName: String, scope: CodeGenScope)
+ : List<Pair<QueryParameter, String>> {
+ return createSqlQueryAndArgs(outSqlQueryName, null, scope)
}
private fun createSqlQueryAndArgs(outSqlQueryName: String, outArgsName: String?,
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriter.kt
index 50dcb32..afb12e9 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriter.kt
@@ -16,7 +16,6 @@
package android.arch.persistence.room.writer
-import android.support.annotation.VisibleForTesting
import android.arch.persistence.room.ext.L
import android.arch.persistence.room.ext.N
import android.arch.persistence.room.ext.RoomTypeNames
@@ -26,6 +25,7 @@
import android.arch.persistence.room.solver.CodeGenScope
import android.arch.persistence.room.vo.Database
import android.arch.persistence.room.vo.Entity
+import android.support.annotation.VisibleForTesting
import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.ParameterSpec
import com.squareup.javapoet.TypeSpec
@@ -67,7 +67,8 @@
superclass(RoomTypeNames.OPEN_HELPER_DELEGATE)
addMethod(createCreateAllTables())
addMethod(createDropAllTables())
- addMethod(createOnOpen())
+ addMethod(createOnCreate(scope.fork()))
+ addMethod(createOnOpen(scope.fork()))
addMethod(createValidateMigration(scope.fork()))
}.build()
}
@@ -85,7 +86,15 @@
}.build()
}
- private fun createOnOpen(): MethodSpec {
+ private fun createOnCreate(scope: CodeGenScope): MethodSpec {
+ return MethodSpec.methodBuilder("onCreate").apply {
+ addModifiers(PROTECTED)
+ addParameter(SupportDbTypeNames.DB, "_db")
+ invokeCallbacks(scope, "onCreate")
+ }.build()
+ }
+
+ private fun createOnOpen(scope: CodeGenScope): MethodSpec {
return MethodSpec.methodBuilder("onOpen").apply {
addModifiers(PUBLIC)
addParameter(SupportDbTypeNames.DB, "_db")
@@ -94,6 +103,7 @@
addStatement("_db.execSQL($S)", "PRAGMA foreign_keys = ON")
}
addStatement("internalInitInvalidationTracker(_db)")
+ invokeCallbacks(scope, "onOpen")
}.build()
}
@@ -117,6 +127,19 @@
}.build()
}
+ private fun MethodSpec.Builder.invokeCallbacks(scope: CodeGenScope, methodName: String) {
+ val iVar = scope.getTmpVar("_i")
+ val sizeVar = scope.getTmpVar("_size")
+ beginControlFlow("if (mCallbacks != null)").apply {
+ beginControlFlow("for (int $N = 0, $N = mCallbacks.size(); $N < $N; $N++)",
+ iVar, sizeVar, iVar, sizeVar, iVar).apply {
+ addStatement("mCallbacks.get($N).$N(_db)", iVar, methodName)
+ }
+ endControlFlow()
+ }
+ endControlFlow()
+ }
+
@VisibleForTesting
fun createQuery(entity : Entity) : String {
return entity.createTableQuery
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
index 8da4c12..e27600a 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
@@ -45,10 +45,11 @@
addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
columnListType, entity.fields.size)
entity.fields.forEachIndexed { index, field ->
- addStatement("$L.put($S, new $T($S, $S, $L))",
+ addStatement("$L.put($S, new $T($S, $S, $L, $L))",
columnListVar, field.columnName, RoomTypeNames.TABLE_INFO_COLUMN,
/*name*/ field.columnName,
/*type*/ field.affinity?.name ?: SQLTypeAffinity.TEXT.name,
+ /*nonNull*/ field.nonNull,
/*pkeyPos*/ entity.primaryKey.fields.indexOf(field) + 1)
}
diff --git a/room/compiler/src/test/data/common/input/LiveLazyListProvider.java b/room/compiler/src/test/data/common/input/LiveLazyListProvider.java
new file mode 100644
index 0000000..4c12f05
--- /dev/null
+++ b/room/compiler/src/test/data/common/input/LiveLazyListProvider.java
@@ -0,0 +1,20 @@
+/*
+ * 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.arch.util.paging;
+
+abstract public class LiveLazyListProvider<T> {
+}
\ No newline at end of file
diff --git a/room/compiler/src/test/data/daoWriter/input/ComplexDao.java b/room/compiler/src/test/data/daoWriter/input/ComplexDao.java
index ea36fde..ca90163 100644
--- a/room/compiler/src/test/data/daoWriter/input/ComplexDao.java
+++ b/room/compiler/src/test/data/daoWriter/input/ComplexDao.java
@@ -18,7 +18,6 @@
import android.arch.persistence.room.*;
import java.util.List;
import android.arch.lifecycle.LiveData;
-
@Dao
abstract class ComplexDao {
static class FullName {
diff --git a/room/compiler/src/test/data/daoWriter/input/DeletionDao.java b/room/compiler/src/test/data/daoWriter/input/DeletionDao.java
index a531ad6..997f290 100644
--- a/room/compiler/src/test/data/daoWriter/input/DeletionDao.java
+++ b/room/compiler/src/test/data/daoWriter/input/DeletionDao.java
@@ -45,4 +45,7 @@
@Delete
void deleteUserAndBook(User user, Book book);
+
+ @Query("DELETE FROM user")
+ int deleteEverything();
}
diff --git a/room/compiler/src/test/data/daoWriter/input/UpdateDao.java b/room/compiler/src/test/data/daoWriter/input/UpdateDao.java
index b9a80c1..040b5c7 100644
--- a/room/compiler/src/test/data/daoWriter/input/UpdateDao.java
+++ b/room/compiler/src/test/data/daoWriter/input/UpdateDao.java
@@ -39,4 +39,10 @@
@Update
void updateUserAndBook(User user, Book book);
+
+ @Query("UPDATE User SET ageColumn = ageColumn + 1 WHERE uid = :uid")
+ void ageUserByUid(String uid);
+
+ @Query("UPDATE User SET ageColumn = ageColumn + 1")
+ void ageUserAll();
}
diff --git a/room/compiler/src/test/data/daoWriter/output/DeletionDao.java b/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
index e0487a0..d5e173f 100644
--- a/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
+++ b/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
@@ -21,6 +21,8 @@
private final SharedSQLiteStatement __preparedStmtOfDeleteByUid;
+ private final SharedSQLiteStatement __preparedStmtOfDeleteEverything;
+
public DeletionDao_Impl(RoomDatabase __db) {
this.__db = __db;
this.__deletionAdapterOfUser = new EntityDeletionOrUpdateAdapter<User>(__db) {
@@ -72,6 +74,13 @@
return _query;
}
};
+ this.__preparedStmtOfDeleteEverything = new SharedSQLiteStatement(__db) {
+ @Override
+ public String createQuery() {
+ final String _query = "DELETE FROM user";
+ return _query;
+ }
+ };
}
@Override
@@ -190,6 +199,20 @@
}
@Override
+ public int deleteEverything() {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteEverything.acquire();
+ __db.beginTransaction();
+ try {
+ final int _result = _stmt.executeUpdateDelete();
+ __db.setTransactionSuccessful();
+ return _result;
+ } finally {
+ __db.endTransaction();
+ __preparedStmtOfDeleteEverything.release(_stmt);
+ }
+ }
+
+ @Override
public int deleteByUidList(int... uid) {
StringBuilder _stringBuilder = StringUtil.newStringBuilder();
_stringBuilder.append("DELETE FROM user where uid IN(");
diff --git a/room/compiler/src/test/data/daoWriter/output/UpdateDao.java b/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
index 38f8c59..1b26b6a 100644
--- a/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
+++ b/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
@@ -3,6 +3,7 @@
import android.arch.persistence.db.SupportSQLiteStatement;
import android.arch.persistence.room.EntityDeletionOrUpdateAdapter;
import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.SharedSQLiteStatement;
import java.lang.Override;
import java.lang.String;
import java.util.List;
@@ -16,6 +17,10 @@
private final EntityDeletionOrUpdateAdapter __updateAdapterOfBook;
+ private final SharedSQLiteStatement __preparedStmtOfAgeUserByUid;
+
+ private final SharedSQLiteStatement __preparedStmtOfAgeUserAll;
+
public UpdateDao_Impl(RoomDatabase __db) {
this.__db = __db;
this.__updateAdapterOfUser = new EntityDeletionOrUpdateAdapter<User>(__db) {
@@ -84,6 +89,20 @@
stmt.bindLong(3, value.bookId);
}
};
+ this.__preparedStmtOfAgeUserByUid = new SharedSQLiteStatement(__db) {
+ @Override
+ public String createQuery() {
+ final String _query = "UPDATE User SET ageColumn = ageColumn + 1 WHERE uid = ?";
+ return _query;
+ }
+ };
+ this.__preparedStmtOfAgeUserAll = new SharedSQLiteStatement(__db) {
+ @Override
+ public String createQuery() {
+ final String _query = "UPDATE User SET ageColumn = ageColumn + 1";
+ return _query;
+ }
+ };
}
@Override
@@ -184,4 +203,36 @@
__db.endTransaction();
}
}
+
+ @Override
+ public void ageUserByUid(String uid) {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserByUid.acquire();
+ __db.beginTransaction();
+ try {
+ int _argIndex = 1;
+ if (uid == null) {
+ _stmt.bindNull(_argIndex);
+ } else {
+ _stmt.bindString(_argIndex, uid);
+ }
+ _stmt.executeUpdateDelete();
+ __db.setTransactionSuccessful();
+ } finally {
+ __db.endTransaction();
+ __preparedStmtOfAgeUserByUid.release(_stmt);
+ }
+ }
+
+ @Override
+ public void ageUserAll() {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
+ __db.beginTransaction();
+ try {
+ _stmt.executeUpdateDelete();
+ __db.setTransactionSuccessful();
+ } finally {
+ __db.endTransaction();
+ __preparedStmtOfAgeUserAll.release(_stmt);
+ }
+ }
}
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index b7c4657..0846dff 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -23,26 +23,39 @@
protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate() {
public void createAllTables(SupportSQLiteDatabase _db) {
- _db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`uid` INTEGER, `name` TEXT, `lastName` TEXT, `ageColumn` INTEGER, PRIMARY KEY(`uid`))");
+ _db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`uid` INTEGER NOT NULL, `name` TEXT, `lastName` TEXT, `ageColumn` INTEGER NOT NULL, PRIMARY KEY(`uid`))");
_db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
- _db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"d4b1d59e1344d0db40fe2cd3fe64d02f\")");
+ _db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"6773601c5bcf94c71ee4eb0de04f21a4\")");
}
public void dropAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("DROP TABLE IF EXISTS `User`");
}
+ protected void onCreate(SupportSQLiteDatabase _db) {
+ if (mCallbacks != null) {
+ for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
+ mCallbacks.get(_i).onCreate(_db);
+ }
+ }
+ }
+
public void onOpen(SupportSQLiteDatabase _db) {
mDatabase = _db;
internalInitInvalidationTracker(_db);
+ if (mCallbacks != null) {
+ for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
+ mCallbacks.get(_i).onOpen(_db);
+ }
+ }
}
protected void validateMigration(SupportSQLiteDatabase _db) {
final HashMap<String, TableInfo.Column> _columnsUser = new HashMap<String, TableInfo.Column>(4);
- _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", 1));
- _columnsUser.put("name", new TableInfo.Column("name", "TEXT", 0));
- _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", 0));
- _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", 0));
+ _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1));
+ _columnsUser.put("name", new TableInfo.Column("name", "TEXT", false, 0));
+ _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0));
+ _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0));
final HashSet<TableInfo.ForeignKey> _foreignKeysUser = new HashSet<TableInfo.ForeignKey>(0);
final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser);
final TableInfo _existingUser = TableInfo.read(_db, "User");
@@ -52,7 +65,7 @@
+ " Found:\n" + _existingUser);
}
}
- }, "d4b1d59e1344d0db40fe2cd3fe64d02f");
+ }, "6773601c5bcf94c71ee4eb0de04f21a4");
final SupportSQLiteOpenHelper.Configuration _sqliteConfig = SupportSQLiteOpenHelper.Configuration.builder(configuration.context)
.name(configuration.name)
.version(1923)
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/BaseEntityParserTest.kt
index d00ff0c..9bfc0e7 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/BaseEntityParserTest.kt
@@ -33,6 +33,7 @@
const val ENTITY_PREFIX = """
package foo.bar;
import android.arch.persistence.room.*;
+ import android.support.annotation.NonNull;
@Entity%s
public class MyEntity %s {
"""
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
index 210f750..34c522e 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
@@ -71,6 +71,52 @@
}
@Test
+ fun getterWithBadType() {
+ singleEntity("""
+ @PrimaryKey
+ private int id;
+ public float getId() {return 0f;}
+ public void setId(int id) {this.id = id;}
+ """) { entity, invocation -> }
+ .failsToCompile()
+ .withErrorContaining(ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD)
+ }
+
+ @Test
+ fun setterWithBadType() {
+ singleEntity("""
+ @PrimaryKey
+ private int id;
+ public int getId() {return id;}
+ public void setId(float id) {}
+ """) { entity, invocation -> }
+ .failsToCompile()
+ .withErrorContaining(ProcessorErrors.CANNOT_FIND_SETTER_FOR_FIELD)
+ }
+
+ @Test
+ fun setterWithAssignableType() {
+ singleEntity("""
+ @PrimaryKey
+ private int id;
+ public int getId() {return id;}
+ public void setId(Integer id) {}
+ """) { entity, invocation -> }
+ .compilesWithoutError()
+ }
+
+ @Test
+ fun getterWithAssignableType() {
+ singleEntity("""
+ @PrimaryKey
+ private int id;
+ public Integer getId() {return id;}
+ public void setId(int id) {}
+ """) { entity, invocation -> }
+ .compilesWithoutError()
+ }
+
+ @Test
fun noSetter() {
singleEntity("""
@PrimaryKey
@@ -277,6 +323,21 @@
}.compilesWithoutError().withWarningCount(0)
}
+ @Test
+ fun notNull() {
+ singleEntity(
+ """
+ @PrimaryKey int id;
+ @NonNull public String name;
+ """
+ ) { entity, _ ->
+ val field = fieldsByName(entity, "name").first()
+ assertThat(field.name, `is`("name"))
+ assertThat(field.columnName, `is`("name"))
+ assertThat(field.nonNull, `is`(true))
+ }.compilesWithoutError()
+ }
+
private fun fieldsByName(entity : Pojo, vararg fieldNames : String) : List<Field> {
return fieldNames
.map { name -> entity.fields.find { it.name == name } }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
index b21903c..0a5026a 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
@@ -45,6 +45,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import simpleRun
import javax.lang.model.element.Element
@@ -431,10 +432,13 @@
FieldProcessor.BindingScope.TWO_WAY, null).process()
assertThat(pojo5, sameInstance(pojo4))
+ val type = invocation.context.COMMON_TYPES.STRING
+ val mockElement = mock(Element::class.java)
+ doReturn(type).`when`(mockElement).asType()
val fakeField = Field(
- element = mock(Element::class.java),
+ element = mockElement,
name = "foo",
- type = invocation.context.COMMON_TYPES.STRING,
+ type = type,
affinity = SQLTypeAffinity.TEXT,
columnName = "foo",
parent = null,
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
index 3474441..f7affbc 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
@@ -46,6 +46,7 @@
import com.squareup.javapoet.TypeName
import com.squareup.javapoet.TypeVariableName
import createVerifierFromEntities
+import mockElementAndType
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.instanceOf
import org.hamcrest.CoreMatchers.notNullValue
@@ -55,7 +56,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.mockito.Mockito
-import javax.lang.model.element.Element
import javax.lang.model.type.DeclaredType
import javax.lang.model.type.TypeKind.INT
import javax.lang.model.type.TypeMirror
@@ -77,10 +77,11 @@
fun getParams() = arrayOf(true, false)
fun createField(name: String, columnName: String? = null): Field {
+ val (element, type) = mockElementAndType()
return Field(
- element = Mockito.mock(Element::class.java),
+ element = element,
name = name,
- type = Mockito.mock(TypeMirror::class.java),
+ type = type,
columnName = columnName ?: name,
affinity = null
)
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/TypeAdapterStoreTest.kt
index 524d18d..204adc6 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/TypeAdapterStoreTest.kt
@@ -20,6 +20,7 @@
import android.arch.persistence.room.Entity
import android.arch.persistence.room.ext.L
import android.arch.persistence.room.ext.LifecyclesTypeNames
+import android.arch.persistence.room.ext.PagingTypeNames
import android.arch.persistence.room.ext.ReactiveStreamsTypeNames
import android.arch.persistence.room.ext.RoomTypeNames.STRING_UTIL
import android.arch.persistence.room.ext.RxJava2TypeNames
@@ -27,10 +28,15 @@
import android.arch.persistence.room.parser.SQLTypeAffinity
import android.arch.persistence.room.processor.Context
import android.arch.persistence.room.processor.ProcessorErrors
+import android.arch.persistence.room.solver.binderprovider.CountedDataSourceQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.FlowableQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.LiveDataQueryResultBinderProvider
+import android.arch.persistence.room.solver.binderprovider.LiveLazyListQueryResultBinderProvider
import android.arch.persistence.room.solver.types.CompositeAdapter
import android.arch.persistence.room.solver.types.TypeConverter
import android.arch.persistence.room.testing.TestInvocation
import android.arch.persistence.room.testing.TestProcessor
+import android.arch.util.paging.CountedDataSource
import com.google.auto.common.MoreTypes
import com.google.common.truth.Truth
import com.google.testing.compile.CompileTester
@@ -203,7 +209,7 @@
val publisherElement = invocation.processingEnv.elementUtils
.getTypeElement(ReactiveStreamsTypeNames.PUBLISHER.toString())
assertThat(publisherElement, notNullValue())
- assertThat(invocation.context.typeAdapterStore.isRxJava2Publisher(
+ assertThat(FlowableQueryResultBinderProvider(invocation.context).matches(
MoreTypes.asDeclared(publisherElement.asType())), `is`(true))
}.failsToCompile().withErrorContaining(ProcessorErrors.MISSING_ROOM_RXJAVA2_ARTIFACT)
}
@@ -215,7 +221,7 @@
val publisher = invocation.processingEnv.elementUtils
.getTypeElement(ReactiveStreamsTypeNames.PUBLISHER.toString())
assertThat(publisher, notNullValue())
- assertThat(invocation.context.typeAdapterStore.isRxJava2Publisher(
+ assertThat(FlowableQueryResultBinderProvider(invocation.context).matches(
MoreTypes.asDeclared(publisher.asType())), `is`(true))
}.compilesWithoutError()
}
@@ -227,7 +233,7 @@
val flowable = invocation.processingEnv.elementUtils
.getTypeElement(RxJava2TypeNames.FLOWABLE.toString())
assertThat(flowable, notNullValue())
- assertThat(invocation.context.typeAdapterStore.isRxJava2Publisher(
+ assertThat(FlowableQueryResultBinderProvider(invocation.context).matches(
MoreTypes.asDeclared(flowable.asType())), `is`(true))
}.compilesWithoutError()
}
@@ -239,11 +245,35 @@
val liveData = invocation.processingEnv.elementUtils
.getTypeElement(LifecyclesTypeNames.LIVE_DATA.toString())
assertThat(liveData, notNullValue())
- assertThat(invocation.context.typeAdapterStore.isLiveData(
+ assertThat(LiveDataQueryResultBinderProvider(invocation.context).matches(
MoreTypes.asDeclared(liveData.asType())), `is`(true))
}.compilesWithoutError()
}
+ @Test
+ fun findCountedDataSource() {
+ simpleRun {
+ invocation ->
+ val countedDataSource = invocation.processingEnv.elementUtils
+ .getTypeElement(CountedDataSource::class.java.canonicalName)
+ assertThat(countedDataSource, notNullValue())
+ assertThat(CountedDataSourceQueryResultBinderProvider(invocation.context).matches(
+ MoreTypes.asDeclared(countedDataSource.asType())), `is`(true))
+ }.compilesWithoutError()
+ }
+
+ @Test
+ fun findLazyListProvider() {
+ simpleRun(jfos = COMMON.LIVE_LAZY_LIST_PROVIDER) {
+ invocation ->
+ val lazyListProvider = invocation.processingEnv.elementUtils
+ .getTypeElement(PagingTypeNames.LIVE_LAZY_LIST_PROVIDER.toString())
+ assertThat(lazyListProvider, notNullValue())
+ assertThat(LiveLazyListQueryResultBinderProvider(invocation.context).matches(
+ MoreTypes.asDeclared(lazyListProvider.asType())), `is`(true))
+ }.compilesWithoutError()
+ }
+
private fun createIntListToStringBinders(invocation: TestInvocation): List<TypeConverter> {
val intType = invocation.processingEnv.elementUtils
.getTypeElement(Integer::class.java.canonicalName)
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/testing/test_util.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/testing/test_util.kt
index 91d7189..cd30c21 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/testing/test_util.kt
@@ -21,6 +21,7 @@
import android.arch.persistence.room.Query
import android.arch.persistence.room.Relation
import android.arch.persistence.room.ext.LifecyclesTypeNames
+import android.arch.persistence.room.ext.PagingTypeNames
import android.arch.persistence.room.ext.ReactiveStreamsTypeNames
import android.arch.persistence.room.ext.RoomRxJava2TypeNames
import android.arch.persistence.room.ext.RxJava2TypeNames
@@ -30,18 +31,19 @@
import android.arch.persistence.room.testing.TestProcessor
import android.arch.persistence.room.verifier.DatabaseVerifier
import android.arch.persistence.room.writer.ClassWriter
-import android.arch.persistence.room.writer.EntityCursorConverterWriter
import com.google.auto.common.MoreElements
import com.google.common.truth.Truth
import com.google.testing.compile.CompileTester
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourcesSubjectFactory
import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeSpec
import org.mockito.Mockito
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.mock
import java.io.File
import javax.lang.model.element.Element
-import javax.lang.model.element.Modifier
+import javax.lang.model.type.TypeKind
+import javax.lang.model.type.TypeMirror
import javax.tools.JavaFileObject
object COMMON {
@@ -83,6 +85,11 @@
val RX2_ROOM by lazy {
loadJavaCode("common/input/Rx2Room.java", RoomRxJava2TypeNames.RX_ROOM.toString())
}
+
+ val LIVE_LAZY_LIST_PROVIDER by lazy {
+ loadJavaCode("common/input/LiveLazyListProvider.java",
+ PagingTypeNames.LIVE_LAZY_LIST_PROVIDER.toString())
+ }
}
fun testCodeGenScope(): CodeGenScope {
return CodeGenScope(Mockito.mock(ClassWriter::class.java))
@@ -120,3 +127,15 @@
return DatabaseVerifier.create(invocation.context, Mockito.mock(Element::class.java),
entities)!!
}
+
+/**
+ * Create mocks of [Element] and [TypeMirror] so that they can be used for instantiating a fake
+ * [android.arch.persistence.room.vo.Field].
+ */
+fun mockElementAndType(): Pair<Element, TypeMirror> {
+ val element = mock(Element::class.java)
+ val type = mock(TypeMirror::class.java)
+ doReturn(TypeKind.DECLARED).`when`(type).kind
+ doReturn(type).`when`(element).asType()
+ return element to type
+}
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
index df8afce..604c50f 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
@@ -36,6 +36,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import simpleRun
import java.sql.Connection
@@ -203,8 +204,10 @@
}
private fun field(name: String, type: TypeMirror, affinity: SQLTypeAffinity): Field {
+ val element = mock(Element::class.java)
+ doReturn(type).`when`(element).asType()
val f = Field(
- element = mock(Element::class.java),
+ element = element,
name = name,
type = type,
columnName = name,
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/vo/IndexTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/vo/IndexTest.kt
index 29d82d8..c1ac029 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/vo/IndexTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/vo/IndexTest.kt
@@ -17,14 +17,12 @@
package android.arch.persistence.room.vo
import android.arch.persistence.room.parser.SQLTypeAffinity
+import mockElementAndType
import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
-import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.type.TypeMirror
@RunWith(JUnit4::class)
class IndexTest {
@@ -45,11 +43,12 @@
}
private fun mockField(columnName : String): Field {
+ val (element, type) = mockElementAndType()
return Field(
- element = mock(Element::class.java),
+ element = element,
name = columnName + "_field",
affinity = SQLTypeAffinity.TEXT,
- type = mock(TypeMirror::class.java),
+ type = type,
columnName = columnName
)
}
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
index b3fe832..26efb4b 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
@@ -63,7 +63,8 @@
val query = SQLiteOpenHelperWriter(database)
.createQuery(database.entities.first())
assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
- " `MyEntity` (`uuid` TEXT, `name` TEXT, `age` INTEGER, PRIMARY KEY(`uuid`))"))
+ " `MyEntity` (`uuid` TEXT, `name` TEXT, `age` INTEGER NOT NULL," +
+ " PRIMARY KEY(`uuid`))"))
}.compilesWithoutError()
}
@@ -79,7 +80,7 @@
val query = SQLiteOpenHelperWriter(database)
.createQuery(database.entities.first())
assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
- " `MyEntity` (`uuid` TEXT, `name` TEXT, `age` INTEGER," +
+ " `MyEntity` (`uuid` TEXT, `name` TEXT, `age` INTEGER NOT NULL," +
" PRIMARY KEY(`uuid`, `name`))"))
}.compilesWithoutError()
}
@@ -97,8 +98,8 @@
val query = SQLiteOpenHelperWriter(database)
.createQuery(database.entities.first())
assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
- " `MyEntity` (`uuid` INTEGER PRIMARY KEY AUTOINCREMENT," +
- " `name` TEXT, `age` INTEGER)"))
+ " `MyEntity` (`uuid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
+ " `name` TEXT, `age` INTEGER NOT NULL)"))
}.compilesWithoutError()
}
diff --git a/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteProgram.java b/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteProgram.java
index 500f9b9..6c2bb72 100644
--- a/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteProgram.java
+++ b/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteProgram.java
@@ -58,4 +58,9 @@
public void clearBindings() {
mDelegate.clearBindings();
}
+
+ @Override
+ public void close() throws Exception {
+ mDelegate.close();
+ }
}
diff --git a/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteStatement.java b/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteStatement.java
index 65dd49f..a2daf12 100644
--- a/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteStatement.java
+++ b/room/db-impl/src/main/java/android/arch/persistence/db/framework/FrameworkSQLiteStatement.java
@@ -89,4 +89,9 @@
public String simpleQueryForString() {
return mDelegate.simpleQueryForString();
}
+
+ @Override
+ public void close() throws Exception {
+ mDelegate.close();
+ }
}
diff --git a/room/db/src/main/java/android/arch/persistence/db/SupportSQLiteProgram.java b/room/db/src/main/java/android/arch/persistence/db/SupportSQLiteProgram.java
index aa63821..c6d43cc 100644
--- a/room/db/src/main/java/android/arch/persistence/db/SupportSQLiteProgram.java
+++ b/room/db/src/main/java/android/arch/persistence/db/SupportSQLiteProgram.java
@@ -16,12 +16,16 @@
package android.arch.persistence.db;
+import android.annotation.TargetApi;
+import android.os.Build;
+
/**
* An interface to map the behavior of {@link android.database.sqlite.SQLiteProgram}.
*/
+@TargetApi(Build.VERSION_CODES.KITKAT)
@SuppressWarnings("unused")
-public interface SupportSQLiteProgram {
+public interface SupportSQLiteProgram extends AutoCloseable {
/**
* Bind a NULL value to this statement. The value remains bound until
* {@link #clearBindings} is called.
diff --git a/samples-flatfoot/ApiReviewDemo/app/.gitignore b/room/integration-tests/kotlintestapp/.gitignore
similarity index 100%
rename from samples-flatfoot/ApiReviewDemo/app/.gitignore
rename to room/integration-tests/kotlintestapp/.gitignore
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
new file mode 100644
index 0000000..0d70666
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-kapt'
+apply plugin: 'kotlin-android'
+
+project.ext.noDocs = true
+
+android {
+ compileSdkVersion tools.current_sdk
+ buildToolsVersion tools.build_tools_version
+
+ defaultConfig {
+ minSdkVersion flatfoot.min_sdk
+ targetSdkVersion tools.current_sdk
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
+ }
+ }
+ }
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+ sourceSets {
+ androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
+ }
+}
+
+dependencies {
+ implementation project(":room:common")
+ implementation project(":room:db")
+ implementation project(":room:db-impl")
+ implementation project(':room:runtime')
+ implementation project(':arch:runtime')
+
+ implementation libs.support.app_compat
+ kapt project(":room:compiler")
+ kaptAndroidTest project(":room:compiler")
+
+ androidTestCompile(libs.test_runner) {
+ exclude module: 'support-annotations'
+ exclude module: 'hamcrest-core'
+ }
+ androidTestCompile(libs.espresso_core, {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ exclude module: "hamcrest-core"
+ })
+ // IJ's gradle integration just cannot figure this out ...
+ androidTestImplementation project(':lifecycle:extensions')
+ androidTestImplementation project(':lifecycle:common')
+ androidTestImplementation project(':lifecycle:runtime')
+ androidTestImplementation project(':room:testing')
+ androidTestImplementation project(':room:rxjava2')
+ androidTestImplementation project(':arch:core-testing')
+ androidTestImplementation libs.rx_java
+ testImplementation libs.mockito_core
+}
+
+createAndroidCheckstyle(project)
+createKotlinCheckstyle(project)
+tasks['check'].dependsOn(tasks['connectedCheck'])
+
+uploadArchives.enabled = false
diff --git a/room/integration-tests/kotlintestapp/proguard-rules.pro b/room/integration-tests/kotlintestapp/proguard-rules.pro
new file mode 100644
index 0000000..d50f27e
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/florinam/Work/Coding/support/ub-supportlib-26.0/prebuilts/fullsdk-darwin/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.BooksDatabase/1.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.BooksDatabase/1.json
new file mode 100644
index 0000000..dd056e2
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.BooksDatabase/1.json
@@ -0,0 +1,159 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 1,
+ "identityHash": "64fa560604c57044726b190dadbd8258",
+ "entities": [
+ {
+ "tableName": "Book",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookId` TEXT NOT NULL, `title` TEXT NOT NULL, `bookPublisherId` TEXT NOT NULL, PRIMARY KEY(`bookId`), FOREIGN KEY(`bookPublisherId`) REFERENCES `Publisher`(`publisherId`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
+ "fields": [
+ {
+ "fieldPath": "bookId",
+ "columnName": "bookId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "bookPublisherId",
+ "columnName": "bookPublisherId",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "bookId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": [
+ {
+ "table": "Publisher",
+ "onDelete": "NO ACTION",
+ "onUpdate": "NO ACTION",
+ "columns": [
+ "bookPublisherId"
+ ],
+ "referencedColumns": [
+ "publisherId"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "Author",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`authorId` TEXT NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`authorId`))",
+ "fields": [
+ {
+ "fieldPath": "authorId",
+ "columnName": "authorId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "authorId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Publisher",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`publisherId` TEXT NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`publisherId`))",
+ "fields": [
+ {
+ "fieldPath": "publisherId",
+ "columnName": "publisherId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "publisherId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "BookAuthor",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookId` TEXT NOT NULL, `authorId` TEXT NOT NULL, PRIMARY KEY(`bookId`, `authorId`), FOREIGN KEY(`bookId`) REFERENCES `Book`(`bookId`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`authorId`) REFERENCES `Author`(`authorId`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
+ "fields": [
+ {
+ "fieldPath": "bookId",
+ "columnName": "bookId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "authorId",
+ "columnName": "authorId",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "bookId",
+ "authorId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": [
+ {
+ "table": "Book",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "bookId"
+ ],
+ "referencedColumns": [
+ "bookId"
+ ]
+ },
+ {
+ "table": "Author",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "authorId"
+ ],
+ "referencedColumns": [
+ "authorId"
+ ]
+ }
+ ]
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"64fa560604c57044726b190dadbd8258\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/1.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/1.json
new file mode 100644
index 0000000..e05f095
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/1.json
@@ -0,0 +1,38 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 1,
+ "identityHash": "2f3557e56d7f665363f3e20d14787a59",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"2f3557e56d7f665363f3e20d14787a59\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/2.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/2.json
new file mode 100644
index 0000000..8982d4f
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/2.json
@@ -0,0 +1,63 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 2,
+ "identityHash": "aee9a6eed720c059df0f2ee0d6e96d89",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"aee9a6eed720c059df0f2ee0d6e96d89\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/3.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/3.json
new file mode 100644
index 0000000..3bf0f03
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/3.json
@@ -0,0 +1,69 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 3,
+ "identityHash": "3f2a99b6d768af0184e077808f7348fe",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"3f2a99b6d768af0184e077808f7348fe\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/4.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/4.json
new file mode 100644
index 0000000..e899a02
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/4.json
@@ -0,0 +1,100 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 4,
+ "identityHash": "abbae5f17d94ff7c2c7e05ca217ccc31",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity3",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `removedInV5` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "removedInV5",
+ "columnName": "removedInV5",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"abbae5f17d94ff7c2c7e05ca217ccc31\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/5.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/5.json
new file mode 100644
index 0000000..801fdb5
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/5.json
@@ -0,0 +1,94 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 5,
+ "identityHash": "5543c44fe679f4cf8f03093d66838068",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity3",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"5543c44fe679f4cf8f03093d66838068\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/6.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/6.json
new file mode 100644
index 0000000..a6fdf5b
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/6.json
@@ -0,0 +1,69 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 6,
+ "identityHash": "3f2a99b6d768af0184e077808f7348fe",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": []
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"3f2a99b6d768af0184e077808f7348fe\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/7.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/7.json
new file mode 100644
index 0000000..78ce189
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.migration.MigrationDbKotlin/7.json
@@ -0,0 +1,118 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 7,
+ "identityHash": "5653c29453937d8e34dc031af1ab4c7d",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_Entity1_name",
+ "unique": true,
+ "columnNames": [
+ "name"
+ ],
+ "createSql": "CREATE UNIQUE INDEX `index_Entity1_name` ON `${TABLE_NAME}` (`name`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Entity4",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": [
+ {
+ "table": "Entity1",
+ "onDelete": "NO ACTION",
+ "onUpdate": "NO ACTION",
+ "columns": [
+ "name"
+ ],
+ "referencedColumns": [
+ "name"
+ ]
+ }
+ ]
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"5653c29453937d8e34dc031af1ab4c7d\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDao.kt
new file mode 100644
index 0000000..6dc0276
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDao.kt
@@ -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.arch.persistence.room.integration.kotlintestapp
+
+import android.arch.lifecycle.LiveData
+import android.arch.persistence.room.Dao
+import android.arch.persistence.room.Insert
+import android.arch.persistence.room.Query
+import android.arch.persistence.room.integration.kotlintestapp.vo.*
+import io.reactivex.Flowable
+
+@Dao
+interface BooksDao {
+
+ @Insert
+ fun addPublishers(vararg publishers: Publisher)
+
+ @Insert
+ fun addAuthors(vararg authors: Author)
+
+ @Insert
+ fun addBooks(vararg books: Book)
+
+ @Insert
+ fun addBookAuthors(vararg bookAuthors: BookAuthor)
+
+ @Query("SELECT * FROM book WHERE bookId = :bookId")
+ fun getBook(bookId: String): Book
+
+ @Query("SELECT * FROM book WHERE bookId = :bookId")
+ fun getBookLiveData(bookId: String): LiveData<Book>
+
+ @Query("SELECT * FROM book WHERE bookId = :bookId")
+ fun getBookFlowable(bookId: String): Flowable<Book>
+
+ @Query("SELECT * FROM book INNER JOIN publisher " +
+ "ON book.bookPublisherId = publisher.publisherId ")
+ fun getBooksWithPublisher(): List<BookWithPublisher>
+
+ @Query("SELECT * FROM book INNER JOIN publisher " +
+ "ON book.bookPublisherId = publisher.publisherId ")
+ fun getBooksWithPublisherLiveData(): LiveData<List<BookWithPublisher>>
+
+ @Query("SELECT * FROM book INNER JOIN publisher " +
+ "ON book.bookPublisherId = publisher.publisherId ")
+ fun getBooksWithPublisherFlowable(): Flowable<List<BookWithPublisher>>
+
+ @Query("SELECT * FROM publisher WHERE publisherId = :publisherId")
+ fun getPublisherWithBooks(publisherId: String): PublisherWithBooks
+
+ @Query("SELECT * FROM publisher WHERE publisherId = :publisherId")
+ fun getPublisherWithBooksLiveData(publisherId: String): LiveData<PublisherWithBooks>
+
+ @Query("SELECT * FROM publisher WHERE publisherId = :publisherId")
+ fun getPublisherWithBooksFlowable(publisherId: String): Flowable<PublisherWithBooks>
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDatabase.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDatabase.kt
new file mode 100644
index 0000000..b5b6f26
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/BooksDatabase.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp
+
+import android.arch.persistence.room.Database
+import android.arch.persistence.room.RoomDatabase
+import android.arch.persistence.room.integration.kotlintestapp.vo.Author
+import android.arch.persistence.room.integration.kotlintestapp.vo.Book
+import android.arch.persistence.room.integration.kotlintestapp.vo.BookAuthor
+import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
+
+@Database(entities = arrayOf(Book::class, Author::class, Publisher::class, BookAuthor::class),
+ version = 1)
+abstract class BooksDatabase : RoomDatabase() {
+
+ abstract fun booksDao(): BooksDao
+
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationDbKotlin.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationDbKotlin.kt
new file mode 100644
index 0000000..67374a5
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationDbKotlin.kt
@@ -0,0 +1,128 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.migration
+
+import android.arch.persistence.db.SupportSQLiteDatabase
+import android.arch.persistence.room.Dao
+import android.arch.persistence.room.Database
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.ForeignKey
+import android.arch.persistence.room.Ignore
+import android.arch.persistence.room.Index
+import android.arch.persistence.room.Insert
+import android.arch.persistence.room.PrimaryKey
+import android.arch.persistence.room.Query
+import android.arch.persistence.room.RoomDatabase
+import android.content.ContentValues
+import android.database.sqlite.SQLiteDatabase
+
+@Database(version = MigrationDbKotlin.LATEST_VERSION,
+ entities = arrayOf(MigrationDbKotlin.Entity1::class, MigrationDbKotlin.Entity2::class,
+ MigrationDbKotlin.Entity4::class))
+abstract class MigrationDbKotlin : RoomDatabase() {
+
+ internal abstract fun dao(): MigrationDao
+
+ @Entity(indices = arrayOf(Index(value = "name", unique = true)))
+ data class Entity1(@PrimaryKey var id: Int = 0, var name: String?) {
+
+ companion object {
+ val TABLE_NAME = "Entity1"
+ }
+ }
+
+ @Entity
+ open class Entity2(@PrimaryKey var id: Int = 0, var addedInV3: String?, var name: String?) {
+ companion object {
+ val TABLE_NAME = "Entity2"
+ }
+ }
+
+ @Entity
+ data class Entity3(@PrimaryKey var id: Int = 0, @Ignore var removedInV5: String?,
+ var name: String?) { // added in version 4, removed at 6
+ companion object {
+ val TABLE_NAME = "Entity3"
+ }
+ }
+
+ @Entity(foreignKeys = arrayOf(ForeignKey(entity = Entity1::class,
+ parentColumns = arrayOf("name"),
+ childColumns = arrayOf("name"),
+ deferred = true)))
+ data class Entity4(@PrimaryKey var id: Int = 0, var name: String?) {
+ companion object {
+ val TABLE_NAME = "Entity4"
+ }
+ }
+
+ @Dao
+ internal interface MigrationDao {
+ @Query("SELECT * from Entity1 ORDER BY id ASC")
+ fun loadAllEntity1s(): List<Entity1>
+
+ @Query("SELECT * from Entity2 ORDER BY id ASC")
+ fun loadAllEntity2s(): List<Entity2>
+
+ @Query("SELECT * from Entity2 ORDER BY id ASC")
+ fun loadAllEntity2sAsPojo(): List<Entity2Pojo>
+
+ @Insert
+ fun insert(vararg entity2: Entity2)
+ }
+
+ internal class Entity2Pojo(id: Int, addedInV3: String?, name: String?)
+ : Entity2(id, addedInV3, name)
+
+ /**
+ * not a real dao because database will change.
+ */
+ internal class Dao_V1(val mDb: SupportSQLiteDatabase) {
+
+ fun insertIntoEntity1(id: Int, name: String) {
+ val values = ContentValues()
+ values.put("id", id)
+ values.put("name", name)
+ val insertionId = mDb.insert(Entity1.TABLE_NAME,
+ SQLiteDatabase.CONFLICT_REPLACE, values)
+ if (insertionId == -1L) {
+ throw RuntimeException("test sanity failure")
+ }
+ }
+ }
+
+ /**
+ * not a real dao because database will change.
+ */
+ internal class Dao_V2(val mDb: SupportSQLiteDatabase) {
+
+ fun insertIntoEntity2(id: Int, name: String) {
+ val values = ContentValues()
+ values.put("id", id)
+ values.put("name", name)
+ val insertionId = mDb.insert(Entity2.TABLE_NAME,
+ SQLiteDatabase.CONFLICT_REPLACE, values)
+ if (insertionId == -1L) {
+ throw RuntimeException("test sanity failure")
+ }
+ }
+ }
+
+ companion object {
+ const val LATEST_VERSION = 7
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt
new file mode 100644
index 0000000..eb1a9b8
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt
@@ -0,0 +1,306 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.migration
+
+import android.arch.persistence.db.SupportSQLiteDatabase
+import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory
+import android.arch.persistence.room.Room
+import android.arch.persistence.room.migration.Migration
+import android.arch.persistence.room.testing.MigrationTestHelper
+import android.arch.persistence.room.util.TableInfo
+import android.support.test.InstrumentationRegistry
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.containsString
+import org.hamcrest.CoreMatchers.instanceOf
+import org.hamcrest.CoreMatchers.nullValue
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Rule
+import org.junit.Test
+import java.io.FileNotFoundException
+import java.io.IOException
+
+
+class MigrationKotlinTest {
+
+ @get:Rule
+ var helper: MigrationTestHelper = MigrationTestHelper(
+ InstrumentationRegistry.getInstrumentation(),
+ MigrationDbKotlin::class.java.canonicalName,
+ FrameworkSQLiteOpenHelperFactory())
+
+ companion object {
+ val TEST_DB = "migration-test"
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun giveBadResource() {
+ val helper = MigrationTestHelper(
+ InstrumentationRegistry.getInstrumentation(),
+ "foo", FrameworkSQLiteOpenHelperFactory())
+ try {
+ helper.createDatabase(TEST_DB, 1)
+ throw AssertionError("must have failed with missing file exception")
+ } catch (exception: FileNotFoundException) {
+ assertThat<String>(exception.message, containsString("Cannot find"))
+ }
+
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun startInCurrentVersion() {
+ val db = helper.createDatabase(TEST_DB,
+ MigrationDbKotlin.LATEST_VERSION)
+ val dao = MigrationDbKotlin.Dao_V1(db)
+ dao.insertIntoEntity1(2, "x")
+ db.close()
+ val migrationDb = getLatestDb()
+ val items = migrationDb.dao().loadAllEntity1s()
+ helper.closeWhenFinished(migrationDb)
+ assertThat<Int>(items.size, `is`<Int>(1))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun addTable() {
+ var db = helper.createDatabase(TEST_DB, 1)
+ val dao = MigrationDbKotlin.Dao_V1(db)
+ dao.insertIntoEntity1(2, "foo")
+ dao.insertIntoEntity1(3, "bar")
+ db.close()
+ db = helper.runMigrationsAndValidate(TEST_DB, 2, true,
+ MIGRATION_1_2)
+ MigrationDbKotlin.Dao_V2(db).insertIntoEntity2(3, "blah")
+ db.close()
+ val migrationDb = getLatestDb()
+ val entity1s = migrationDb.dao().loadAllEntity1s()
+
+ assertThat(entity1s.size, `is`(2))
+ val entity2 = MigrationDbKotlin.Entity2(2, null, "bar")
+ // assert no error happens
+ migrationDb.dao().insert(entity2)
+ val entity2s = migrationDb.dao().loadAllEntity2s()
+ assertThat(entity2s.size, `is`(2))
+ }
+
+ private fun getLatestDb(): MigrationDbKotlin {
+ val db = Room.databaseBuilder(
+ InstrumentationRegistry.getInstrumentation().targetContext,
+ MigrationDbKotlin::class.java, TEST_DB).addMigrations(*ALL_MIGRATIONS).build()
+ // trigger open
+ db.beginTransaction()
+ db.endTransaction()
+ helper.closeWhenFinished(db)
+ return db
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun addTableFailure() {
+ testFailure(1, 2)
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun addColumnFailure() {
+ val db = helper.createDatabase(TEST_DB, 2)
+ db.close()
+ var caught: IllegalStateException? = null
+ try {
+ helper.runMigrationsAndValidate(TEST_DB, 3, true,
+ EmptyMigration(2, 3))
+ } catch (ex: IllegalStateException) {
+ caught = ex
+ }
+
+ assertThat<IllegalStateException>(caught,
+ instanceOf<IllegalStateException>(IllegalStateException::class.java))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun addColumn() {
+ val db = helper.createDatabase(TEST_DB, 2)
+ val v2Dao = MigrationDbKotlin.Dao_V2(db)
+ v2Dao.insertIntoEntity2(7, "blah")
+ db.close()
+ helper.runMigrationsAndValidate(TEST_DB, 3, true, MIGRATION_2_3)
+ // trigger open.
+ val migrationDb = getLatestDb()
+ val entity2s = migrationDb.dao().loadAllEntity2s()
+ assertThat(entity2s.size, `is`(1))
+ assertThat<String>(entity2s[0].name, `is`("blah"))
+ assertThat<String>(entity2s[0].addedInV3, `is`<Any>(nullValue()))
+
+ val entity2Pojos = migrationDb.dao().loadAllEntity2sAsPojo()
+ assertThat(entity2Pojos.size, `is`(1))
+ assertThat<String>(entity2Pojos[0].name, `is`("blah"))
+ assertThat<String>(entity2Pojos[0].addedInV3, `is`<Any>(nullValue()))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun failedToRemoveColumn() {
+ testFailure(4, 5)
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun removeColumn() {
+ helper.createDatabase(TEST_DB, 4)
+ val db = helper.runMigrationsAndValidate(TEST_DB,
+ 5, true, MIGRATION_4_5)
+ val info = TableInfo.read(db, MigrationDbKotlin.Entity3.TABLE_NAME)
+ assertThat(info.columns.size, `is`(2))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun dropTable() {
+ helper.createDatabase(TEST_DB, 5)
+ val db = helper.runMigrationsAndValidate(TEST_DB,
+ 6, true, MIGRATION_5_6)
+ val info = TableInfo.read(db, MigrationDbKotlin.Entity3.TABLE_NAME)
+ assertThat(info.columns.size, `is`(0))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun failedToDropTable() {
+ testFailure(5, 6)
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun failedToDropTableDontVerify() {
+ helper.createDatabase(TEST_DB, 5)
+ val db = helper.runMigrationsAndValidate(TEST_DB,
+ 6, false, EmptyMigration(5, 6))
+ val info = TableInfo.read(db, MigrationDbKotlin.Entity3.TABLE_NAME)
+ assertThat(info.columns.size, `is`(2))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun failedForeignKey() {
+ val db = helper.createDatabase(TEST_DB, 6)
+ db.close()
+ var throwable: Throwable? = null
+ try {
+ helper.runMigrationsAndValidate(TEST_DB,
+ 7, false, object : Migration(6, 7) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("CREATE TABLE Entity4 (`id` INTEGER, `name` TEXT,"
+ + " PRIMARY KEY(`id`))")
+ }
+ })
+ } catch (t: Throwable) {
+ throwable = t
+ }
+
+ assertThat<Throwable>(throwable, instanceOf<Throwable>(IllegalStateException::class.java))
+
+ assertThat<String>(throwable!!.message, containsString("Migration failed"))
+ }
+
+ @Test
+ @Throws(IOException::class)
+ fun newTableWithForeignKey() {
+ helper.createDatabase(TEST_DB, 6)
+ val db = helper.runMigrationsAndValidate(TEST_DB,
+ 7, false, MIGRATION_6_7)
+ val info = TableInfo.read(db, MigrationDbKotlin.Entity4.TABLE_NAME)
+ assertThat(info.foreignKeys.size, `is`(1))
+ }
+
+ @Throws(IOException::class)
+ private fun testFailure(startVersion: Int, endVersion: Int) {
+ val db = helper.createDatabase(TEST_DB, startVersion)
+ db.close()
+ var throwable: Throwable? = null
+ try {
+ helper.runMigrationsAndValidate(TEST_DB, endVersion, true,
+ EmptyMigration(startVersion, endVersion))
+ } catch (t: Throwable) {
+ throwable = t
+ }
+
+ assertThat<Throwable>(throwable, instanceOf<Throwable>(IllegalStateException::class.java))
+ assertThat<String>(throwable!!.message, containsString("Migration failed"))
+ }
+
+
+ internal val MIGRATION_1_2: Migration = object : Migration(1, 2) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity2` (`id` INTEGER NOT NULL,"
+ + " `name` TEXT, PRIMARY KEY(`id`))")
+ }
+ }
+
+ internal val MIGRATION_2_3: Migration = object : Migration(2, 3) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("ALTER TABLE " + MigrationDbKotlin.Entity2.TABLE_NAME
+ + " ADD COLUMN addedInV3 TEXT")
+ }
+ }
+
+ internal val MIGRATION_3_4: Migration = object : Migration(3, 4) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3` (`id` INTEGER NOT NULL,"
+ + " `removedInV5` TEXT, `name` TEXT, PRIMARY KEY(`id`))")
+ }
+ }
+
+ internal val MIGRATION_4_5: Migration = object : Migration(4, 5) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3_New` (`id` INTEGER NOT NULL,"
+ + " `name` TEXT, PRIMARY KEY(`id`))")
+ database.execSQL("INSERT INTO Entity3_New(`id`, `name`) "
+ + "SELECT `id`, `name` FROM Entity3")
+ database.execSQL("DROP TABLE Entity3")
+ database.execSQL("ALTER TABLE Entity3_New RENAME TO Entity3")
+ }
+ }
+
+ internal val MIGRATION_5_6: Migration = object : Migration(5, 6) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("DROP TABLE " + MigrationDbKotlin.Entity3.TABLE_NAME)
+ }
+ }
+
+ internal val MIGRATION_6_7: Migration = object : Migration(6, 7) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("CREATE TABLE IF NOT EXISTS "
+ + MigrationDbKotlin.Entity4.TABLE_NAME
+ + " (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`),"
+ + " FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`)"
+ + " ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)")
+ }
+ }
+
+ private val ALL_MIGRATIONS = arrayOf(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5,
+ MIGRATION_5_6, MIGRATION_6_7)
+
+ internal class EmptyMigration(startVersion: Int, endVersion: Int)
+ : Migration(startVersion, endVersion) {
+
+ override fun migrate(database: SupportSQLiteDatabase) {
+ // do nothing
+ }
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
new file mode 100644
index 0000000..31344d6
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.persistence.room.integration.kotlintestapp.vo.Book
+import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
+import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Test
+
+class BooksDaoTest : TestDatabaseTest() {
+
+ @Test
+ fun bookById() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1)
+
+ assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId), `is`<Book>(TestUtil.BOOK_1))
+ }
+
+ @Test
+ fun bookWithPublisher() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1)
+
+ var expected = BookWithPublisher(TestUtil.BOOK_1.bookId, TestUtil.BOOK_1.title,
+ TestUtil.PUBLISHER)
+ var expectedList = ArrayList<BookWithPublisher>()
+ expectedList.add(expected)
+
+ assertThat(database.booksDao().getBooksWithPublisher(),
+ `is`<List<BookWithPublisher>>(expectedList))
+ }
+
+ @Test
+ fun publisherWithBooks() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
+
+ var actualPublisherWithBooks = booksDao.getPublisherWithBooks(
+ TestUtil.PUBLISHER.publisherId)
+
+ assertThat(actualPublisherWithBooks.publisher, `is`<Publisher>(TestUtil.PUBLISHER))
+ assertThat(actualPublisherWithBooks.books?.size, `is`(2))
+ assertThat(actualPublisherWithBooks.books?.get(0), `is`<Book>(TestUtil.BOOK_1))
+ assertThat(actualPublisherWithBooks.books?.get(1), `is`<Book>(TestUtil.BOOK_2))
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt
new file mode 100644
index 0000000..41fcf82
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt
@@ -0,0 +1,69 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.persistence.room.integration.kotlintestapp.vo.Book
+import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
+import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Test
+
+
+class LiveDataQueryTest : TestDatabaseTest() {
+
+ @Test
+ fun observeBooksById() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1)
+
+ val book = LiveDataTestUtil.getValue(booksDao.getBookLiveData(TestUtil.BOOK_1.bookId))
+
+ assertThat(book, `is`<Book>(TestUtil.BOOK_1))
+ }
+
+ @Test
+ fun observeBooksWithPublisher() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1)
+
+ var expected = BookWithPublisher(TestUtil.BOOK_1.bookId, TestUtil.BOOK_1.title,
+ TestUtil.PUBLISHER)
+ var expectedList = ArrayList<BookWithPublisher>()
+ expectedList.add(expected)
+
+ val actual = LiveDataTestUtil.getValue(booksDao.getBooksWithPublisherLiveData())
+ assertThat(actual, `is`<List<BookWithPublisher>>(expectedList))
+ }
+
+ @Test
+ fun publisherWithBooks() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
+
+ var actualPublisherWithBooks = LiveDataTestUtil.getValue(
+ booksDao.getPublisherWithBooksLiveData(TestUtil.PUBLISHER.publisherId))
+
+ assertThat(actualPublisherWithBooks.publisher, `is`<Publisher>(TestUtil.PUBLISHER))
+ assertThat(actualPublisherWithBooks.books?.size, `is`(2))
+ assertThat(actualPublisherWithBooks.books?.get(0), `is`<Book>(TestUtil.BOOK_1))
+ assertThat(actualPublisherWithBooks.books?.get(1), `is`<Book>(TestUtil.BOOK_2))
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataTestUtil.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataTestUtil.kt
new file mode 100644
index 0000000..5533f11
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataTestUtil.kt
@@ -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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.lifecycle.LiveData
+import android.arch.lifecycle.Observer
+
+object LiveDataTestUtil {
+
+ @Throws(InterruptedException::class)
+ fun <T> getValue(liveData: LiveData<T>): T {
+ val data = arrayOfNulls<Any>(1)
+ val observer = object : Observer<T> {
+ override fun onChanged(o: T?) {
+ data[0] = o
+ liveData.removeObserver(this)
+ }
+ }
+ liveData.observeForever(observer)
+
+ return data[0] as T
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
new file mode 100644
index 0000000..a3d0a68
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
+import org.junit.Test
+
+class RxJava2QueryTest : TestDatabaseTest() {
+
+ @Test
+ fun observeBooksById() {
+ database.booksDao().addAuthors(TestUtil.AUTHOR_1)
+ database.booksDao().addPublishers(TestUtil.PUBLISHER)
+ database.booksDao().addBooks(TestUtil.BOOK_1)
+
+ database.booksDao().getBookFlowable(TestUtil.BOOK_1.bookId)
+ .test()
+ .assertValue { book -> book == TestUtil.BOOK_1 }
+ }
+
+ @Test
+ fun observeBooksWithPublisher() {
+ database.booksDao().addAuthors(TestUtil.AUTHOR_1)
+ database.booksDao().addPublishers(TestUtil.PUBLISHER)
+ database.booksDao().addBooks(TestUtil.BOOK_1)
+
+ var expected = BookWithPublisher(TestUtil.BOOK_1.bookId, TestUtil.BOOK_1.title,
+ TestUtil.PUBLISHER)
+ var expectedList = ArrayList<BookWithPublisher>()
+ expectedList.add(expected)
+
+ database.booksDao().getBooksWithPublisherFlowable()
+ .test()
+ .assertValue(expectedList)
+ }
+
+ @Test
+ fun publisherWithBooks() {
+ booksDao.addAuthors(TestUtil.AUTHOR_1)
+ booksDao.addPublishers(TestUtil.PUBLISHER)
+ booksDao.addBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
+
+ booksDao.getPublisherWithBooksFlowable(TestUtil.PUBLISHER.publisherId)
+ .test()
+ .assertValue {
+ it.publisher == TestUtil.PUBLISHER
+ && it.books?.size == 2
+ && it.books?.get(0) == TestUtil.BOOK_1
+ && it.books?.get(1) == TestUtil.BOOK_2
+ }
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestDatabaseTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestDatabaseTest.kt
new file mode 100644
index 0000000..42815b2
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestDatabaseTest.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.core.executor.testing.InstantTaskExecutorRule
+import android.arch.persistence.room.Room
+import android.arch.persistence.room.integration.kotlintestapp.BooksDao
+import android.arch.persistence.room.integration.kotlintestapp.BooksDatabase
+import android.support.test.InstrumentationRegistry
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+
+abstract class TestDatabaseTest {
+
+ @get:Rule
+ var instantTaskExecutorRule = InstantTaskExecutorRule()
+
+ protected lateinit var database: BooksDatabase
+ protected lateinit var booksDao: BooksDao
+
+ @Before
+ @Throws(Exception::class)
+ fun setUp() {
+ database = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(),
+ BooksDatabase::class.java)
+ // allowing main thread queries, just for testing
+ .allowMainThreadQueries()
+ .build()
+
+ booksDao = database.booksDao()
+ }
+
+ @After
+ @Throws(Exception::class)
+ fun tearDown() {
+ database.close()
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestUtil.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestUtil.kt
new file mode 100644
index 0000000..c4d406c
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/TestUtil.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.persistence.room.integration.kotlintestapp.vo.Author
+import android.arch.persistence.room.integration.kotlintestapp.vo.Book
+import android.arch.persistence.room.integration.kotlintestapp.vo.BookAuthor
+import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
+
+class TestUtil {
+
+ companion object {
+
+ val PUBLISHER = Publisher("ph1", "publisher 1")
+ val PUBLISHER2 = Publisher("ph2", "publisher 2")
+
+ val AUTHOR_1 = Author("a1", "author 1")
+ val AUTHOR_2 = Author("a2", "author 2")
+
+ val BOOK_1 = Book("b1", "book title 1", "ph1")
+ val BOOK_2 = Book("b2", "book title 2", "ph1")
+
+ val BOOK_AUTHOR_1_1 = BookAuthor(BOOK_1.bookId, AUTHOR_1.authorId)
+ val BOOK_AUTHOR_1_2 = BookAuthor(BOOK_1.bookId, AUTHOR_2.authorId)
+ val BOOK_AUTHOR_2_2 = BookAuthor(BOOK_2.bookId, AUTHOR_2.authorId)
+ }
+}
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Author.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Author.kt
new file mode 100644
index 0000000..a51c256
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Author.kt
@@ -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.
+ */
+
+package android.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.PrimaryKey
+
+@Entity
+data class Author(@PrimaryKey val authorId: String, val name: String)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Book.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Book.kt
new file mode 100644
index 0000000..794e60b
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Book.kt
@@ -0,0 +1,28 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.ForeignKey
+import android.arch.persistence.room.PrimaryKey
+
+@Entity(foreignKeys = arrayOf(
+ ForeignKey(entity = Publisher::class,
+ parentColumns = arrayOf("publisherId"),
+ childColumns = arrayOf("bookPublisherId"),
+ deferred = true)))
+data class Book(@PrimaryKey val bookId: String, val title: String, val bookPublisherId: String)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookAuthor.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookAuthor.kt
new file mode 100644
index 0000000..4fc661c
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookAuthor.kt
@@ -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.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.ForeignKey
+
+
+@Entity(foreignKeys = arrayOf(
+ ForeignKey(entity = Book::class,
+ parentColumns = arrayOf("bookId"),
+ childColumns = arrayOf("bookId"),
+ onUpdate = ForeignKey.CASCADE,
+ onDelete = ForeignKey.CASCADE,
+ deferred = true),
+ ForeignKey(entity = Author::class,
+ parentColumns = arrayOf("authorId"),
+ childColumns = arrayOf("authorId"),
+ onUpdate = ForeignKey.CASCADE,
+ onDelete = ForeignKey.CASCADE,
+ deferred = true)),
+ primaryKeys = arrayOf("bookId", "authorId"))
+data class BookAuthor(val bookId: String, val authorId: String)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookWithPublisher.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookWithPublisher.kt
new file mode 100644
index 0000000..6516c23
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/BookWithPublisher.kt
@@ -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.
+ */
+
+package android.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Embedded
+
+
+data class BookWithPublisher(val bookId: String, val title: String,
+ @Embedded val publisher: Publisher)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Publisher.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Publisher.kt
new file mode 100644
index 0000000..ea1550a
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/Publisher.kt
@@ -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.
+ */
+
+package android.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.PrimaryKey
+
+@Entity
+data class Publisher(@PrimaryKey val publisherId: String, val name: String)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/PublisherWithBooks.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/PublisherWithBooks.kt
new file mode 100644
index 0000000..fe482b1
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/PublisherWithBooks.kt
@@ -0,0 +1,28 @@
+/*
+ * 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.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Embedded
+import android.arch.persistence.room.Relation
+
+class PublisherWithBooks {
+ @Embedded var publisher: Publisher? = null
+ @Relation(parentColumn = "publisherId", // publisher.publisherId
+ entityColumn = "bookPublisherId", // book.bookPublisherId
+ entity = Book::class)
+ var books: List<Book>? = null
+}
diff --git a/room/integration-tests/kotlintestapp/src/main/AndroidManifest.xml b/room/integration-tests/kotlintestapp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..d079891
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ 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.arch.persistence.room.integration.kotlintestapp"/>
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index a687653..9873138 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-apply plugin: 'com.android.library'
+apply plugin: 'com.android.application'
project.ext.noDocs = true
@@ -51,8 +51,16 @@
compile project(":room:db")
compile project(":room:db-impl")
compile project(':room:runtime')
- compile project(':arch:core')
+ compile project(':arch:runtime')
+ compile project(':arch:common')
+ compile project(':paging:common')
+ compile project(':lifecycle:extensions')
+ compile project(':lifecycle:runtime')
+ compile project(':lifecycle:common')
+ compile project(':room:rxjava2')
+ compile project(':paging:runtime')
+ compile libs.support.recyclerview
compile libs.support.app_compat
annotationProcessor project(":room:compiler")
androidTestAnnotationProcessor project(":room:compiler")
@@ -71,8 +79,10 @@
androidTestCompile project(':lifecycle:runtime')
androidTestCompile project(':room:testing')
androidTestCompile project(':room:rxjava2')
+ androidTestCompile project(':arch:core-testing')
androidTestCompile libs.rx_java
- testCompile libs.mockito_core
+ androidTestCompile libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
createAndroidCheckstyle(project)
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/1.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/1.json
index fba47c4..e05f095 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/1.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/1.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/2.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/2.json
index db6af46..fc5a1b6 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/2.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/2.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -29,26 +31,29 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
- "indices": []
+ "indices": [],
+ "foreignKeys": []
}
],
"setupQueries": [
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/3.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/3.json
index 4d9dcb3..f4629da 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/3.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/3.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -29,31 +31,35 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "addedInV3",
"columnName": "addedInV3",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
- "indices": []
+ "indices": [],
+ "foreignKeys": []
}
],
"setupQueries": [
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/4.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/4.json
index 7bc6842..b5a0794 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/4.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/4.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -29,50 +31,57 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "addedInV3",
"columnName": "addedInV3",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
- "indices": []
+ "indices": [],
+ "foreignKeys": []
},
{
"tableName": "Entity3",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `removedInV5` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `removedInV5` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "removedInV5",
"columnName": "removedInV5",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/5.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/5.json
index c7d2dd1..367b1f2 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/5.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/5.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -29,45 +31,51 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "addedInV3",
"columnName": "addedInV3",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
- "indices": []
+ "indices": [],
+ "foreignKeys": []
},
{
"tableName": "Entity3",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/6.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/6.json
index a31ad21..3468f5b 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/6.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/6.json
@@ -6,17 +6,19 @@
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -29,31 +31,35 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "addedInV3",
"columnName": "addedInV3",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
- "indices": []
+ "indices": [],
+ "foreignKeys": []
}
],
"setupQueries": [
diff --git a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/7.json b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/7.json
index 33a7d1f..93a9682 100644
--- a/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/7.json
+++ b/room/integration-tests/testapp/schemas/android.arch.persistence.room.integration.testapp.migration.MigrationDb/7.json
@@ -2,21 +2,23 @@
"formatVersion": 1,
"database": {
"version": 7,
- "identityHash": "885b872dd8718be5726ae37479ad74e0",
+ "identityHash": "03ff272b825e27b5c15545c85fe1b845",
"entities": [
{
"tableName": "Entity1",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -39,46 +41,51 @@
},
{
"tableName": "Entity2",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `addedInV3` TEXT, `name` TEXT, PRIMARY KEY(`id`))",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "addedInV3",
"columnName": "addedInV3",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
- "autoGenerate": false
+ "autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "Entity4",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
- "affinity": "INTEGER"
+ "affinity": "INTEGER",
+ "notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
- "affinity": "TEXT"
+ "affinity": "TEXT",
+ "notNull": false
}
],
"primaryKey": {
@@ -105,7 +112,7 @@
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
- "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"885b872dd8718be5726ae37479ad74e0\")"
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"03ff272b825e27b5c15545c85fe1b845\")"
]
}
}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/InvalidationTrackerTrojan.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/InvalidationTrackerTrojan.java
new file mode 100644
index 0000000..5fa15ac
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/InvalidationTrackerTrojan.java
@@ -0,0 +1,26 @@
+/*
+ * 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.arch.persistence.room;
+
+/**
+ * Trojan class to be able to assert internal state.
+ */
+public class InvalidationTrackerTrojan {
+ public static int countObservers(InvalidationTracker tracker) {
+ return tracker.mObserverMap.size();
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
index 5c9bcc7..e573de1 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
@@ -23,6 +23,7 @@
import android.arch.persistence.room.integration.testapp.dao.BlobEntityDao;
import android.arch.persistence.room.integration.testapp.dao.PetCoupleDao;
import android.arch.persistence.room.integration.testapp.dao.PetDao;
+import android.arch.persistence.room.integration.testapp.dao.ProductDao;
import android.arch.persistence.room.integration.testapp.dao.SchoolDao;
import android.arch.persistence.room.integration.testapp.dao.ToyDao;
import android.arch.persistence.room.integration.testapp.dao.UserDao;
@@ -30,6 +31,7 @@
import android.arch.persistence.room.integration.testapp.vo.BlobEntity;
import android.arch.persistence.room.integration.testapp.vo.Pet;
import android.arch.persistence.room.integration.testapp.vo.PetCouple;
+import android.arch.persistence.room.integration.testapp.vo.Product;
import android.arch.persistence.room.integration.testapp.vo.School;
import android.arch.persistence.room.integration.testapp.vo.Toy;
import android.arch.persistence.room.integration.testapp.vo.User;
@@ -37,7 +39,7 @@
import java.util.Date;
@Database(entities = {User.class, Pet.class, School.class, PetCouple.class, Toy.class,
- BlobEntity.class},
+ BlobEntity.class, Product.class},
version = 1, exportSchema = false)
@TypeConverters(TestDatabase.Converters.class)
public abstract class TestDatabase extends RoomDatabase {
@@ -48,6 +50,7 @@
public abstract PetCoupleDao getPetCoupleDao();
public abstract ToyDao getToyDao();
public abstract BlobEntityDao getBlobEntityDao();
+ public abstract ProductDao getProductDao();
@SuppressWarnings("unused")
public static class Converters {
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/ProductDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/ProductDao.java
new file mode 100644
index 0000000..417fb72
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/ProductDao.java
@@ -0,0 +1,30 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.dao;
+
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.integration.testapp.vo.Product;
+import android.support.annotation.NonNull;
+
+@Dao
+public interface ProductDao {
+
+ @Insert
+ long insert(@NonNull Product product);
+
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
index 3360893..97461c0 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
@@ -26,6 +26,8 @@
import android.arch.persistence.room.integration.testapp.TestDatabase;
import android.arch.persistence.room.integration.testapp.vo.AvgWeightByAge;
import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.util.paging.CountedDataSource;
+import android.arch.util.paging.LiveLazyListProvider;
import android.database.Cursor;
import org.reactivestreams.Publisher;
@@ -35,6 +37,8 @@
import java.util.concurrent.Callable;
import io.reactivex.Flowable;
+import io.reactivex.Maybe;
+import io.reactivex.Single;
@SuppressWarnings("SameParameterValue")
@Dao
@@ -67,6 +71,9 @@
@Delete
public abstract int deleteAll(User[] users);
+ @Query("delete from user")
+ public abstract int deleteEverything();
+
@Update
public abstract int update(User user);
@@ -94,6 +101,9 @@
@Query("update user set mId = mId + :amount")
public abstract void incrementIds(int amount);
+ @Query("update user set mAge = mAge + 1")
+ public abstract void incrementAgeOfAll();
+
@Query("select mId from user order by mId ASC")
public abstract List<Integer> loadIds();
@@ -124,6 +134,18 @@
@Query("select * from user where mId = :id")
public abstract Flowable<User> flowableUserById(int id);
+ @Query("select * from user where mId = :id")
+ public abstract Maybe<User> maybeUserById(int id);
+
+ @Query("select * from user where mId IN (:ids)")
+ public abstract Maybe<List<User>> maybeUsersByIds(int... ids);
+
+ @Query("select * from user where mId = :id")
+ public abstract Single<User> singleUserById(int id);
+
+ @Query("select * from user where mId IN (:ids)")
+ public abstract Single<List<User>> singleUsersByIds(int... ids);
+
@Query("select COUNT(*) from user")
public abstract Flowable<Integer> flowableCountUsers();
@@ -131,6 +153,7 @@
public abstract Publisher<Integer> publisherCountUsers();
@Query("SELECT mBirthday from User where mId = :id")
+
public abstract Date getBirthday(int id);
@Query("SELECT COUNT(*) from user")
@@ -156,4 +179,51 @@
}
});
}
+
+ @Query("SELECT * FROM user where mAge > :age")
+ public abstract LiveLazyListProvider<User> loadPagedByAge(int age);
+
+ @Query("SELECT * FROM user ORDER BY mAge DESC")
+ public abstract CountedDataSource<User> loadUsersByAgeDesc();
+
+ @Query("DELETE FROM User WHERE mId IN (:ids) AND mAge == :age")
+ public abstract int deleteByAgeAndIds(int age, List<Integer> ids);
+
+ @Query("UPDATE User set mWeight = :weight WHERE mId IN (:ids) AND mAge == :age")
+ public abstract int updateByAgeAndIds(float weight, int age, List<Integer> ids);
+
+ // QueryLoader
+
+ @Query("SELECT COUNT(*) from user")
+ public abstract Integer getUserCount();
+
+ // name desc
+ @Query("SELECT * from user ORDER BY mName DESC LIMIT :limit OFFSET :offset")
+ public abstract List<User> userNameLimitOffset(int limit, int offset);
+
+ @Query("SELECT * from user WHERE mName < :key ORDER BY mName DESC LIMIT :limit")
+ public abstract List<User> userNameLoadAfter(String key, int limit);
+
+ @Query("SELECT * from user WHERE mName > :key ORDER BY mName ASC LIMIT :limit")
+ public abstract List<User> userNameLoadBefore(String key, int limit);
+
+ // last asc, first desc, id asc
+ @Query("SELECT * from user"
+ + " ORDER BY mLastName DESC, mName ASC, mId DESC"
+ + " LIMIT :limit OFFSET :offset")
+ public abstract List<User> userComplexLimitOffset(int limit, int offset);
+
+ @Query("SELECT * from user"
+ + " WHERE mLastName < :lastName or (mLastName = :lastName and (mName > :name or (mName = :name and mId < :id)))"
+ + " ORDER BY mLastName DESC, mName ASC, mId DESC"
+ + " LIMIT :limit")
+ public abstract List<User> userComplexLoadAfter(String lastName, String name, int id, int limit);
+
+ @Query("SELECT * from user"
+ + " WHERE mLastName > :lastName or (mLastName = :lastName and (mName < :name or (mName = :name and mId > :id)))"
+ + " ORDER BY mLastName ASC, mName DESC, mId ASC"
+ + " LIMIT :limit")
+ public abstract List<User> userComplexLoadBefore(String lastName, String name, int id, int limit);
+
+
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
index 7ba62a5..3507aee 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
@@ -22,6 +22,7 @@
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
+import android.arch.persistence.room.integration.testapp.vo.EmbeddedUserAndAllPets;
import android.arch.persistence.room.integration.testapp.vo.Pet;
import android.arch.persistence.room.integration.testapp.vo.User;
import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
@@ -61,6 +62,9 @@
@Query("SELECT * FROM User u where u.mId = :userId")
LiveData<UserAndAllPets> liveUserWithPets(int userId);
+ @Query("SELECT * FROM User u where u.mId = :uid")
+ EmbeddedUserAndAllPets loadUserAndPetsAsEmbedded(int uid);
+
@Insert
void insertUserAndPet(User user, Pet pet);
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationDb.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationDb.java
index bf1ad0d..4a95ad8 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationDb.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationDb.java
@@ -50,7 +50,7 @@
@Entity
static class Entity2 {
public static final String TABLE_NAME = "Entity2";
- @PrimaryKey
+ @PrimaryKey(autoGenerate = true)
public int id;
public String addedInV3;
public String name;
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
index 6e38b97..aa297ed 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
@@ -28,6 +28,7 @@
import android.arch.persistence.room.migration.Migration;
import android.arch.persistence.room.testing.MigrationTestHelper;
import android.arch.persistence.room.util.TableInfo;
+import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -52,7 +53,7 @@
public MigrationTest() {
helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
- MigrationDb.class.getCanonicalName(), new FrameworkSQLiteOpenHelperFactory());
+ MigrationDb.class.getCanonicalName());
}
@Test
@@ -105,7 +106,8 @@
}
private MigrationDb getLatestDb() {
- MigrationDb db = Room.databaseBuilder(InstrumentationRegistry.getContext(),
+ MigrationDb db = Room.databaseBuilder(
+ InstrumentationRegistry.getInstrumentation().getTargetContext(),
MigrationDb.class, TEST_DB).addMigrations(ALL_MIGRATIONS).build();
// trigger open
db.beginTransaction();
@@ -199,8 +201,8 @@
7, false, new Migration(6, 7) {
@Override
public void migrate(SupportSQLiteDatabase database) {
- database.execSQL("CREATE TABLE Entity4 (`id` INTEGER, `name` TEXT,"
- + " PRIMARY KEY(`id`))");
+ database.execSQL("CREATE TABLE Entity4 (`id` INTEGER NOT NULL,"
+ + " `name` TEXT, PRIMARY KEY(`id`))");
}
});
} catch (Throwable t) {
@@ -220,6 +222,36 @@
assertThat(info.foreignKeys.size(), is(1));
}
+ @Test
+ public void missingMigration() throws IOException {
+ SupportSQLiteDatabase database = helper.createDatabase(TEST_DB, 1);
+ database.close();
+ try {
+ Context targetContext = InstrumentationRegistry.getTargetContext();
+ MigrationDb db = Room.databaseBuilder(targetContext, MigrationDb.class, TEST_DB)
+ .build();
+ db.dao().loadAllEntity1s();
+ throw new AssertionError("Should've failed :/");
+ } catch (IllegalStateException ignored) {
+ }
+ }
+
+ @Test
+ public void missingMigrationNuke() throws IOException {
+ SupportSQLiteDatabase database = helper.createDatabase(TEST_DB, 1);
+ final MigrationDb.Dao_V1 dao = new MigrationDb.Dao_V1(database);
+ dao.insertIntoEntity1(2, "foo");
+ dao.insertIntoEntity1(3, "bar");
+ database.close();
+
+ Context targetContext = InstrumentationRegistry.getTargetContext();
+ MigrationDb db = Room.databaseBuilder(targetContext, MigrationDb.class, TEST_DB)
+ .fallbackToDestructiveMigration()
+ .build();
+ assertThat(db.dao().loadAllEntity1s().size(), is(0));
+ db.close();
+ }
+
private void testFailure(int startVersion, int endVersion) throws IOException {
final SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, startVersion);
db.close();
@@ -231,18 +263,20 @@
throwable = t;
}
assertThat(throwable, instanceOf(IllegalStateException.class));
+ //noinspection ConstantConditions
assertThat(throwable.getMessage(), containsString("Migration failed"));
}
- static final Migration MIGRATION_1_2 = new Migration(1, 2) {
+ private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
- database.execSQL("CREATE TABLE IF NOT EXISTS `Entity2` (`id` INTEGER,"
- + " `name` TEXT, PRIMARY KEY(`id`))");
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity2` ("
+ + "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ + " `name` TEXT)");
}
};
- static final Migration MIGRATION_2_3 = new Migration(2, 3) {
+ private static final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE " + MigrationDb.Entity2.TABLE_NAME
@@ -250,18 +284,18 @@
}
};
- static final Migration MIGRATION_3_4 = new Migration(3, 4) {
+ private static final Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(SupportSQLiteDatabase database) {
- database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3` (`id` INTEGER,"
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3` (`id` INTEGER NOT NULL,"
+ " `removedInV5` TEXT, `name` TEXT, PRIMARY KEY(`id`))");
}
};
- static final Migration MIGRATION_4_5 = new Migration(4, 5) {
+ private static final Migration MIGRATION_4_5 = new Migration(4, 5) {
@Override
public void migrate(SupportSQLiteDatabase database) {
- database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3_New` (`id` INTEGER,"
+ database.execSQL("CREATE TABLE IF NOT EXISTS `Entity3_New` (`id` INTEGER NOT NULL,"
+ " `name` TEXT, PRIMARY KEY(`id`))");
database.execSQL("INSERT INTO Entity3_New(`id`, `name`) "
+ "SELECT `id`, `name` FROM Entity3");
@@ -270,18 +304,18 @@
}
};
- static final Migration MIGRATION_5_6 = new Migration(5, 6) {
+ private static final Migration MIGRATION_5_6 = new Migration(5, 6) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("DROP TABLE " + MigrationDb.Entity3.TABLE_NAME);
}
};
- static final Migration MIGRATION_6_7 = new Migration(6, 7) {
+ private static final Migration MIGRATION_6_7 = new Migration(6, 7) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS " + MigrationDb.Entity4.TABLE_NAME
- + " (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`),"
+ + " (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`),"
+ " FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`)"
+ " ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)");
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LimitOffsetDataSourceTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LimitOffsetDataSourceTest.java
new file mode 100644
index 0000000..961a07e
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LimitOffsetDataSourceTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.paging;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.persistence.room.integration.testapp.test.TestDatabaseTest;
+import android.arch.persistence.room.integration.testapp.test.TestUtil;
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.util.paging.CountedDataSource;
+import android.support.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LimitOffsetDataSourceTest extends TestDatabaseTest {
+ @Test
+ public void emptyPage() {
+ CountedDataSource<User> dataSource = mUserDao.loadUsersByAgeDesc();
+ assertThat(dataSource.loadCount(), is(0));
+ }
+
+ @Test
+ public void initial() {
+ List<User> users = createTestData();
+ CountedDataSource<User> dataSource = mUserDao.loadUsersByAgeDesc();
+ assertThat(dataSource.loadCount(), is(10));
+ List<User> initial = dataSource.loadAfterInitial(-1, 1);
+ assertThat(initial.get(0), is(users.get(0)));
+ List<User> second = dataSource.loadAfterInitial(0, 1);
+ assertThat(second.get(0), is(users.get(1)));
+ }
+
+ @Test
+ public void loadAll() {
+ List<User> users = createTestData();
+
+ CountedDataSource<User> dataSource = mUserDao.loadUsersByAgeDesc();
+ List<User> all = dataSource.loadAfterInitial(-1, 10);
+ assertThat(users, is(all));
+ }
+
+ @Test
+ public void loadAfter() {
+ List<User> users = createTestData();
+ CountedDataSource<User> dataSource = mUserDao.loadUsersByAgeDesc();
+ List<User> result = dataSource.loadAfter(3, users.get(3), 2);
+ assertThat(result, is(users.subList(4, 6)));
+ }
+
+ @Test
+ public void loadBefore() {
+ List<User> users = createTestData();
+ CountedDataSource<User> dataSource = mUserDao.loadUsersByAgeDesc();
+ List<User> result = dataSource.loadBefore(5, users.get(5), 3);
+ List<User> expected = new ArrayList<>(users.subList(2, 5));
+ Collections.reverse(expected);
+ assertThat(result, is(expected));
+ }
+
+ @NonNull
+ private List<User> createTestData() {
+ List<User> users = new ArrayList<>();
+ for (int i = 0; i < 10; i++) {
+ User user = TestUtil.createUser(i);
+ user.setAge(1);
+ mUserDao.insert(user);
+ users.add(user);
+ }
+ return users;
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LiveLazyListProviderTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LiveLazyListProviderTest.java
new file mode 100644
index 0000000..d9472c1
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LiveLazyListProviderTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.paging;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.testing.CountingTaskExecutorRule;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.Observer;
+import android.arch.persistence.room.integration.testapp.test.TestDatabaseTest;
+import android.arch.persistence.room.integration.testapp.test.TestUtil;
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.util.paging.LazyList;
+import android.arch.util.paging.ListConfig;
+import android.support.annotation.Nullable;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+@RunWith(AndroidJUnit4.class)
+public class LiveLazyListProviderTest extends TestDatabaseTest {
+ @Rule
+ public CountingTaskExecutorRule mExecutorRule = new CountingTaskExecutorRule();
+ @Test
+ @LargeTest
+ public void getUsersAsLazyList()
+ throws InterruptedException, ExecutionException, TimeoutException {
+ mDatabase.beginTransaction();
+ try {
+ for (int i = 0; i < 100; i++) {
+ final User user = TestUtil.createUser(i + 1);
+ user.setAge(i);
+ mUserDao.insert(user);
+ }
+ mDatabase.setTransactionSuccessful();
+ } finally {
+ mDatabase.endTransaction();
+ }
+ assertThat(mUserDao.count(), is(100));
+ final LiveData<LazyList<User>> livePagedUsers = mUserDao.loadPagedByAge(3).create(
+ ListConfig.builder().pageSize(10).prefetchDistance(1).create());
+
+ final TestLifecycleOwner testOwner = new TestLifecycleOwner();
+ testOwner.handleEvent(Lifecycle.Event.ON_CREATE);
+ drain();
+ LazyListObserver<User> observer = new LazyListObserver<>();
+
+ observe(livePagedUsers, testOwner, observer);
+ assertThat(observer.get(), nullValue());
+ observer.reset();
+
+ testOwner.handleEvent(Lifecycle.Event.ON_START);
+ drain();
+
+ LazyList<User> lazyList1 = observer.get();
+ assertThat(lazyList1, is(notNullValue()));
+
+ assertThat(lazyList1.size(), is(96));
+ assertThat(lazyList1.get(20), is(nullValue()));
+ drain();
+ assertThat(lazyList1.get(31), nullValue());
+ assertThat(lazyList1.get(20), notNullValue());
+ assertThat(lazyList1.get(16), notNullValue());
+
+ drain();
+ assertThat(lazyList1.get(31), notNullValue());
+ assertThat(lazyList1.get(50), nullValue());
+ drain();
+ assertThat(lazyList1.get(50), notNullValue());
+ observer.reset();
+ // now invalidate the database but don't get the new paged list
+ mUserDao.updateById(50, "foo");
+ assertThat(lazyList1.get(70), nullValue());
+ drain();
+ assertThat(lazyList1.get(70), nullValue());
+ LazyList<User> lazyList = observer.get();
+ assertThat(lazyList.get(70), notNullValue());
+ }
+
+ private void drain() throws InterruptedException, TimeoutException {
+ mExecutorRule.drainTasks(60, TimeUnit.SECONDS);
+ }
+
+ private void observe(final LiveData liveData, final LifecycleOwner provider,
+ final Observer observer) throws ExecutionException, InterruptedException {
+ FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ //noinspection unchecked
+ liveData.observe(provider, observer);
+ return null;
+ }
+ });
+ AppToolkitTaskExecutor.getInstance().executeOnMainThread(futureTask);
+ futureTask.get();
+ }
+
+ static class TestLifecycleOwner implements LifecycleOwner {
+
+ private LifecycleRegistry mLifecycle;
+
+ TestLifecycleOwner() {
+ mLifecycle = new LifecycleRegistry(this);
+ }
+
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycle;
+ }
+
+ void handleEvent(Lifecycle.Event event) {
+ mLifecycle.handleLifecycleEvent(event);
+ }
+ }
+
+ private static class LazyListObserver<T> implements Observer<LazyList<T>> {
+ private LazyList<T> mList;
+ public void reset() {
+ mList = null;
+ }
+
+ public LazyList<T> get() {
+ return mList;
+ }
+
+ @Override
+ public void onChanged(@Nullable LazyList<T> lazyList) {
+ mList = lazyList;
+ }
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java
new file mode 100644
index 0000000..5b44c08
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.test;
+
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.util.paging.CountedDataSource;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class ComplexQueryDataSourceTest extends TestDatabaseTest {
+ /**
+ * Proper, keyed implementation.
+ */
+ public class KeyedUserQueryDataSource extends CountedDataSource<User> {
+ @Override
+ public int loadCount() {
+ return mUserDao.getUserCount();
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(int position, int pageSize) {
+ return mUserDao.userComplexLimitOffset(pageSize, position + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(int currentEndIndex, @NonNull User currentEndItem,
+ int pageSize) {
+ return mUserDao.userComplexLoadAfter(
+ currentEndItem.getLastName(),
+ currentEndItem.getName(),
+ currentEndItem.getId(),
+ pageSize);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(int currentBeginIndex, @NonNull User currentBeginItem,
+ int pageSize) {
+ return mUserDao.userComplexLoadBefore(
+ currentBeginItem.getLastName(),
+ currentBeginItem.getName(),
+ currentBeginItem.getId(),
+ pageSize);
+ }
+ }
+
+ /**
+ * Lazy, LIMIT/OFFSET implementation.
+ */
+ public class OffsetUserQueryDataSource extends CountedDataSource<User> {
+
+ @Override
+ public int loadCount() {
+ return mUserDao.getUserCount();
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(int position, int pageSize) {
+ return mUserDao.userComplexLimitOffset(pageSize, position + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(int currentEndIndex, @NonNull User currentEndItem,
+ int pageSize) {
+ return mUserDao.userComplexLimitOffset(pageSize, currentEndIndex + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(int currentBeginIndex, @NonNull User currentBeginItem,
+ int pageSize) {
+ int targetOffset = currentBeginIndex - pageSize;
+ int offset = Math.max(0, targetOffset);
+ int limit = Math.min(pageSize, pageSize + targetOffset);
+
+ List<User> users = mUserDao.userComplexLimitOffset(limit, offset);
+ Collections.reverse(users); // :P
+ return users;
+ }
+ }
+
+ private static final User[] USERS_BY_LAST_FIRST_ID = new User[100];
+
+ @BeforeClass
+ public static void setupClass() {
+ String[] lastNames = new String[10];
+
+ String[] firstNames = new String[10];
+ for (int i = 0; i < 10; i++) {
+ lastNames[i] = "f" + (char) ('a' + i);
+ firstNames[i] = "l" + (char) ('a' + i);
+ }
+
+ for (int i = 0; i < USERS_BY_LAST_FIRST_ID.length; i++) {
+ User user = new User();
+ user.setId(i);
+ user.setName(firstNames[i % 10]);
+ user.setLastName(lastNames[(i / 10) % 10]);
+ user.setAge((int) (10 + Math.random() * 50));
+ user.setCustomField(UUID.randomUUID().toString());
+ user.setBirthday(new Date());
+ USERS_BY_LAST_FIRST_ID[i] = user;
+ }
+ }
+
+ @Before
+ public void setup() {
+ mUserDao.insertAll(USERS_BY_LAST_FIRST_ID);
+
+ Arrays.sort(USERS_BY_LAST_FIRST_ID, new Comparator<User>() {
+ @Override
+ public int compare(User o1, User o2) {
+ int diff = o2.getLastName().compareTo(o1.getLastName());
+ if (diff != 0) {
+ return diff;
+ }
+ diff = o2.getName().compareTo(o1.getName());
+ if (diff != 0) {
+ return -diff; // Note: 'mName' is ASC, therefore diff reversed
+ }
+
+ return o2.getId() - o1.getId();
+ }
+ });
+ }
+
+ @Test
+ public void testKeyedQueryDataSource() {
+ QueryDataSourceTest.verifyUserDataSource(USERS_BY_LAST_FIRST_ID,
+ new KeyedUserQueryDataSource());
+ }
+
+ @Test
+ public void testIndexedQueryDataSourceFull() {
+ QueryDataSourceTest.verifyUserDataSource(USERS_BY_LAST_FIRST_ID,
+ new OffsetUserQueryDataSource());
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/CustomDatabaseTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/CustomDatabaseTest.java
new file mode 100644
index 0000000..353c2e3
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/CustomDatabaseTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.test;
+
+import static org.mockito.AdditionalAnswers.delegatesTo;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+
+import android.arch.persistence.db.SupportSQLiteDatabase;
+import android.arch.persistence.db.SupportSQLiteOpenHelper;
+import android.arch.persistence.db.SupportSQLiteQuery;
+import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.integration.testapp.database.Customer;
+import android.arch.persistence.room.integration.testapp.database.SampleDatabase;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class CustomDatabaseTest {
+
+ @Test
+ public void invalidationTrackerAfterClose() {
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ RoomDatabase.Builder<SampleDatabase> builder =
+ Room.databaseBuilder(context, SampleDatabase.class, "db")
+ .openHelperFactory(new RethrowExceptionFactory());
+ Customer customer = new Customer();
+ for (int i = 0; i < 100; i++) {
+ SampleDatabase db = builder.build();
+ customer.setId(i);
+ db.getCustomerDao().insert(customer);
+ // Give InvalidationTracker enough time to start #mRefreshRunnable and pass the
+ // initialization check.
+ SystemClock.sleep(1);
+ // InvalidationTracker#mRefreshRunnable will cause race condition if its database query
+ // happens after close.
+ db.close();
+ }
+ }
+
+ /**
+ * This is mostly {@link FrameworkSQLiteOpenHelperFactory}, but the returned {@link
+ * SupportSQLiteDatabase} fails with {@link RuntimeException} instead of {@link
+ * IllegalStateException} or {@link SQLiteException}. This way, we can simulate custom database
+ * implementation that throws its own exception types.
+ */
+ private static class RethrowExceptionFactory implements SupportSQLiteOpenHelper.Factory {
+
+ @Override
+ public SupportSQLiteOpenHelper create(SupportSQLiteOpenHelper.Configuration configuration) {
+ final FrameworkSQLiteOpenHelperFactory factory = new FrameworkSQLiteOpenHelperFactory();
+ final SupportSQLiteOpenHelper helper = factory.create(configuration);
+ SupportSQLiteOpenHelper helperMock = mock(SupportSQLiteOpenHelper.class,
+ delegatesTo(helper));
+ // Inject mocks to the object hierarchy.
+ doAnswer(new Answer() {
+ @Override
+ public SupportSQLiteDatabase answer(InvocationOnMock invocation)
+ throws Throwable {
+ final SupportSQLiteDatabase db = helper.getWritableDatabase();
+ SupportSQLiteDatabase dbMock = mock(SupportSQLiteDatabase.class,
+ delegatesTo(db));
+ doAnswer(new Answer() {
+ @Override
+ public Cursor answer(InvocationOnMock invocation) throws Throwable {
+ SupportSQLiteQuery query = invocation.getArgument(0);
+ try {
+ return db.query(query);
+ } catch (IllegalStateException | SQLiteException e) {
+ // Rethrow the exception in order to simulate the way custom
+ // database implementation throws its own exception types.
+ throw new RuntimeException("closed", e);
+ }
+ }
+ }).when(dbMock).query(any(SupportSQLiteQuery.class));
+ return dbMock;
+ }
+ }).when(helperMock).getWritableDatabase();
+ return helperMock;
+ }
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/DatabaseCallbackTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/DatabaseCallbackTest.java
new file mode 100644
index 0000000..579b3e4
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/DatabaseCallbackTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.core.IsCollectionContaining.hasItem;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.arch.persistence.db.SupportSQLiteDatabase;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.integration.testapp.TestDatabase;
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.content.Context;
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class DatabaseCallbackTest {
+
+ @Test
+ @MediumTest
+ public void createAndOpen() {
+ Context context = InstrumentationRegistry.getTargetContext();
+ TestDatabaseCallback callback1 = new TestDatabaseCallback();
+ TestDatabase db1 = Room.databaseBuilder(context, TestDatabase.class, "test")
+ .addCallback(callback1)
+ .build();
+ assertFalse(callback1.mCreated);
+ assertFalse(callback1.mOpened);
+ User user1 = TestUtil.createUser(3);
+ user1.setName("george");
+ db1.getUserDao().insert(user1);
+ assertTrue(callback1.mCreated);
+ assertTrue(callback1.mOpened);
+ TestDatabaseCallback callback2 = new TestDatabaseCallback();
+ TestDatabase db2 = Room.databaseBuilder(context, TestDatabase.class, "test")
+ .addCallback(callback2)
+ .build();
+ assertFalse(callback2.mCreated);
+ assertFalse(callback2.mOpened);
+ User user2 = db2.getUserDao().load(3);
+ assertThat(user2.getName(), is("george"));
+ assertFalse(callback2.mCreated); // Not called; already created by db1
+ assertTrue(callback2.mOpened);
+ }
+
+ @Test
+ @SmallTest
+ public void writeOnCreate() {
+ Context context = InstrumentationRegistry.getTargetContext();
+ TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
+ .addCallback(new RoomDatabase.Callback() {
+ @Override
+ public void onCreate(@NonNull SupportSQLiteDatabase db) {
+ Cursor cursor = null;
+ try {
+ cursor = db.query(
+ "SELECT name FROM sqlite_master WHERE type = 'table'");
+ ArrayList<String> names = new ArrayList<>();
+ while (cursor.moveToNext()) {
+ names.add(cursor.getString(0));
+ }
+ assertThat(names, hasItem("User"));
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ }
+ })
+ .build();
+ List<Integer> ids = db.getUserDao().loadIds();
+ assertThat(ids, is(empty()));
+ }
+
+ public static class TestDatabaseCallback extends RoomDatabase.Callback {
+
+ boolean mCreated;
+ boolean mOpened;
+
+ @Override
+ public void onCreate(@NonNull SupportSQLiteDatabase db) {
+ mCreated = true;
+ }
+
+ @Override
+ public void onOpen(@NonNull SupportSQLiteDatabase db) {
+ mOpened = true;
+ }
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
index 75f0dc3..927f0f4 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
@@ -22,30 +22,37 @@
import static org.hamcrest.MatcherAssert.assertThat;
import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.testing.CountingTaskExecutorRule;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.Observer;
+import android.arch.persistence.room.InvalidationTrackerTrojan;
import android.arch.persistence.room.integration.testapp.vo.AvgWeightByAge;
import android.arch.persistence.room.integration.testapp.vo.Pet;
import android.arch.persistence.room.integration.testapp.vo.User;
import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
import android.support.annotation.Nullable;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
/**
* Tests invalidation tracking.
@@ -53,17 +60,19 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class LiveDataQueryTest extends TestDatabaseTest {
+ @Rule
+ public CountingTaskExecutorRule mExecutorRule = new CountingTaskExecutorRule();
+
@Test
- public void observeById() throws InterruptedException, ExecutionException {
+ public void observeById() throws InterruptedException, ExecutionException, TimeoutException {
final LiveData<User> userLiveData = mUserDao.liveUserById(5);
final TestLifecycleOwner testOwner = new TestLifecycleOwner();
testOwner.handleEvent(Lifecycle.Event.ON_CREATE);
- final LatchObserver<User> observer = new LatchObserver<>();
+ final TestObserver<User> observer = new TestObserver<>();
observe(userLiveData, testOwner, observer);
-
- observer.assertNoUpdate();
-
+ assertThat(observer.hasValue(), is(false));
observer.reset();
+
testOwner.handleEvent(Lifecycle.Event.ON_START);
assertThat(observer.get(), is(nullValue()));
@@ -88,15 +97,16 @@
observer.reset();
u5.setName("baba");
mUserDao.insertOrReplace(u5);
- observer.assertNoUpdate();
+ assertThat(observer.hasValue(), is(false));
}
@Test
- public void observeListQuery() throws InterruptedException, ExecutionException {
+ public void observeListQuery() throws InterruptedException, ExecutionException,
+ TimeoutException {
final LiveData<List<User>> userLiveData = mUserDao.liveUsersListByName("frida");
final TestLifecycleOwner lifecycleOwner = new TestLifecycleOwner();
lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
- final LatchObserver<List<User>> observer = new LatchObserver<>();
+ final TestObserver<List<User>> observer = new TestObserver<>();
observe(userLiveData, lifecycleOwner, observer);
assertThat(observer.get(), is(Collections.<User>emptyList()));
@@ -106,7 +116,6 @@
mUserDao.insert(user1);
assertThat(observer.get(), is(Collections.singletonList(user1)));
-
observer.reset();
final User user2 = TestUtil.createUser(5);
user2.setName("does not match");
@@ -124,20 +133,21 @@
final User user3 = TestUtil.createUser(9);
user3.setName("painter frida");
mUserDao.insertOrReplace(user3);
- observer.assertNoUpdate();
+ assertThat(observer.hasValue(), is(false));
observer.reset();
final User user4 = TestUtil.createUser(11);
user4.setName("friday");
mUserDao.insertOrReplace(user4);
- observer.assertNoUpdate();
+ assertThat(observer.hasValue(), is(false));
lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
assertThat(observer.get(), is(Arrays.asList(user4, user3)));
}
@Test
- public void liveDataWithPojo() throws ExecutionException, InterruptedException {
+ public void liveDataWithPojo() throws ExecutionException, InterruptedException,
+ TimeoutException {
User[] users = TestUtil.createUsersArray(3, 5, 7, 9);
users[0].setAge(10);
users[0].setWeight(15);
@@ -154,7 +164,7 @@
final TestLifecycleOwner lifecycleOwner = new TestLifecycleOwner();
lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
- final LatchObserver<AvgWeightByAge> observer = new LatchObserver<>();
+ final TestObserver<AvgWeightByAge> observer = new TestObserver<>();
LiveData<AvgWeightByAge> liveData = mUserDao.maxWeightByAgeGroup();
observe(liveData, lifecycleOwner, observer);
@@ -173,9 +183,9 @@
}
@Test
- public void withRelation() throws ExecutionException, InterruptedException {
+ public void withRelation() throws ExecutionException, InterruptedException, TimeoutException {
final LiveData<UserAndAllPets> liveData = mUserPetDao.liveUserWithPets(3);
- final LatchObserver<UserAndAllPets> observer = new LatchObserver<>();
+ final TestObserver<UserAndAllPets> observer = new TestObserver<>();
final TestLifecycleOwner lifecycleOwner = new TestLifecycleOwner();
lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
observe(liveData, lifecycleOwner, observer);
@@ -196,6 +206,43 @@
assertThat(withPets.pets, is(Arrays.asList(pets)));
}
+ @MediumTest
+ @Test
+ public void handleGc() throws ExecutionException, InterruptedException, TimeoutException {
+ LiveData<User> liveData = mUserDao.liveUserById(3);
+ final TestObserver<User> observer = new TestObserver<>();
+ final TestLifecycleOwner lifecycleOwner = new TestLifecycleOwner();
+ lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
+ observe(liveData, lifecycleOwner, observer);
+ assertThat(observer.get(), is(nullValue()));
+ observer.reset();
+ final User user = TestUtil.createUser(3);
+ mUserDao.insert(user);
+ assertThat(observer.get(), is(notNullValue()));
+ observer.reset();
+ forceGc();
+ String name = UUID.randomUUID().toString();
+ mUserDao.updateById(3, name);
+ assertThat(observer.get().getName(), is(name));
+
+ // release references
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ lifecycleOwner.handleEvent(Lifecycle.Event.ON_DESTROY);
+ }
+ });
+ WeakReference<LiveData> weakLiveData = new WeakReference<LiveData>(liveData);
+ //noinspection UnusedAssignment
+ liveData = null;
+ forceGc();
+ mUserDao.updateById(3, "Bar");
+ forceGc();
+ assertThat(InvalidationTrackerTrojan.countObservers(mDatabase.getInvalidationTracker()),
+ is(0));
+ assertThat(weakLiveData.get(), nullValue());
+ }
+
private void observe(final LiveData liveData, final LifecycleOwner provider,
final Observer observer) throws ExecutionException, InterruptedException {
FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
@@ -210,7 +257,19 @@
futureTask.get();
}
+ private void drain() throws TimeoutException, InterruptedException {
+ mExecutorRule.drainTasks(1, TimeUnit.MINUTES);
+ }
+
+ private static void forceGc() {
+ Runtime.getRuntime().gc();
+ Runtime.getRuntime().runFinalization();
+ Runtime.getRuntime().gc();
+ Runtime.getRuntime().runFinalization();
+ }
+
static class TestLifecycleOwner implements LifecycleOwner {
+
private LifecycleRegistry mLifecycle;
TestLifecycleOwner() {
@@ -227,27 +286,29 @@
}
}
- private class LatchObserver<T> implements Observer<T> {
- static final int TIMEOUT = 3;
- T mLastData;
- CountDownLatch mSetLatch = new CountDownLatch(1);
+ private class TestObserver<T> implements Observer<T> {
+ private T mLastData;
+ private boolean mHasValue = false;
void reset() {
- mSetLatch = new CountDownLatch(1);
+ mHasValue = false;
+ mLastData = null;
}
+
@Override
public void onChanged(@Nullable T o) {
mLastData = o;
- mSetLatch.countDown();
+ mHasValue = true;
}
- void assertNoUpdate() throws InterruptedException {
- assertThat(mSetLatch.await(TIMEOUT, TimeUnit.SECONDS),
- is(false));
+ boolean hasValue() throws TimeoutException, InterruptedException {
+ drain();
+ return mHasValue;
}
- T get() throws InterruptedException {
- assertThat(mSetLatch.await(TIMEOUT, TimeUnit.SECONDS), is(true));
+ T get() throws InterruptedException, TimeoutException {
+ drain();
+ assertThat(hasValue(), is(true));
return mLastData;
}
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PojoWithRelationTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PojoWithRelationTest.java
index 2057d47..45233f3 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PojoWithRelationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PojoWithRelationTest.java
@@ -17,17 +17,18 @@
package android.arch.persistence.room.integration.testapp.test;
import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
+import android.arch.persistence.room.integration.testapp.vo.EmbeddedUserAndAllPets;
import android.arch.persistence.room.integration.testapp.vo.Pet;
import android.arch.persistence.room.integration.testapp.vo.Toy;
import android.arch.persistence.room.integration.testapp.vo.User;
import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
import android.arch.persistence.room.integration.testapp.vo.UserIdAndPetNames;
import android.arch.persistence.room.integration.testapp.vo.UserWithPetsAndToys;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -131,4 +132,13 @@
assertThat(userAndAllPets.get(1).pets, is(Arrays.asList(pets_2)));
assertThat(userAndAllPets.get(3).pets, is(Arrays.asList(pets_2)));
}
+
+ @Test
+ public void embeddedRelation() {
+ createData();
+ EmbeddedUserAndAllPets relationContainer = mUserPetDao.loadUserAndPetsAsEmbedded(1);
+ assertThat(relationContainer.getUserAndAllPets(), notNullValue());
+ assertThat(relationContainer.getUserAndAllPets().user.getId(), is(1));
+ assertThat(relationContainer.getUserAndAllPets().pets.size(), is(2));
+ }
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java
new file mode 100644
index 0000000..eadb8db
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.util.paging.CountedDataSource;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class QueryDataSourceTest extends TestDatabaseTest {
+ /**
+ * Proper, keyed implementation.
+ */
+ public class KeyedUserQueryDataSource extends CountedDataSource<User> {
+ @Override
+ public int loadCount() {
+ return mUserDao.getUserCount();
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(int position, int pageSize) {
+ return mUserDao.userNameLimitOffset(pageSize, position + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(int currentEndIndex, @NonNull User currentEndItem,
+ int pageSize) {
+ return mUserDao.userNameLoadAfter(currentEndItem.getName(), pageSize);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(int currentBeginIndex, @NonNull User currentBeginItem,
+ int pageSize) {
+ return mUserDao.userNameLoadBefore(currentBeginItem.getName(), pageSize);
+ }
+ }
+
+ /**
+ * Lazy, LIMIT/OFFSET implementation.
+ */
+ public class OffsetUserQueryDataSource extends CountedDataSource<User> {
+
+ @Override
+ public int loadCount() {
+ return mUserDao.getUserCount();
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfterInitial(int position, int pageSize) {
+ return mUserDao.userNameLimitOffset(pageSize, position + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadAfter(int currentEndIndex, @NonNull User currentEndItem,
+ int pageSize) {
+ return mUserDao.userNameLimitOffset(pageSize, currentEndIndex + 1);
+ }
+
+ @Nullable
+ @Override
+ public List<User> loadBefore(int currentBeginIndex, @NonNull User currentBeginItem,
+ int pageSize) {
+ int targetOffset = currentBeginIndex - pageSize;
+ int offset = Math.max(0, targetOffset);
+ int limit = Math.min(pageSize, pageSize + targetOffset);
+
+ List<User> users = mUserDao.userNameLimitOffset(limit, offset);
+ Collections.reverse(users); // :P
+ return users;
+ }
+ }
+
+ private static final User[] USERS_BY_NAME = new User[50];
+
+ @BeforeClass
+ public static void setupClass() {
+ for (int i = 0; i < USERS_BY_NAME.length; i++) {
+ USERS_BY_NAME[i] = TestUtil.createUser(i);
+ }
+ }
+
+ @Before
+ public void setup() {
+ mUserDao.insertAll(USERS_BY_NAME);
+
+ Arrays.sort(USERS_BY_NAME, new Comparator<User>() {
+ @Override
+ public int compare(User o1, User o2) {
+ return o2.getName().compareTo(o1.getName());
+ }
+ });
+ }
+
+ @Test
+ public void testKeyedQueryDataSource() {
+ verifyUserDataSource(USERS_BY_NAME, new KeyedUserQueryDataSource());
+ }
+
+ @Test
+ public void testIndexedQueryDataSourceFull() {
+ verifyUserDataSource(USERS_BY_NAME, new OffsetUserQueryDataSource());
+ }
+
+
+ public static void verifyUserDataSource(User[] expected, CountedDataSource<User> dataSource) {
+ List<User> list = new ArrayList<>();
+ List<User> p = dataSource.loadAfterInitial(14, 10);
+ assertNotNull(p);
+ list.addAll(p);
+
+ assertArrayEquals(Arrays.copyOfRange(expected, 15, 25), list.toArray());
+ p = dataSource.loadAfter(24, list.get(list.size() - 1), 10);
+ assertNotNull(p);
+ list.addAll(p);
+
+ assertArrayEquals(Arrays.copyOfRange(expected, 15, 35), list.toArray());
+
+ p = dataSource.loadBefore(15, list.get(0), 10);
+ assertNotNull(p);
+ for (User u : p) {
+ list.add(0, u);
+ }
+
+ assertArrayEquals(Arrays.copyOfRange(expected, 5, 35), list.toArray());
+
+ p = dataSource.loadBefore(5, list.get(0), 10);
+ assertNotNull(p);
+ for (User u : p) {
+ list.add(0, u);
+ }
+
+ assertArrayEquals(Arrays.copyOfRange(expected, 0, 35), list.toArray());
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
index 9d696ab..1bbc140 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
@@ -19,21 +19,26 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.TaskExecutor;
+import android.arch.persistence.room.EmptyResultSetException;
+import android.arch.persistence.room.integration.testapp.vo.User;
import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.arch.core.executor.AppToolkitTaskExecutor;
-import android.arch.core.executor.TaskExecutor;
-import android.arch.persistence.room.integration.testapp.vo.User;
-
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
import io.reactivex.disposables.Disposable;
+import io.reactivex.observers.TestObserver;
import io.reactivex.schedulers.TestScheduler;
import io.reactivex.subscribers.TestSubscriber;
@@ -76,6 +81,107 @@
}
@Test
+ public void maybeUser_Empty() throws InterruptedException {
+ TestObserver<User> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.maybeUserById(3).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ testObserver.assertNoValues();
+ disposable.dispose();
+ }
+
+ @Test
+ public void maybeUser_WithData() throws InterruptedException {
+ User user = TestUtil.createUser(3);
+ mUserDao.insert(user);
+ TestObserver<User> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.maybeUserById(3).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ testObserver.assertValue(user);
+
+ disposable.dispose();
+ }
+
+ @Test
+ public void maybeUsers_EmptyList() throws InterruptedException {
+ TestObserver<List<User>> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.maybeUsersByIds(3, 5, 7).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ testObserver.assertValue(Collections.<User>emptyList());
+ disposable.dispose();
+ }
+
+ @Test
+ public void maybeUsers_WithValue() throws InterruptedException {
+ User[] users = TestUtil.createUsersArray(3, 5);
+ mUserDao.insertAll(users);
+ TestObserver<List<User>> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.maybeUsersByIds(3, 5, 7).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ // since this is a clean db, it is ok to rely on the order for the test.
+ testObserver.assertValue(Arrays.asList(users));
+ disposable.dispose();
+ }
+
+ @Test
+ public void singleUser_Empty() throws InterruptedException {
+ TestObserver<User> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.singleUserById(3).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ // figure out which error we should dispatch
+ testObserver.assertError(EmptyResultSetException.class);
+ testObserver.assertNoValues();
+ disposable.dispose();
+ }
+
+ @Test
+ public void singleUser_WithData() throws InterruptedException {
+ User user = TestUtil.createUser(3);
+ mUserDao.insert(user);
+ TestObserver<User> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.singleUserById(3).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ testObserver.assertValue(user);
+
+ disposable.dispose();
+ }
+
+ @Test
+ public void singleUsers_EmptyList() throws InterruptedException {
+ TestObserver<List<User>> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.singleUsersByIds(3, 5, 7).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ testObserver.assertValue(Collections.<User>emptyList());
+ disposable.dispose();
+ }
+
+ @Test
+ public void singleUsers_WithValue() throws InterruptedException {
+ User[] users = TestUtil.createUsersArray(3, 5);
+ mUserDao.insertAll(users);
+ TestObserver<List<User>> testObserver = new TestObserver<>();
+ Disposable disposable = mUserDao.singleUsersByIds(3, 5, 7).observeOn(mTestScheduler)
+ .subscribeWith(testObserver);
+ drain();
+ testObserver.assertComplete();
+ // since this is a clean db, it is ok to rely on the order for the test.
+ testObserver.assertValue(Arrays.asList(users));
+ disposable.dispose();
+ }
+
+ @Test
public void observeOnce() throws InterruptedException {
User user = TestUtil.createUser(3);
mUserDao.insert(user);
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
index fe363a2..2b4a0e9 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
@@ -17,11 +17,13 @@
package android.arch.persistence.room.integration.testapp.test;
import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -29,10 +31,12 @@
import android.arch.persistence.room.integration.testapp.TestDatabase;
import android.arch.persistence.room.integration.testapp.dao.BlobEntityDao;
import android.arch.persistence.room.integration.testapp.dao.PetDao;
+import android.arch.persistence.room.integration.testapp.dao.ProductDao;
import android.arch.persistence.room.integration.testapp.dao.UserDao;
import android.arch.persistence.room.integration.testapp.dao.UserPetDao;
import android.arch.persistence.room.integration.testapp.vo.BlobEntity;
import android.arch.persistence.room.integration.testapp.vo.Pet;
+import android.arch.persistence.room.integration.testapp.vo.Product;
import android.arch.persistence.room.integration.testapp.vo.User;
import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
import android.content.Context;
@@ -63,6 +67,7 @@
private BlobEntityDao mBlobEntityDao;
private PetDao mPetDao;
private UserPetDao mUserPetDao;
+ private ProductDao mProductDao;
@Before
public void createDb() {
@@ -72,6 +77,7 @@
mPetDao = db.getPetDao();
mUserPetDao = db.getUserPetDao();
mBlobEntityDao = db.getBlobEntityDao();
+ mProductDao = db.getProductDao();
}
@Test
@@ -84,6 +90,20 @@
}
@Test
+ public void insertNull() throws Exception {
+ @SuppressWarnings("ConstantConditions")
+ Product product = new Product(1, null);
+ Throwable throwable = null;
+ try {
+ mProductDao.insert(product);
+ } catch (Throwable t) {
+ throwable = t;
+ }
+ assertNotNull("Was expecting an exception", throwable);
+ assertThat(throwable, instanceOf(SQLiteConstraintException.class));
+ }
+
+ @Test
public void insertDifferentEntities() throws Exception {
User user1 = TestUtil.createUser(3);
user1.setName("george");
@@ -223,6 +243,16 @@
}
@Test
+ public void deleteEverything() {
+ User user = TestUtil.createUser(3);
+ mUserDao.insert(user);
+ assertThat(mUserDao.count(), is(1));
+ int count = mUserDao.deleteEverything();
+ assertThat(count, is(1));
+ assertThat(mUserDao.count(), is(0));
+ }
+
+ @Test
public void findByBoolean() {
User user1 = TestUtil.createUser(3);
user1.setAdmin(true);
@@ -291,6 +321,20 @@
}
@Test
+ public void incrementAgeOfAll() {
+ User[] users = TestUtil.createUsersArray(3, 5, 7);
+ users[0].setAge(3);
+ users[1].setAge(5);
+ users[2].setAge(7);
+ mUserDao.insertAll(users);
+ assertThat(mUserDao.count(), is(3));
+ mUserDao.incrementAgeOfAll();
+ for (User user : mUserDao.loadByIds(3, 5, 7)) {
+ assertThat(user.getAge(), is(user.getId() + 1));
+ }
+ }
+
+ @Test
public void findByIntQueryParameter() {
User user = TestUtil.createUser(1);
final String name = "my name";
@@ -425,4 +469,27 @@
assertTrue("SQLiteConstraintException expected", caught);
assertThat(mUserDao.count(), is(0));
}
+
+ @Test
+ public void multipleInParamsFollowedByASingleParam_delete() {
+ User user = TestUtil.createUser(3);
+ user.setAge(30);
+ mUserDao.insert(user);
+ assertThat(mUserDao.deleteByAgeAndIds(20, Arrays.asList(3, 5)), is(0));
+ assertThat(mUserDao.count(), is(1));
+ assertThat(mUserDao.deleteByAgeAndIds(30, Arrays.asList(3, 5)), is(1));
+ assertThat(mUserDao.count(), is(0));
+ }
+
+ @Test
+ public void multipleInParamsFollowedByASingleParam_update() {
+ User user = TestUtil.createUser(3);
+ user.setAge(30);
+ user.setWeight(10f);
+ mUserDao.insert(user);
+ assertThat(mUserDao.updateByAgeAndIds(3f, 20, Arrays.asList(3, 5)), is(0));
+ assertThat(mUserDao.loadByIds(3)[0].getWeight(), is(10f));
+ assertThat(mUserDao.updateByAgeAndIds(3f, 30, Arrays.asList(3, 5)), is(1));
+ assertThat(mUserDao.loadByIds(3)[0].getWeight(), is(3f));
+ }
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/EmbeddedUserAndAllPets.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/EmbeddedUserAndAllPets.java
new file mode 100644
index 0000000..ca82bfe
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/EmbeddedUserAndAllPets.java
@@ -0,0 +1,32 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.vo;
+
+import android.arch.persistence.room.Embedded;
+
+public class EmbeddedUserAndAllPets {
+ @Embedded
+ UserAndAllPets mUserAndAllPets;
+
+ public UserAndAllPets getUserAndAllPets() {
+ return mUserAndAllPets;
+ }
+
+ public void setUserAndAllPets(UserAndAllPets userAndAllPets) {
+ this.mUserAndAllPets = userAndAllPets;
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/Product.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/Product.java
new file mode 100644
index 0000000..a395aea
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/Product.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.arch.persistence.room.integration.testapp.vo;
+
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.PrimaryKey;
+import android.support.annotation.NonNull;
+
+@Entity(tableName = "products")
+public class Product {
+
+ @PrimaryKey(autoGenerate = true)
+ public final int id;
+
+ @NonNull
+ public final String name;
+
+ public Product(int id, @NonNull String name) {
+ this.id = id;
+ this.name = name;
+ }
+}
diff --git a/room/integration-tests/testapp/src/main/AndroidManifest.xml b/room/integration-tests/testapp/src/main/AndroidManifest.xml
index f50024f..27fabd4 100644
--- a/room/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/room/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 The Android Open Source Project
~
@@ -12,10 +13,20 @@
~ WITHOUT 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.arch.persistence.room.integration.testapp">
- <application android:allowBackup="true"
- android:supportsRtl="true"/>
-</manifest>
+ <application
+ android:allowBackup="true"
+ android:supportsRtl="true">
+ <activity
+ android:name=".LazyListActivity"
+ android:label="Room LazyList"
+ android:theme="@style/Theme.AppCompat">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+ </manifest>
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java
new file mode 100644
index 0000000..2d8391c
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java
@@ -0,0 +1,75 @@
+/*
+ * 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.arch.persistence.room.integration.testapp;
+
+import android.app.Application;
+import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.lifecycle.AndroidViewModel;
+import android.arch.lifecycle.LiveData;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.integration.testapp.database.Customer;
+import android.arch.persistence.room.integration.testapp.database.SampleDatabase;
+import android.arch.util.paging.LazyList;
+import android.arch.util.paging.ListConfig;
+
+import java.util.UUID;
+
+/**
+ * Sample database-backed view model of Customers
+ */
+public class CustomerViewModel extends AndroidViewModel {
+ private SampleDatabase mDatabase;
+ private LiveData<LazyList<Customer>> mLiveCustomerList;
+ private static int sCustomerId = 0;
+
+ public CustomerViewModel(Application application) {
+ super(application);
+ createDb();
+ mLiveCustomerList = mDatabase.getCustomerDao().loadPagedAgeOrder().create(
+ ListConfig.builder()
+ .pageSize(10)
+ .prefetchDistance(10)
+ .create());
+ }
+
+ private void createDb() {
+ mDatabase = Room.inMemoryDatabaseBuilder(this.getApplication(),
+ SampleDatabase.class).build();
+ }
+
+ public void setDatabase(SampleDatabase database) {
+ mDatabase = database;
+
+ }
+
+ void insertCustomer() {
+ AppToolkitTaskExecutor.getInstance().executeOnDiskIO(new Runnable() {
+ @Override
+ public void run() {
+ Customer customer = new Customer();
+ customer.setId(sCustomerId++);
+ customer.setName(UUID.randomUUID().toString());
+ customer.setLastName(UUID.randomUUID().toString());
+ mDatabase.getCustomerDao().insert(customer);
+ }
+ });
+ }
+
+ LiveData<LazyList<Customer>> getLazyList() {
+ return mLiveCustomerList;
+ }
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListActivity.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListActivity.java
new file mode 100644
index 0000000..983a52f
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListActivity.java
@@ -0,0 +1,64 @@
+/*
+ * 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.arch.persistence.room.integration.testapp;
+
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.LifecycleRegistryOwner;
+import android.arch.lifecycle.ViewModelProviders;
+import android.arch.persistence.room.integration.testapp.database.Customer;
+import android.arch.util.paging.LazyListAdapterHelper;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+
+/**
+ * Sample LazyList activity which uses Room.
+ */
+public class LazyListActivity extends AppCompatActivity implements LifecycleRegistryOwner {
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final CustomerViewModel viewModel = ViewModelProviders.of(this)
+ .get(CustomerViewModel.class);
+ setContentView(R.layout.activity_recycler_view);
+ final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
+ final LazyListCustomerAdapter adapter = new LazyListCustomerAdapter(
+ LazyListAdapterHelper
+ .<Customer>builder()
+ .lifecycle(this)
+ .diffCallback(Customer.DIFF_CALLBACK)
+ .source(viewModel.getLazyList()));
+ recyclerView.setAdapter(adapter);
+ final Button button = (Button) findViewById(R.id.button);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ viewModel.insertCustomer();
+ }
+ });
+ }
+
+ private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
+
+ @Override
+ public LifecycleRegistry getLifecycle() {
+ return mLifecycleRegistry;
+ }
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListCustomerAdapter.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListCustomerAdapter.java
new file mode 100644
index 0000000..2fc7e71
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/LazyListCustomerAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * 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.arch.persistence.room.integration.testapp;
+
+import android.arch.persistence.room.integration.testapp.database.Customer;
+import android.arch.util.paging.LazyListAdapterHelper;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import io.reactivex.annotations.NonNull;
+
+/**
+ * Sample adapter which uses a LazyListAdapterHelper.
+ */
+public class LazyListCustomerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final LazyListAdapterHelper<Customer> mHelper;
+
+ public LazyListCustomerAdapter(@NonNull LazyListAdapterHelper.Builder<Customer> builder) {
+ this.mHelper = builder.adapter(this).create();
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new RecyclerView.ViewHolder(new TextView(parent.getContext())) {
+ };
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ Customer customer = mHelper.get(position);
+ ((TextView) (holder.itemView)).setText(customer == null ? "loading" : customer.getLastName());
+ holder.itemView.setMinimumHeight(400);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mHelper.getItemCount();
+ }
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
new file mode 100644
index 0000000..eb928da
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
@@ -0,0 +1,111 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.database;
+
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.PrimaryKey;
+import android.arch.persistence.room.TypeConverters;
+import android.arch.util.paging.DiffCallback;
+import android.support.annotation.NonNull;
+
+/**
+ * Sample entity
+ */
+@Entity
+public class Customer {
+
+ @PrimaryKey
+ private int mId;
+
+ private String mName;
+
+ private String mLastName;
+
+ public int getId() {
+ return mId;
+ }
+
+ public void setId(int id) {
+ this.mId = id;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public void setName(String name) {
+ this.mName = name;
+ }
+
+ public String getLastName() {
+ return mLastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.mLastName = lastName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Customer customer = (Customer) o;
+
+ if (mId != customer.mId) {
+ return false;
+ }
+ if (mName != null ? !mName.equals(customer.mName) : customer.mName != null) {
+ return false;
+ }
+ return mLastName != null ? mLastName.equals(customer.mLastName)
+ : customer.mLastName == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mId;
+ result = 31 * result + (mName != null ? mName.hashCode() : 0);
+ result = 31 * result + (mLastName != null ? mLastName.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Customer{"
+ + "mId=" + mId
+ + ", mName='" + mName + '\''
+ + ", mLastName='" + mLastName + '\''
+ + '}';
+ }
+
+ public static final DiffCallback<Customer> DIFF_CALLBACK = new DiffCallback<Customer>() {
+ @Override
+ public boolean areContentsTheSame(@NonNull Customer oldItem, @NonNull Customer newItem) {
+ return oldItem.equals(newItem);
+ }
+
+ @Override
+ public boolean areItemsTheSame(@NonNull Customer oldItem, @NonNull Customer newItem) {
+ return oldItem.getId() == newItem.getId();
+ }
+ };
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java
new file mode 100644
index 0000000..d82701b
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.database;
+
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.Query;
+import android.arch.util.paging.ListConfig;
+import android.arch.util.paging.LiveLazyListProvider;
+
+/**
+ * Simple Customer DAO for Room Customer list sample.
+ */
+@Dao
+public interface CustomerDao {
+
+ /**
+ * Insert a customer
+ * @param customer Customer.
+ */
+ @Insert
+ void insert(Customer customer);
+
+ /**
+ * Insert multiple customers.
+ * @param customers Customers.
+ */
+ @Insert
+ void insertAll(Customer[] customers);
+
+ /**
+ * @return LiveLazyListProvider of customers, ordered by last name. Call
+ * {@link LiveLazyListProvider#create(ListConfig)} to get a LiveData of LazyLists.
+ */
+ @Query("SELECT * FROM customer ORDER BY mLastName ASC")
+ LiveLazyListProvider<Customer> loadPagedAgeOrder();
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/SampleDatabase.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/SampleDatabase.java
new file mode 100644
index 0000000..eec59f6
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/SampleDatabase.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.arch.persistence.room.integration.testapp.database;
+
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.TypeConverter;
+import android.arch.persistence.room.TypeConverters;
+
+import java.util.Date;
+
+/**
+ * Sample database of customers.
+ */
+@Database(entities = {Customer.class},
+ version = 1, exportSchema = false)
+public abstract class SampleDatabase extends RoomDatabase {
+ /**
+ * @return customer dao.
+ */
+ public abstract CustomerDao getCustomerDao();
+}
diff --git a/room/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml b/room/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml
new file mode 100644
index 0000000..7e2367b
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/res/layout/activity_recycler_view.xml
@@ -0,0 +1,44 @@
+<?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.
+ -->
+<RelativeLayout
+ 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/activity_recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="android.arch.persistence.room.integration.testapp.LazyListActivity">
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/recyclerview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layoutManager="LinearLayoutManager"
+ android:clipToPadding="false"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ />
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:text="@string/insert"/>
+</RelativeLayout>
diff --git a/room/integration-tests/testapp/src/main/res/values-w820dp/dimens.xml b/room/integration-tests/testapp/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..edff918
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/res/values-w820dp/dimens.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.
+-->
+
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/room/integration-tests/testapp/src/main/res/values/dimens.xml b/room/integration-tests/testapp/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..3358489
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/res/values/dimens.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>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/room/integration-tests/testapp/src/main/res/values/strings.xml b/room/integration-tests/testapp/src/main/res/values/strings.xml
new file mode 100644
index 0000000..5f55cc3
--- /dev/null
+++ b/room/integration-tests/testapp/src/main/res/values/strings.xml
@@ -0,0 +1,19 @@
+<!--
+~ 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>
+ <string name="insert">Insert</string>
+</resources>
diff --git a/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java b/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java
new file mode 100644
index 0000000..3cbffc8
--- /dev/null
+++ b/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java
@@ -0,0 +1,47 @@
+/*
+ * 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.arch.persistence.room.integration.testapp.db;
+
+import android.arch.persistence.db.SupportSQLiteDatabase;
+import android.arch.persistence.db.SupportSQLiteOpenHelper;
+
+public class JDBCOpenHelper implements SupportSQLiteOpenHelper {
+ @Override
+ public String getDatabaseName() {
+ return null;
+ }
+
+ @Override
+ public void setWriteAheadLoggingEnabled(boolean enabled) {
+
+ }
+
+ @Override
+ public SupportSQLiteDatabase getWritableDatabase() {
+ return null;
+ }
+
+ @Override
+ public SupportSQLiteDatabase getReadableDatabase() {
+ return null;
+ }
+
+ @Override
+ public void close() {
+
+ }
+}
diff --git a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/EntityBundle.java b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/EntityBundle.java
index fc39a6a..8980a3b 100644
--- a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/EntityBundle.java
+++ b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/EntityBundle.java
@@ -166,7 +166,7 @@
}
/**
- * @return Creates the list of SQL queries that are necessary to create this entitiy.
+ * @return Creates the list of SQL queries that are necessary to create this entity.
*/
public Collection<String> buildCreateQueries() {
List<String> result = new ArrayList<>();
diff --git a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/FieldBundle.java b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/FieldBundle.java
index 3e8fd97..eb73d81 100644
--- a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/FieldBundle.java
+++ b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/FieldBundle.java
@@ -34,11 +34,14 @@
private String mColumnName;
@SerializedName("affinity")
private String mAffinity;
+ @SerializedName("notNull")
+ private boolean mNonNull;
- public FieldBundle(String fieldPath, String columnName, String affinity) {
+ public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull) {
mFieldPath = fieldPath;
mColumnName = columnName;
mAffinity = affinity;
+ mNonNull = nonNull;
}
public String getFieldPath() {
@@ -52,4 +55,8 @@
public String getAffinity() {
return mAffinity;
}
+
+ public boolean isNonNull() {
+ return mNonNull;
+ }
}
diff --git a/room/runtime/build.gradle b/room/runtime/build.gradle
index 1415d85..e44a021 100644
--- a/room/runtime/build.gradle
+++ b/room/runtime/build.gradle
@@ -51,10 +51,14 @@
}
dependencies {
- compile project(":room:common")
- compile project(":room:db")
- compile project(":room:db-impl")
- compile project(":arch:core")
+ api project(":room:common")
+ api project(":room:db")
+ api project(":room:db-impl")
+ api project(":arch:runtime")
+ provided project(":paging:common")
+
+ provided project(":lifecycle:runtime")
+ provided project(":lifecycle:extensions")
compile libs.support.core_utils
diff --git a/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java b/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
index 76effde..c6eade5 100644
--- a/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
+++ b/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
@@ -56,8 +56,8 @@
+ "name TEXT)");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", 1),
- new TableInfo.Column("name", "TEXT", 0)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 1),
+ new TableInfo.Column("name", "TEXT", false, 0)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -68,8 +68,8 @@
+ "name TEXT, PRIMARY KEY(name, id))");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", 2),
- new TableInfo.Column("name", "TEXT", 1)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 2),
+ new TableInfo.Column("name", "TEXT", false, 1)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -81,9 +81,9 @@
mDb.execSQL("ALTER TABLE foo ADD COLUMN added REAL;");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", 0),
- new TableInfo.Column("name", "TEXT", 1),
- new TableInfo.Column("added", "REAL", 0)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 0),
+ new TableInfo.Column("name", "TEXT", false, 1),
+ new TableInfo.Column("added", "REAL", false, 0)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -93,7 +93,7 @@
"CREATE TABLE foo (name TEXT NOT NULL)");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("name", "TEXT", 0)),
+ toMap(new TableInfo.Column("name", "TEXT", true, 0)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -104,7 +104,7 @@
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo(
"foo",
- toMap(new TableInfo.Column("name", "TEXT", 0)),
+ toMap(new TableInfo.Column("name", "TEXT", false, 0)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -175,7 +175,7 @@
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo(
"foo",
- toMap(new TableInfo.Column("n", "INTEGER", 0)),
+ toMap(new TableInfo.Column("n", "INTEGER", false, 0)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/DatabaseConfiguration.java b/room/runtime/src/main/java/android/arch/persistence/room/DatabaseConfiguration.java
index e5ac1c0..adf5d4d 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/DatabaseConfiguration.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/DatabaseConfiguration.java
@@ -22,6 +22,8 @@
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
+import java.util.List;
+
/**
* Configuration class for a {@link RoomDatabase}.
*/
@@ -49,19 +51,30 @@
@NonNull
public final RoomDatabase.MigrationContainer migrationContainer;
+ @Nullable
+ public final List<RoomDatabase.Callback> callbacks;
+
/**
* Whether Room should throw an exception for queries run on the main thread.
*/
public final boolean allowMainThreadQueries;
/**
+ * If true, Room should crash if a migration is missing.
+ */
+ public final boolean requireMigration;
+
+ /**
* Creates a database configuration with the given values.
*
* @param context The application context.
* @param name Name of the database, can be null if it is in memory.
* @param sqliteOpenHelperFactory The open helper factory to use.
* @param migrationContainer The migration container for migrations.
+ * @param callbacks The list of callbacks for database events.
* @param allowMainThreadQueries Whether to allow main thread reads/writes or not.
+ * @param requireMigration True if Room should require a valid migration if version changes,
+ * instead of recreating the tables.
*
* @hide
*/
@@ -69,11 +82,15 @@
public DatabaseConfiguration(@NonNull Context context, @Nullable String name,
@NonNull SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory,
@NonNull RoomDatabase.MigrationContainer migrationContainer,
- boolean allowMainThreadQueries) {
+ @Nullable List<RoomDatabase.Callback> callbacks,
+ boolean allowMainThreadQueries,
+ boolean requireMigration) {
this.sqliteOpenHelperFactory = sqliteOpenHelperFactory;
this.context = context;
this.name = name;
this.migrationContainer = migrationContainer;
+ this.callbacks = callbacks;
this.allowMainThreadQueries = allowMainThreadQueries;
+ this.requireMigration = requireMigration;
}
}
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java b/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
index edfda0a..619c53d 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
@@ -26,6 +26,7 @@
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
import android.support.annotation.VisibleForTesting;
+import android.support.annotation.WorkerThread;
import android.support.v4.util.ArrayMap;
import android.support.v4.util.ArraySet;
import android.util.Log;
@@ -37,6 +38,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.Lock;
/**
* InvalidationTracker keeps a list of tables modified by queries and notifies its callbacks about
@@ -339,16 +341,20 @@
Runnable mRefreshRunnable = new Runnable() {
@Override
public void run() {
- if (!ensureInitialization()) {
- return;
- }
- if (mDatabase.inTransaction()
- || !mPendingRefresh.compareAndSet(true, false)) {
- // no pending refresh
- return;
- }
+ final Lock closeLock = mDatabase.getCloseLock();
boolean hasUpdatedTable = false;
try {
+ closeLock.lock();
+
+ if (!ensureInitialization()) {
+ return;
+ }
+
+ if (mDatabase.inTransaction()
+ || !mPendingRefresh.compareAndSet(true, false)) {
+ // no pending refresh
+ return;
+ }
mCleanupStatement.executeUpdateDelete();
mQueryArgs[0] = mMaxVersion;
Cursor cursor = mDatabase.query(SELECT_UPDATED_TABLES_SQL, mQueryArgs);
@@ -370,6 +376,8 @@
// may happen if db is closed. just log.
Log.e(Room.LOG_TAG, "Cannot run invalidation tracker. Is the db closed?",
exception);
+ } finally {
+ closeLock.unlock();
}
if (hasUpdatedTable) {
synchronized (mObserverMap) {
@@ -397,6 +405,18 @@
}
/**
+ * Check versions for tables, and run observers synchronously if tables have been updated.
+ *
+ * @hide
+ */
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @WorkerThread
+ public void refreshVersionsSync() {
+ syncTriggers();
+ mRefreshRunnable.run();
+ }
+
+ /**
* Called by RoomDatabase before each beginTransaction call.
* <p>
* It is important that pending trigger changes are applied to the database before any query
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
index 7846999..e64f2d6 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
@@ -37,6 +37,8 @@
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
/**
* Base class for all Room databases. All classes that are annotated with {@link Database} must
@@ -56,6 +58,21 @@
private final InvalidationTracker mInvalidationTracker;
private boolean mAllowMainThreadQueries;
+ @Nullable
+ protected List<Callback> mCallbacks;
+
+ private final ReentrantLock mCloseLock = new ReentrantLock();
+
+ /**
+ * {@link InvalidationTracker} uses this lock to prevent the database from closing while it is
+ * querying database updates.
+ *
+ * @return The lock for {@link #close()}.
+ */
+ Lock getCloseLock() {
+ return mCloseLock;
+ }
+
/**
* Creates a RoomDatabase.
* <p>
@@ -75,6 +92,7 @@
@CallSuper
public void init(DatabaseConfiguration configuration) {
mOpenHelper = createOpenHelper(configuration);
+ mCallbacks = configuration.callbacks;
mAllowMainThreadQueries = configuration.allowMainThreadQueries;
}
@@ -121,7 +139,12 @@
*/
public void close() {
if (isOpen()) {
- mOpenHelper.close();
+ try {
+ mCloseLock.lock();
+ mOpenHelper.close();
+ } finally {
+ mCloseLock.unlock();
+ }
}
}
@@ -285,10 +308,12 @@
private final Class<T> mDatabaseClass;
private final String mName;
private final Context mContext;
+ private ArrayList<Callback> mCallbacks;
private SupportSQLiteOpenHelper.Factory mFactory;
private boolean mInMemory;
private boolean mAllowMainThreadQueries;
+ private boolean mRequireMigration;
/**
* Migrations, mapped by from-to pairs.
*/
@@ -298,6 +323,7 @@
mContext = context;
mDatabaseClass = klass;
mName = name;
+ mRequireMigration = true;
mMigrationContainer = new MigrationContainer();
}
@@ -355,6 +381,39 @@
}
/**
+ * When the database version on the device does not match the latest schema version, Room
+ * runs necessary {@link Migration}s on the database.
+ * <p>
+ * If it cannot find the set of {@link Migration}s that will bring the database to the
+ * current version, it will throw an {@link IllegalStateException}.
+ * <p>
+ * You can call this method to change this behavior to re-create the database instead of
+ * crashing.
+ * <p>
+ * Note that this will delete all of the data in the database tables managed by Room.
+ *
+ * @return this
+ */
+ public Builder<T> fallbackToDestructiveMigration() {
+ mRequireMigration = false;
+ return this;
+ }
+
+ /**
+ * Adds a {@link Callback} to this database.
+ *
+ * @param callback The callback.
+ * @return this
+ */
+ public Builder<T> addCallback(@NonNull Callback callback) {
+ if (mCallbacks == null) {
+ mCallbacks = new ArrayList<>();
+ }
+ mCallbacks.add(callback);
+ return this;
+ }
+
+ /**
* Creates the databases and initializes it.
* <p>
* By default, all RoomDatabases use in memory storage for TEMP tables and enables recursive
@@ -377,7 +436,7 @@
}
DatabaseConfiguration configuration =
new DatabaseConfiguration(mContext, mName, mFactory, mMigrationContainer,
- mAllowMainThreadQueries);
+ mCallbacks, mAllowMainThreadQueries, mRequireMigration);
T db = Room.getGeneratedImplementation(mDatabaseClass, DB_IMPL_SUFFIX);
db.init(configuration);
return db;
@@ -475,4 +534,27 @@
return result;
}
}
+
+ /**
+ * Callback for {@link RoomDatabase}.
+ */
+ public abstract static class Callback {
+
+ /**
+ * Called when the database is created for the first time. This is called after all the
+ * tables are created.
+ *
+ * @param db The database.
+ */
+ public void onCreate(@NonNull SupportSQLiteDatabase db) {
+ }
+
+ /**
+ * Called when the database has been opened.
+ *
+ * @param db The database.
+ */
+ public void onOpen(@NonNull SupportSQLiteDatabase db) {
+ }
+ }
}
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/RoomOpenHelper.java b/room/runtime/src/main/java/android/arch/persistence/room/RoomOpenHelper.java
index 7ac73df..8767f06 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/RoomOpenHelper.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/RoomOpenHelper.java
@@ -58,6 +58,7 @@
public void onCreate(SupportSQLiteDatabase db) {
updateIdentity(db);
mDelegate.createAllTables(db);
+ mDelegate.onCreate(db);
}
@Override
@@ -76,6 +77,12 @@
}
}
if (!migrated) {
+ if (mConfiguration == null || mConfiguration.requireMigration) {
+ throw new IllegalStateException("A migration from " + oldVersion + " to "
+ + newVersion + " is necessary. Please provide a Migration in the builder or call"
+ + " fallbackToDestructiveMigration in the builder in which case Room will"
+ + " re-create all of the tables.");
+ }
mDelegate.dropAllTables(db);
mDelegate.createAllTables(db);
}
@@ -134,6 +141,8 @@
protected abstract void onOpen(SupportSQLiteDatabase database);
+ protected abstract void onCreate(SupportSQLiteDatabase database);
+
/**
* Called after a migration run to validate database integrity.
*
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/RoomSQLiteQuery.java b/room/runtime/src/main/java/android/arch/persistence/room/RoomSQLiteQuery.java
index 4fda73b..a8defd4 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/RoomSQLiteQuery.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/RoomSQLiteQuery.java
@@ -152,6 +152,10 @@
return mQuery;
}
+ public int getArgCount() {
+ return mArgCount;
+ }
+
@Override
public void bindTo(SupportSQLiteProgram program) {
for (int index = 1; index <= mArgCount; index++) {
@@ -205,6 +209,25 @@
}
@Override
+ public void close() throws Exception {
+ // no-op. not calling release because it is internal API.
+ }
+
+ /**
+ * Copies arguments from another RoomSQLiteQuery into this query.
+ *
+ * @param other The other query, which holds the arguments to be copied.
+ */
+ public void copyArgumentsFrom(RoomSQLiteQuery other) {
+ int argCount = other.getArgCount() + 1; // +1 for the binding offsets
+ System.arraycopy(other.mBindingTypes, 0, mBindingTypes, 0, argCount);
+ System.arraycopy(other.mLongBindings, 0, mLongBindings, 0, argCount);
+ System.arraycopy(other.mStringBindings, 0, mStringBindings, 0, argCount);
+ System.arraycopy(other.mBlobBindings, 0, mBlobBindings, 0, argCount);
+ System.arraycopy(other.mDoubleBindings, 0, mDoubleBindings, 0, argCount);
+ }
+
+ @Override
public void clearBindings() {
Arrays.fill(mBindingTypes, NULL);
Arrays.fill(mStringBindings, null);
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java b/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
index 0023a2e..907e624 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
@@ -52,6 +52,9 @@
* Should run the necessary migrations.
* <p>
* This class cannot access any generated Dao in this method.
+ * <p>
+ * This method is already called inside a transaction and that transaction might actually be a
+ * composite transaction of all necessary {@code Migration}s.
*
* @param database The database instance
*/
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java b/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java
new file mode 100644
index 0000000..750f2b7
--- /dev/null
+++ b/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java
@@ -0,0 +1,155 @@
+/*
+ * 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.arch.persistence.room.paging;
+
+import android.arch.persistence.room.InvalidationTracker;
+import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.RoomSQLiteQuery;
+import android.arch.util.paging.CountedDataSource;
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A simple data source implementation that uses Limit & Offset to page the query.
+ * <p>
+ * This is NOT the most efficient way to do paging on SQLite. It is
+ * <a href="http://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor">recommended</a> to use an indexed
+ * ORDER BY statement but that requires a more complex API. This solution is technically equal to
+ * receiving a {@link Cursor} from a large query but avoids the need to manually manage it, and
+ * never returns inconsistent data if it is invalidated.
+ *
+ * @param <T> Data type returned by the data source.
+ *
+ * @hide
+ */
+@SuppressWarnings("unused")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public abstract class LimitOffsetDataSource<T> extends CountedDataSource<T> {
+ private final RoomSQLiteQuery mSourceQuery;
+ private final String mCountQuery;
+ private final String mLimitOffsetQuery;
+ private final RoomDatabase mDb;
+ @SuppressWarnings("FieldCanBeLocal")
+ private final InvalidationTracker.Observer mObserver;
+
+ public Runnable invalidCallback;
+
+ protected LimitOffsetDataSource(RoomDatabase db, RoomSQLiteQuery query,
+ String... tables) {
+ mDb = db;
+ mSourceQuery = query;
+ mCountQuery = "SELECT COUNT(*) FROM ( " + mSourceQuery.getSql() + " )";
+ mLimitOffsetQuery = "SELECT * FROM ( " + mSourceQuery.getSql() + " ) LIMIT ? OFFSET ?";
+ mObserver = new InvalidationTracker.Observer(tables) {
+ @Override
+ public void onInvalidated(@NonNull Set<String> tables) {
+ invalidate();
+ }
+ };
+ db.getInvalidationTracker().addWeakObserver(mObserver);
+ }
+
+ @Override
+ public int loadCount() {
+ final RoomSQLiteQuery sqLiteQuery = RoomSQLiteQuery.acquire(mCountQuery,
+ mSourceQuery.getArgCount());
+ sqLiteQuery.copyArgumentsFrom(mSourceQuery);
+ Cursor cursor = mDb.query(sqLiteQuery);
+ try {
+ if (cursor.moveToFirst()) {
+ return cursor.getInt(0);
+ }
+ return 0;
+ } finally {
+ cursor.close();
+ sqLiteQuery.release();
+ }
+ }
+
+ @Override
+ public boolean isInvalid() {
+ mDb.getInvalidationTracker().refreshVersionsSync();
+ return super.isInvalid();
+ }
+
+ private List<T> queryRange(int offset, int limit) {
+ final RoomSQLiteQuery sqLiteQuery = RoomSQLiteQuery.acquire(mLimitOffsetQuery,
+ mSourceQuery.getArgCount() + 2);
+ sqLiteQuery.copyArgumentsFrom(mSourceQuery);
+ sqLiteQuery.bindLong(sqLiteQuery.getArgCount() - 1, limit);
+ sqLiteQuery.bindLong(sqLiteQuery.getArgCount(), offset);
+ Cursor cursor = mDb.query(sqLiteQuery);
+ try {
+ return convertRows(cursor);
+ } finally {
+ cursor.close();
+ sqLiteQuery.release();
+ }
+ }
+
+ @SuppressWarnings("WeakerAccess")
+ protected abstract List<T> convertRows(Cursor cursor);
+
+ @Nullable
+ @Override
+ public List<T> loadAfterInitial(int position, int pageSize) {
+ if (isInvalid()) {
+ return null;
+ }
+ List<T> result = queryRange(position + 1, pageSize);
+ if (isInvalid()) {
+ return null;
+ }
+ return result;
+ }
+
+ @Nullable
+ @Override
+ public List<T> loadAfter(int currentEndIndex, @NonNull T currentEndItem, int pageSize) {
+ if (isInvalid()) {
+ return null;
+ }
+ List<T> result = queryRange(currentEndIndex + 1, pageSize);
+ if (isInvalid()) {
+ return null;
+ }
+ return result;
+ }
+
+ @Nullable
+ @Override
+ public List<T> loadBefore(int currentBeginIndex, @NonNull T currentBeginItem, int pageSize) {
+ if (isInvalid()) {
+ return null;
+ }
+ int offset = Math.max(0, currentBeginIndex - pageSize);
+ final List<T> list = queryRange(offset, pageSize);
+ // reverse it
+ Collections.reverse(list);
+
+ if (isInvalid()) {
+ return null;
+ }
+ return list;
+ }
+}
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java b/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
index c9d2021..bcd2e9e 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
@@ -150,13 +150,15 @@
if (cursor.getColumnCount() > 0) {
int nameIndex = cursor.getColumnIndex("name");
int typeIndex = cursor.getColumnIndex("type");
+ int notNullIndex = cursor.getColumnIndex("notnull");
int pkIndex = cursor.getColumnIndex("pk");
while (cursor.moveToNext()) {
final String name = cursor.getString(nameIndex);
final String type = cursor.getString(typeIndex);
+ final boolean notNull = 0 != cursor.getInt(notNullIndex);
final int primaryKeyPosition = cursor.getInt(pkIndex);
- columns.put(name, new Column(name, type, primaryKeyPosition));
+ columns.put(name, new Column(name, type, notNull, primaryKeyPosition));
}
}
} finally {
@@ -209,6 +211,10 @@
*/
public final String type;
/**
+ * Whether or not the column can be NULL.
+ */
+ public final boolean notNull;
+ /**
* The position of the column in the list of primary keys, 0 if the column is not part
* of the primary key.
* <p>
@@ -224,9 +230,10 @@
public final int primaryKeyPosition;
// if you change this constructor, you must change TableInfoWriter.kt
- public Column(String name, String type, int primaryKeyPosition) {
+ public Column(String name, String type, boolean notNull, int primaryKeyPosition) {
this.name = name;
this.type = type;
+ this.notNull = notNull;
this.primaryKeyPosition = primaryKeyPosition;
}
@@ -242,8 +249,9 @@
if (isPrimaryKey() != column.isPrimaryKey()) return false;
}
- //noinspection SimplifiableIfStatement
if (!name.equals(column.name)) return false;
+ //noinspection SimplifiableIfStatement
+ if (notNull != column.notNull) return false;
return type != null ? type.equalsIgnoreCase(column.type) : column.type == null;
}
@@ -260,6 +268,7 @@
public int hashCode() {
int result = name.hashCode();
result = 31 * result + (type != null ? type.hashCode() : 0);
+ result = 31 * result + (notNull ? 1231 : 1237);
result = 31 * result + primaryKeyPosition;
return result;
}
@@ -269,6 +278,7 @@
return "Column{"
+ "name='" + name + '\''
+ ", type='" + type + '\''
+ + ", notNull=" + notNull
+ ", primaryKeyPosition=" + primaryKeyPosition
+ '}';
}
diff --git a/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest.java b/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest.java
index ecf6cc4..0728cca 100644
--- a/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest.java
+++ b/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest.java
@@ -108,6 +108,15 @@
}
@Test
+ public void skipMigration() {
+ Context context = mock(Context.class);
+ TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
+ .fallbackToDestructiveMigration().build();
+ DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
+ assertThat(config.requireMigration, is(false));
+ }
+
+ @Test
public void createBasic() {
Context context = mock(Context.class);
TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class).build();
diff --git a/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java b/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
index bd9ab4a..f0b730a 100644
--- a/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
+++ b/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
@@ -49,11 +49,14 @@
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
@RunWith(JUnit4.class)
public class InvalidationTrackerTest {
@@ -73,6 +76,8 @@
doReturn(statement).when(sqliteDb).compileStatement(eq(InvalidationTracker.CLEANUP_SQL));
doReturn(sqliteDb).when(mOpenHelper).getWritableDatabase();
doReturn(true).when(mRoomDatabase).isOpen();
+ ReentrantLock closeLock = new ReentrantLock();
+ doReturn(closeLock).when(mRoomDatabase).getCloseLock();
//noinspection ResultOfMethodCallIgnored
doReturn(mOpenHelper).when(mRoomDatabase).getOpenHelper();
@@ -97,6 +102,26 @@
}
@Test
+ public void testWeak() throws InterruptedException {
+ final AtomicInteger data = new AtomicInteger(0);
+ InvalidationTracker.Observer observer = new InvalidationTracker.Observer("a") {
+ @Override
+ public void onInvalidated(@NonNull Set<String> tables) {
+ data.incrementAndGet();
+ }
+ };
+ mTracker.addWeakObserver(observer);
+ setVersions(1, 0);
+ refreshSync();
+ assertThat(data.get(), is(1));
+ observer = null;
+ forceGc();
+ setVersions(2, 0);
+ refreshSync();
+ assertThat(data.get(), is(1));
+ }
+
+ @Test
public void addRemoveObserver() throws Exception {
InvalidationTracker.Observer observer = new LatchObserver(1, "a");
mTracker.addObserver(observer);
@@ -304,4 +329,14 @@
return mInvalidatedTables;
}
}
+
+ private static void forceGc() {
+ // Use a random index in the list to detect the garbage collection each time because
+ // .get() may accidentally trigger a strong reference during collection.
+ ArrayList<WeakReference<byte[]>> leak = new ArrayList<>();
+ do {
+ WeakReference<byte[]> arr = new WeakReference<>(new byte[100]);
+ leak.add(arr);
+ } while (leak.get((int) (Math.random() * leak.size())).get() != null);
+ }
}
diff --git a/room/rxjava2/build.gradle b/room/rxjava2/build.gradle
index 21df34b..d7b5ceb 100644
--- a/room/rxjava2/build.gradle
+++ b/room/rxjava2/build.gradle
@@ -49,7 +49,7 @@
dependencies {
compile project(":room:common")
compile project(":room:runtime")
- compile project(":arch:core")
+ compile project(":arch:runtime")
compile libs.support.core_utils
compile libs.rx_java
testCompile libs.junit
diff --git a/room/rxjava2/src/main/java/android/arch/persistence/room/EmptyResultSetException.java b/room/rxjava2/src/main/java/android/arch/persistence/room/EmptyResultSetException.java
new file mode 100644
index 0000000..0f2d281
--- /dev/null
+++ b/room/rxjava2/src/main/java/android/arch/persistence/room/EmptyResultSetException.java
@@ -0,0 +1,31 @@
+/*
+ * 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.arch.persistence.room;
+
+/**
+ * Thrown by Room when the query needs to return a result (e.g. in a Single<T> query) but the
+ * returned result set from the database is empty.
+ */
+public class EmptyResultSetException extends RuntimeException {
+ /**
+ * Constructs a new EmptyResultSetException with the exception.
+ * @param message The SQL query which didn't return any results.
+ */
+ public EmptyResultSetException(String message) {
+ super(message);
+ }
+}
diff --git a/room/testing/build.gradle b/room/testing/build.gradle
index 065400b..d378d84 100644
--- a/room/testing/build.gradle
+++ b/room/testing/build.gradle
@@ -52,7 +52,7 @@
compile project(":room:db")
compile project(":room:db-impl")
compile project(":room:migration")
- compile project(":arch:core")
+ compile project(":arch:runtime")
compile libs.support.core_utils
compile libs.junit
}
diff --git a/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
index 904706e..aea3e96 100644
--- a/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
@@ -19,6 +19,7 @@
import android.app.Instrumentation;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.db.SupportSQLiteOpenHelper;
+import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory;
import android.arch.persistence.room.DatabaseConfiguration;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
@@ -88,6 +89,18 @@
* @param instrumentation The instrumentation instance.
* @param assetsFolder The asset folder in the assets directory.
*/
+ public MigrationTestHelper(Instrumentation instrumentation, String assetsFolder) {
+ this(instrumentation, assetsFolder, new FrameworkSQLiteOpenHelperFactory());
+ }
+
+ /**
+ * Creates a new migration helper. It uses the Instrumentation context to load the schema
+ * (falls back to the app resources) and the target context to create the database.
+ *
+ * @param instrumentation The instrumentation instance.
+ * @param assetsFolder The asset folder in the assets directory.
+ * @param openFactory Factory class that allows creation of {@link SupportSQLiteOpenHelper}
+ */
public MigrationTestHelper(Instrumentation instrumentation, String assetsFolder,
SupportSQLiteOpenHelper.Factory openFactory) {
mInstrumentation = instrumentation;
@@ -128,7 +141,8 @@
SchemaBundle schemaBundle = loadSchema(version);
RoomDatabase.MigrationContainer container = new RoomDatabase.MigrationContainer();
DatabaseConfiguration configuration = new DatabaseConfiguration(
- mInstrumentation.getTargetContext(), name, mOpenFactory, container, true);
+ mInstrumentation.getTargetContext(), name, mOpenFactory, container, null, true,
+ true);
RoomOpenHelper roomOpenHelper = new RoomOpenHelper(configuration,
new CreatingDelegate(schemaBundle.getDatabase()),
schemaBundle.getDatabase().getIdentityHash());
@@ -170,7 +184,8 @@
RoomDatabase.MigrationContainer container = new RoomDatabase.MigrationContainer();
container.addMigrations(migrations);
DatabaseConfiguration configuration = new DatabaseConfiguration(
- mInstrumentation.getTargetContext(), name, mOpenFactory, container, true);
+ mInstrumentation.getTargetContext(), name, mOpenFactory, container, null, true,
+ true);
RoomOpenHelper roomOpenHelper = new RoomOpenHelper(configuration,
new MigratingDelegate(schemaBundle.getDatabase(), validateDroppedTables),
schemaBundle.getDatabase().getIdentityHash());
@@ -300,7 +315,7 @@
private static TableInfo.Column toColumn(EntityBundle entity, FieldBundle field) {
return new TableInfo.Column(field.getColumnName(), field.getAffinity(),
- findPrimaryKeyPosition(entity, field));
+ field.isNonNull(), findPrimaryKeyPosition(entity, field));
}
private static int findPrimaryKeyPosition(EntityBundle entity, FieldBundle field) {
@@ -343,8 +358,9 @@
if (mVerifyDroppedTables) {
// now ensure tables that should be removed are removed.
Cursor cursor = db.query("SELECT name FROM sqlite_master WHERE type='table'"
- + " AND name NOT IN(?, ?)",
- new String[]{Room.MASTER_TABLE_NAME, "android_metadata"});
+ + " AND name NOT IN(?, ?, ?)",
+ new String[]{Room.MASTER_TABLE_NAME, "android_metadata",
+ "sqlite_sequence"});
//noinspection TryFinallyCanBeTryWithResources
try {
while (cursor.moveToNext()) {
@@ -394,8 +410,11 @@
}
@Override
- protected void onOpen(SupportSQLiteDatabase database) {
+ protected void onCreate(SupportSQLiteDatabase database) {
+ }
+ @Override
+ protected void onOpen(SupportSQLiteDatabase database) {
}
}
}
diff --git a/samples-flatfoot/ApiReviewDemo/.gitignore b/samples-flatfoot/ApiReviewDemo/.gitignore
deleted file mode 100644
index 39fb081..0000000
--- a/samples-flatfoot/ApiReviewDemo/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/ApiReviewDemo/app/build.gradle b/samples-flatfoot/ApiReviewDemo/app/build.gradle
deleted file mode 100644
index 1134737..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/build.gradle
+++ /dev/null
@@ -1,66 +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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId "com.android.flatfoot.apireviewdemo"
- minSdkVersion 16
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
-}
-
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.0', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
-
- compile 'com.android.support:support-fragment:25.2.0'
- //noinspection GradleCompatible
- compile 'com.android.support:appcompat-v7:25.2.0'
- //noinspection GradleCompatible
- compile 'com.android.support:recyclerview-v7:25.2.0'
- //noinspection GradleCompatible
- compile 'com.android.support:cardview-v7:25.2.0'
-
- compile "android.arch.lifecycle:extensions:1.0-SNAPSHOT"
- compile "android.arch.persistence.room:runtime:1.0-SNAPSHOT"
-
- compile 'com.jakewharton.timber:timber:4.5.1'
- compile 'com.squareup.retrofit2:retrofit:2.1.0'
- compile 'com.squareup.retrofit2:converter-gson:2.1.0'
-
- annotationProcessor "android.arch.lifecycle:compiler:1.0-SNAPSHOT"
- annotationProcessor "android.arch.persistence.room:compiler:1.0-SNAPSHOT"
- testCompile 'junit:junit:4.12'
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/proguard-rules.pro b/samples-flatfoot/ApiReviewDemo/app/proguard-rules.pro
deleted file mode 100644
index 9926c34..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Volumes/ssd/src/ub-supportlib-master/prebuilts/fullsdk-darwin/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/androidTest/java/com/android/flatfoot/apireviewdemo/ExampleInstrumentedTest.java b/samples-flatfoot/ApiReviewDemo/app/src/androidTest/java/com/android/flatfoot/apireviewdemo/ExampleInstrumentedTest.java
deleted file mode 100644
index ce71b1e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/androidTest/java/com/android/flatfoot/apireviewdemo/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,42 +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 com.android.flatfoot.apireviewdemo;
-
-import static org.junit.Assert.assertEquals;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() throws Exception {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("com.android.flatfoot.apireviewdemo", appContext.getPackageName());
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/AndroidManifest.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 0addf7d..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,95 +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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.flatfoot.apireviewdemo">
-
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.INTERNET"/>
-
- <uses-feature android:name="android.hardware.location.gps"/>
-
- <application
- android:name=".DemoApplication"
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
-
- <activity
- android:name=".lifecycle_01_basic.LocationActivity"
- android:label="@string/location_sample"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity
- android:name=".lifecycle_02_livedata.LiveLocationActivity"
- android:label="@string/live_location_sample"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity
- android:name=".lifecycle_03_viewmodel.OneAccountActivity"
- android:label="@string/one_account_github"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity
- android:name=".full_sample_xxx.SwitchAccountsActivity"
- android:label="@string/one_account_github"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity
- android:name=".lifecycle_04_shared_viewmodel.ShapesActivity"
- android:label="@string/shapes_label"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity
- android:name=".exercise.NoteActivity"
- android:theme="@android:style/Theme.DeviceDefault">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- </application>
-
-</manifest>
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/DemoApplication.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/DemoApplication.java
deleted file mode 100644
index a5b7f96..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/DemoApplication.java
+++ /dev/null
@@ -1,35 +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 com.android.flatfoot.apireviewdemo;
-
-import android.app.Application;
-import android.content.Context;
-
-public class DemoApplication extends Application {
-
- private static DemoApplication sApplication;
-
- public static Context context() {
- return sApplication;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- sApplication = this;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/entity/Person.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/entity/Person.java
deleted file mode 100644
index b3196bc..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/entity/Person.java
+++ /dev/null
@@ -1,70 +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 com.android.flatfoot.apireviewdemo.common.entity;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-@Entity
-public class Person {
- @PrimaryKey
- private int id;
- private String login;
- private String name;
- private String lastName;
- private String company;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getCompany() {
- return company;
- }
-
- public void setCompany(String company) {
- this.company = company;
- }
-
- public String getLogin() {
- return login;
- }
-
- public void setLogin(String login) {
- this.login = login;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDao.java
deleted file mode 100644
index 19283bf..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDao.java
+++ /dev/null
@@ -1,49 +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 com.android.flatfoot.apireviewdemo.common.github;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-
-/**
- * Data access object for github data table.
- */
-@Dao
-public interface GithubDao {
- /**
- * Load full data for a person based on the login.
- */
- @Query("select * from person where login = :login")
- LiveData<Person> getLivePerson(String login);
-
- /**
- * Load full data for a person based on the login.
- */
- @Query("select * from person where login = :login")
- Person getPerson(String login);
-
- /**
- * Insert or update full data for a person.
- */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertOrReplacePerson(Person personData);
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabase.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabase.java
deleted file mode 100644
index 3a0dfe1..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabase.java
+++ /dev/null
@@ -1,33 +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 com.android.flatfoot.apireviewdemo.common.github;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-
-/**
- * Database for Github entities.
- */
-@Database(entities = {Person.class}, version = 1)
-public abstract class GithubDatabase extends RoomDatabase {
- /**
- * Gets the data access object.
- */
- public abstract GithubDao getGithubDao();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabaseHelper.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabaseHelper.java
deleted file mode 100644
index 02d5e09..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubDatabaseHelper.java
+++ /dev/null
@@ -1,56 +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.
- */
-
-/*
- * 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.android.flatfoot.apireviewdemo.common.github;
-
-import android.arch.persistence.room.Room;
-import android.content.Context;
-
-import com.android.flatfoot.apireviewdemo.DemoApplication;
-
-/**
- * Database helper.
- */
-public class GithubDatabaseHelper {
- private static GithubDatabase sInstance;
-
- /**
- * Gets a database instance.
- */
- public static synchronized GithubDatabase getDatabase() {
- if (sInstance == null) {
- Context context = DemoApplication.context();
- sInstance = Room.databaseBuilder(context, GithubDatabase.class, "github.db").build();
- }
- return sInstance;
- }
-
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubService.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubService.java
deleted file mode 100644
index 2c44097..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/common/github/GithubService.java
+++ /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.
- */
-
-package com.android.flatfoot.apireviewdemo.common.github;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-
-import retrofit2.Call;
-import retrofit2.http.GET;
-import retrofit2.http.Path;
-
-/**
- * Retrofit-powered service to connect to Github backend.
- */
-public interface GithubService {
- /**
- * Gets the information about the specified user.
- */
- @GET("/users/{user}")
- Call<Person> getUser(@Path("user") String user);
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/BasicDatabase.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/BasicDatabase.java
deleted file mode 100644
index 2bfb0d9..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/BasicDatabase.java
+++ /dev/null
@@ -1,26 +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 com.android.flatfoot.apireviewdemo.db_01_basic;
-
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-@Database(entities = User.class, version = 1)
-public abstract class BasicDatabase extends RoomDatabase {
-
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/Usage.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/Usage.java
deleted file mode 100644
index c2c52d5..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/Usage.java
+++ /dev/null
@@ -1,46 +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 com.android.flatfoot.apireviewdemo.db_01_basic;
-
-
-import android.arch.persistence.db.SupportSQLiteDatabase;
-import android.arch.persistence.room.Room;
-import android.content.Context;
-import android.database.Cursor;
-
-import timber.log.Timber;
-
-public class Usage {
- BasicDatabase mBasicDatabase;
-
- public Usage(Context context) {
- mBasicDatabase = Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
- BasicDatabase.class).build();
- }
-
- public void directSQL() {
- SupportSQLiteDatabase db = mBasicDatabase.getOpenHelper().getWritableDatabase();
- Cursor cursor = db.rawQuery("select * from User", new String[0]);
- try {
- while (cursor.moveToNext()) {
- Timber.d("user name: %s", cursor.getString(cursor.getColumnIndex("name")));
- }
- } finally {
- cursor.close();
- }
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/User.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/User.java
deleted file mode 100644
index 949569a..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_01_basic/User.java
+++ /dev/null
@@ -1,29 +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 com.android.flatfoot.apireviewdemo.db_01_basic;
-
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-@Entity
-public class User {
- @PrimaryKey
- public int id;
- public String name;
- public String lastName;
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/AppDatabase_02.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/AppDatabase_02.java
deleted file mode 100644
index 4b603af..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/AppDatabase_02.java
+++ /dev/null
@@ -1,27 +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 com.android.flatfoot.apireviewdemo.db_02_dao;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-
-@Database(entities = User.class, version = 2)
-public abstract class AppDatabase_02 extends RoomDatabase {
- public abstract UserCrudDao userDao();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/Usage.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/Usage.java
deleted file mode 100644
index 5075e2a..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/Usage.java
+++ /dev/null
@@ -1,42 +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 com.android.flatfoot.apireviewdemo.db_02_dao;
-
-import android.arch.persistence.room.Room;
-import android.content.Context;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-
-import java.util.List;
-
-import timber.log.Timber;
-
-public class Usage {
- AppDatabase_02 mBasicDatabase;
-
- public Usage(Context context) {
- mBasicDatabase = Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
- AppDatabase_02.class).build();
- }
-
- public void loadAllUsers() {
- List<User> allUsers = mBasicDatabase.userDao().loadAllUsers();
- for (User user : allUsers) {
- Timber.d("user name %s", user.name);
- }
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/UserCrudDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/UserCrudDao.java
deleted file mode 100644
index fe367b9..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_02_dao/UserCrudDao.java
+++ /dev/null
@@ -1,54 +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 com.android.flatfoot.apireviewdemo.db_02_dao;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Delete;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-
-import java.util.List;
-
-@Dao
-public interface UserCrudDao {
- @Query("select * from user")
- List<User> loadAllUsers();
-
- @Query("select * from user where id = :id")
- User loadUserById(int id);
-
- @Query("select * from user where name = :firstName and lastName = :lastName")
- List<User> findByNameAndLastName(String firstName, String lastName);
-
- @Insert
- void insertUser(User user);
-
- @Delete
- void deleteUser(User user);
-
- @Query("delete from user where name like :badName OR lastName like :badName")
- int deleteUsersByName(String badName);
-
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertOrReplaceUsers(User... users);
-
- @Delete
- void deleteBothUsers(User user1, User user2);
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/AppDatabase_03.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/AppDatabase_03.java
deleted file mode 100644
index 934c3c5..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/AppDatabase_03.java
+++ /dev/null
@@ -1,30 +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 com.android.flatfoot.apireviewdemo.db_03_entity;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-import com.android.flatfoot.apireviewdemo.db_02_dao.UserCrudDao;
-
-@Database(entities = {User.class, Pet.class}, version = 3)
-public abstract class AppDatabase_03 extends RoomDatabase {
- public abstract UserCrudDao userDao();
-
- public abstract PetDao petDao();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/Pet.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/Pet.java
deleted file mode 100644
index a4cc40e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/Pet.java
+++ /dev/null
@@ -1,55 +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 com.android.flatfoot.apireviewdemo.db_03_entity;
-
-import android.arch.persistence.room.ColumnInfo;
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.Index;
-import android.arch.persistence.room.PrimaryKey;
-
-@Entity(indices = @Index("name"))
-public class Pet {
- @PrimaryKey
- private int id;
- @ColumnInfo(name = "owner_id", index = true)
- private int ownerId;
- private String name;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public int getOwnerId() {
- return ownerId;
- }
-
- public void setOwnerId(int ownerId) {
- this.ownerId = ownerId;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/PetDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/PetDao.java
deleted file mode 100644
index 02ac65d..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_03_entity/PetDao.java
+++ /dev/null
@@ -1,28 +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 com.android.flatfoot.apireviewdemo.db_03_entity;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Query;
-
-import java.util.List;
-
-@Dao
-public interface PetDao {
- @Query("select * from Pet where owner_id = :userId")
- List<Pet> findPetsOfUser(int userId);
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/AppDatabase_04.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/AppDatabase_04.java
deleted file mode 100644
index c216901..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/AppDatabase_04.java
+++ /dev/null
@@ -1,28 +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 com.android.flatfoot.apireviewdemo.db_04_pojo;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-import com.android.flatfoot.apireviewdemo.db_03_entity.Pet;
-
-@Database(entities = {User.class, Pet.class}, version = 4)
-public abstract class AppDatabase_04 extends RoomDatabase {
- public abstract UserPetDao userPetDao();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserNameAndPetName.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserNameAndPetName.java
deleted file mode 100644
index daae8f0..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserNameAndPetName.java
+++ /dev/null
@@ -1,42 +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 com.android.flatfoot.apireviewdemo.db_04_pojo;
-
-import android.arch.persistence.room.ColumnInfo;
-
-public class UserNameAndPetName {
- @ColumnInfo(name = "user_name")
- private String userName;
- @ColumnInfo(name = "pet_name")
- private String petName;
-
- public String getUserName() {
- return userName;
- }
-
- public void setUserName(String userName) {
- this.userName = userName;
- }
-
- public String getPetName() {
- return petName;
- }
-
- public void setPetName(String petName) {
- this.petName = petName;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserPetDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserPetDao.java
deleted file mode 100644
index 9ae8e7b..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserPetDao.java
+++ /dev/null
@@ -1,32 +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 com.android.flatfoot.apireviewdemo.db_04_pojo;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Query;
-
-import java.util.List;
-
-@Dao
-public interface UserPetDao {
- @Query("select user.*, COUNT(*) from user, pet where user.id = pet.owner_id GROUP BY user.id")
- List<UserWithPetCount> getUsersAndNumberOfPets();
-
- @Query("select user.name as user_name, pet.name as pet_name FROM user, pet WHERE"
- + " user.id = pet.owner_id")
- List<UserNameAndPetName> getNameTuples();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserWithPetCount.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserWithPetCount.java
deleted file mode 100644
index 62ce989..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_04_pojo/UserWithPetCount.java
+++ /dev/null
@@ -1,26 +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 com.android.flatfoot.apireviewdemo.db_04_pojo;
-
-import android.arch.persistence.room.ColumnInfo;
-
-import com.android.flatfoot.apireviewdemo.db_01_basic.User;
-
-public class UserWithPetCount extends User {
- @ColumnInfo(name = "COUNT(*)")
- public int petCount;
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/AppDatabase_05.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/AppDatabase_05.java
deleted file mode 100644
index 927ac8f..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/AppDatabase_05.java
+++ /dev/null
@@ -1,25 +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 com.android.flatfoot.apireviewdemo.db_05_converters;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-@Database(entities = Game.class, version = 5)
-public abstract class AppDatabase_05 extends RoomDatabase {
- public abstract GameDao gameDao();
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/DateConverter.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/DateConverter.java
deleted file mode 100644
index 933c13e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/DateConverter.java
+++ /dev/null
@@ -1,33 +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 com.android.flatfoot.apireviewdemo.db_05_converters;
-
-import android.arch.persistence.room.TypeConverter;
-
-import java.util.Date;
-
-public class DateConverter {
- @TypeConverter
- public static Date toDate(Long timestamp) {
- return timestamp == null ? null : new Date(timestamp);
- }
-
- @TypeConverter
- public static Long toTimestamp(Date date) {
- return date == null ? null : date.getTime();
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/Game.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/Game.java
deleted file mode 100644
index 470861a..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/Game.java
+++ /dev/null
@@ -1,73 +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 com.android.flatfoot.apireviewdemo.db_05_converters;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.TypeConverters;
-
-import java.util.Date;
-
-@Entity(primaryKeys = {"home", "away", "time"})
-// could be here as well @TypeConverters(DateConverter.class)
-public class Game {
- private String home;
- private String away;
- @TypeConverters(DateConverter.class)
- private Date time;
- private int homeScore;
- private int awayScore;
-
- public String getHome() {
- return home;
- }
-
- public void setHome(String home) {
- this.home = home;
- }
-
- public String getAway() {
- return away;
- }
-
- public void setAway(String away) {
- this.away = away;
- }
-
- public Date getTime() {
- return time;
- }
-
- public void setTime(Date time) {
- this.time = time;
- }
-
- public int getHomeScore() {
- return homeScore;
- }
-
- public void setHomeScore(int homeScore) {
- this.homeScore = homeScore;
- }
-
- public int getAwayScore() {
- return awayScore;
- }
-
- public void setAwayScore(int awayScore) {
- this.awayScore = awayScore;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/GameDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/GameDao.java
deleted file mode 100644
index a1ccafa..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_05_converters/GameDao.java
+++ /dev/null
@@ -1,40 +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 com.android.flatfoot.apireviewdemo.db_05_converters;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Query;
-import android.arch.persistence.room.TypeConverters;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-@Dao
-@TypeConverters(DateConverter.class)
-public abstract class GameDao {
- @Query("select * from Game where `time` BETWEEN :from AND :to")
- abstract public List<Game> findGamesInRange(Date from, Date to);
-
- public List<Game> listGamesIn1Week() {
- Calendar calendar = Calendar.getInstance();
- Date today = calendar.getTime();
- calendar.set(Calendar.DATE, 7);
- Date nextWeek = calendar.getTime();
- return findGamesInRange(today, nextWeek);
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Address.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Address.java
deleted file mode 100644
index ba3d334..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Address.java
+++ /dev/null
@@ -1,29 +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 com.android.flatfoot.apireviewdemo.db_06_decompose;
-
-import android.arch.persistence.room.Embedded;
-
-/**
- * Decomposed into {@link School}.
- */
-public class Address {
- public String street;
- public String state;
- @Embedded
- public Location location;
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/AppDatabase_06.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/AppDatabase_06.java
deleted file mode 100644
index 8e0f495..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/AppDatabase_06.java
+++ /dev/null
@@ -1,24 +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 com.android.flatfoot.apireviewdemo.db_06_decompose;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-
-@Database(entities = {School.class}, version = 6)
-public abstract class AppDatabase_06 extends RoomDatabase {
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Location.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Location.java
deleted file mode 100644
index e39f110..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/Location.java
+++ /dev/null
@@ -1,41 +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 com.android.flatfoot.apireviewdemo.db_06_decompose;
-
-/**
- * Decomposed into {@link Address}.
- */
-public class Location {
- private long latitude;
- private long longitude;
-
- public long getLatitude() {
- return latitude;
- }
-
- public void setLatitude(long latitude) {
- this.latitude = latitude;
- }
-
- public long getLongitude() {
- return longitude;
- }
-
- public void setLongitude(long longitude) {
- this.longitude = longitude;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/School.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/School.java
deleted file mode 100644
index 3137344..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/School.java
+++ /dev/null
@@ -1,48 +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 com.android.flatfoot.apireviewdemo.db_06_decompose;
-
-import android.arch.persistence.room.Embedded;
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-/**
- * Has decomposed address which has decomposed location so will have all the fields from 3 classes.
- */
-@Entity
-public class School {
- @PrimaryKey(autoGenerate = true)
- private int id;
- @Embedded
- private Address address;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/SchoolDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/SchoolDao.java
deleted file mode 100644
index 6060573..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/db_06_decompose/SchoolDao.java
+++ /dev/null
@@ -1,39 +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 com.android.flatfoot.apireviewdemo.db_06_decompose;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-
-import java.util.List;
-
-@Dao
-public interface SchoolDao {
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void save(School school);
-
- @Query("SELECT * FROM school WHERE street LIKE :street")
- List<School> findByStreetName(String street);
-
- @Query("SELECT street, state, latitude, longitude FROM school WHERE id = ?")
- Address findAddressOfSchool(int id);
-
- @Query("SELECT * FROM school WHERE id = ?")
- Location findLocaltionOfSchool(int id);
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/Note.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/Note.java
deleted file mode 100644
index 843bf60..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/Note.java
+++ /dev/null
@@ -1,53 +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 com.android.flatfoot.apireviewdemo.exercise;
-
-public class Note {
- private int id;
- private String label;
- private String body;
-
- public Note(int id, String label, String body) {
- this.id = id;
- this.label = label;
- this.body = body;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getLabel() {
- return label;
- }
-
- public void setLabel(String label) {
- this.label = label;
- }
-
- public String getBody() {
- return body;
- }
-
- public void setBody(String body) {
- this.body = body;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteActivity.java
deleted file mode 100644
index 847a6ec..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteActivity.java
+++ /dev/null
@@ -1,50 +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 com.android.flatfoot.apireviewdemo.exercise;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.os.Bundle;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.flatfoot.apireviewdemo.R;
-
-public class NoteActivity extends LifecycleActivity {
-
- private TextView mNoteLabelView;
- private TextView mNoteBodyView;
- private ProgressBar mProgressBar;
-
- private void showNote(Note note) {
- mNoteLabelView.setText(note.getLabel());
- mNoteBodyView.setText(note.getBody());
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.note_activity_layout);
- mNoteLabelView = (TextView) findViewById(R.id.note_label);
- mNoteBodyView = (TextView) findViewById(R.id.note_body);
- mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
-
- //TODO complete the exercise into steps:
- // 1. create a ViewModel and load a Note via NoteWebService
- // 2. persist a loaded note to NoteDatabase.
- showNote(new Note(0, "a", "b"));
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteWebService.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteWebService.java
deleted file mode 100644
index 6c0936f..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/NoteWebService.java
+++ /dev/null
@@ -1,72 +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 com.android.flatfoot.apireviewdemo.exercise;
-
-import android.support.annotation.NonNull;
-
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-public class NoteWebService {
-
- interface Callback {
- void success(@NonNull Note note);
-
- void failure(String errorMsg);
- }
-
- public static void loadNoteWithId(int id, Callback callback) {
- InternalNoteWebService.load(id, callback);
- }
-
-}
-
-// IMPLEMENTATION DETAILS
-
-class InternalNoteWebService {
-
- static ExecutorService sService = Executors.newSingleThreadExecutor();
- static Random sRandom = new Random(261);
-
- private static final String[] WILDE = new String[]{
- "I am so clever that sometimes I don't understand a single word of what I am saying",
- "I don't want to go to heaven. None of my friends are there",
- "I am not young enough to know everything.",
- "Quotation is a serviceable substitute for wit."
- };
-
- static void load(final int id, final NoteWebService.Callback callback) {
- sService.submit(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- if (sRandom.nextInt(10) == 0) {
- callback.failure("Ooops! Something went wrong.");
- } else {
- Note note = new Note(id, "Label " + id, WILDE[id % WILDE.length]);
- callback.success(note);
- }
- }
- });
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDao.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDao.java
deleted file mode 100644
index 5fff92e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDao.java
+++ /dev/null
@@ -1,23 +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 com.android.flatfoot.apireviewdemo.exercise.db;
-
-import android.arch.persistence.room.Dao;
-
-@Dao
-public class NoteDao {
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDatabase.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDatabase.java
deleted file mode 100644
index a149498..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/exercise/db/NoteDatabase.java
+++ /dev/null
@@ -1,42 +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 com.android.flatfoot.apireviewdemo.exercise.db;
-
-import android.arch.persistence.room.Room;
-import android.arch.persistence.room.RoomDatabase;
-import android.content.Context;
-
-import com.android.flatfoot.apireviewdemo.DemoApplication;
-
-//@Database(entities = Note.class)
-abstract public class NoteDatabase extends RoomDatabase {
-
- private static NoteDatabase sInstance;
-
- public abstract NoteDao getNoteDao();
-
- /**
- * Gets a database instance.
- */
- public static synchronized NoteDatabase getInstance() {
- if (sInstance == null) {
- Context context = DemoApplication.context();
- sInstance = Room.databaseBuilder(context, NoteDatabase.class, "notes.db").build();
- }
- return sInstance;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/AccountViewModel.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/AccountViewModel.java
deleted file mode 100644
index 887a1ca..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/AccountViewModel.java
+++ /dev/null
@@ -1,119 +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 com.android.flatfoot.apireviewdemo.full_sample_xxx;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModel;
-import android.support.annotation.Nullable;
-import android.text.TextUtils;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-import com.android.flatfoot.apireviewdemo.common.github.GithubDatabaseHelper;
-import com.android.flatfoot.apireviewdemo.full_sample_xxx.DataManagement.Cancelable;
-
-public class AccountViewModel extends ViewModel {
-
- public final MutableLiveData<Status> statusData = new MutableLiveData<>();
- public final MutableLiveData<Person> personData = new MutableLiveData<>();
-
- private final DataManagement mDataManagement = DataManagement.getInstance();
-
- private final DataManagement.Callback mCallback = new DataManagement.Callback() {
- @Override
- public void onSuccess() {
- finishRequest(200);
- }
-
- @Override
- public void onFail(int code) {
- finishRequest(code);
- }
- };
-
- private boolean inForceRefresh = false;
- private Cancelable mCurrentRequest;
- private String mLogin;
- private LiveData<Person> mPrivatePersonData;
- private Observer<Person> mObserver = new Observer<Person>() {
- @Override
- public void onChanged(@Nullable Person person) {
- personData.setValue(person);
- }
- };
-
- private void cancelRequest() {
- if (mCurrentRequest != null) {
- mCurrentRequest.cancel();
- statusData.setValue(new Status(0, false));
- mCurrentRequest = null;
- }
- }
-
- private void finishRequest(int code) {
- statusData.setValue(new Status(code, false));
- inForceRefresh = false;
- mCurrentRequest = null;
- }
-
- public void setUser(String login) {
- if (TextUtils.equals(mLogin, login)) {
- return;
- }
- if (mPrivatePersonData != null) {
- mPrivatePersonData.removeObserver(mObserver);
- }
-
- cancelRequest();
- mLogin = login;
- mPrivatePersonData = GithubDatabaseHelper.getDatabase().getGithubDao().getLivePerson(
- mLogin);
- mPrivatePersonData.observeForever(mObserver);
- statusData.setValue(new Status(0, true));
- mCurrentRequest = mDataManagement.refreshIfNeeded(mLogin, mCallback);
- }
-
- public void forceRefresh() {
- if (inForceRefresh || mLogin == null) {
- return;
- }
- cancelRequest();
- inForceRefresh = true;
-
- statusData.setValue(new Status(0, true));
- mCurrentRequest = mDataManagement.forceRefresh(mLogin, mCallback);
- }
-
-
- static class Status {
- final int status;
- final boolean updating;
-
- Status(int status, boolean loading) {
- this.status = status;
- this.updating = loading;
- }
- }
-
- @Override
- protected void onCleared() {
- if (mPrivatePersonData != null) {
- mPrivatePersonData.removeObserver(mObserver);
- }
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/DataManagement.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/DataManagement.java
deleted file mode 100644
index de97554..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/DataManagement.java
+++ /dev/null
@@ -1,184 +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 com.android.flatfoot.apireviewdemo.full_sample_xxx;
-
-import android.os.Handler;
-import android.os.Looper;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-import com.android.flatfoot.apireviewdemo.common.github.GithubDao;
-import com.android.flatfoot.apireviewdemo.common.github.GithubDatabaseHelper;
-import com.android.flatfoot.apireviewdemo.common.github.GithubService;
-
-import java.io.IOException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-import retrofit2.Response;
-import retrofit2.Retrofit;
-import retrofit2.converter.gson.GsonConverterFactory;
-
-public class DataManagement {
- private static DataManagement sInstance;
- private static ExecutorService sExecutor = Executors.newFixedThreadPool(2);
-
- public static DataManagement getInstance() {
- if (sInstance == null) {
- sInstance = new DataManagement();
- }
- return sInstance;
- }
-
- class CallbackWrapper {
- private final Callback mCallback;
- private final CancelRequest mCancelRequest = new CancelRequest();
-
- CallbackWrapper(Callback callback) {
- mCallback = callback;
- }
- }
-
- interface Cancelable {
- void cancel();
- }
-
- class CancelRequest implements Cancelable {
- boolean mCanceled = false;
- Future<?> mFuture;
-
- @Override
- public void cancel() {
- mFuture.cancel(true);
- mCanceled = true;
- }
- }
-
-
- interface Callback {
- void onSuccess();
-
- void onFail(int code);
- }
-
- private Handler mHandler = new Handler(Looper.getMainLooper());
- private final GithubService mGithubService;
-
- public DataManagement() {
- Retrofit retrofit = new Retrofit.Builder()
- .baseUrl("https://api.github.com")
- .addConverterFactory(GsonConverterFactory.create())
- .build();
-
- mGithubService = retrofit.create(GithubService.class);
- }
-
- Cancelable refreshIfNeeded(String user, Callback callback) {
- CallbackWrapper wrapper = new CallbackWrapper(callback);
- wrapper.mCancelRequest.mFuture = sExecutor.submit(
- new UpdateIfNeededRunnable(user, wrapper));
-
- return wrapper.mCancelRequest;
- }
-
- Cancelable forceRefresh(String user, Callback callback) {
- CallbackWrapper wrapper = new CallbackWrapper(callback);
- wrapper.mCancelRequest.mFuture = sExecutor.submit(new UpdateRunnable(user, wrapper));
- return wrapper.mCancelRequest;
- }
-
- private class UpdateIfNeededRunnable implements Runnable {
-
- private final String user;
- private CallbackWrapper mCallback;
-
- private UpdateIfNeededRunnable(String user, CallbackWrapper callback) {
- this.user = user;
- mCallback = callback;
- }
-
- @Override
- public void run() {
- Person personData = getGithubDao().getPerson(user);
- if (personData == null) {
- UpdateRunnable runnable = new UpdateRunnable(user, mCallback);
- runnable.run();
- } else {
- postSuccess(mCallback);
- }
- }
- }
-
- private class UpdateRunnable implements Runnable {
-
- private final String user;
- private final CallbackWrapper mCallback;
-
- private UpdateRunnable(String user, CallbackWrapper callback) {
- this.user = user;
- mCallback = callback;
- }
-
- @Override
- public void run() {
- try {
- try {
- Thread.sleep(15000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Response<Person> response = mGithubService.getUser(this.user).execute();
- if (response.isSuccessful()) {
- getGithubDao().insertOrReplacePerson(response.body());
- postSuccess(mCallback);
- } else {
- postFail(mCallback, response.code());
- }
- } catch (IOException e) {
- postFail(mCallback, -2);
- }
- }
- }
-
- private void postSuccess(final CallbackWrapper callback) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if (!callback.mCancelRequest.mCanceled) {
- callback.mCallback.onSuccess();
- }
- }
- });
- }
-
- private void postFail(final CallbackWrapper callback, final int code) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if (!callback.mCancelRequest.mCanceled) {
- callback.mCallback.onFail(code);
- }
- }
- });
- }
-
- private static GithubDao getGithubDao() {
- return GithubDatabaseHelper.getDatabase().getGithubDao();
- }
-
-
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/SwitchAccountsActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/SwitchAccountsActivity.java
deleted file mode 100644
index 41f6b63..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/full_sample_xxx/SwitchAccountsActivity.java
+++ /dev/null
@@ -1,77 +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 com.android.flatfoot.apireviewdemo.full_sample_xxx;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.flatfoot.apireviewdemo.R;
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-
-import java.util.Random;
-
-public class SwitchAccountsActivity extends LifecycleActivity {
-
- public final String[] USERS = new String[]{"yigit", "JakeWharton"};
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final AccountViewModel viewModel = ViewModelProviders.of(this).get(AccountViewModel.class);
- viewModel.setUser(USERS[0]);
- setContentView(R.layout.switch_accounts);
-
- findViewById(R.id.switch_user).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- viewModel.setUser(USERS[new Random().nextInt(USERS.length)]);
- }
- });
-
- viewModel.personData.observe(this, new Observer<Person>() {
- @Override
- public void onChanged(@Nullable Person data) {
- if (data != null) {
- TextView emailView = (TextView) findViewById(R.id.name);
- emailView.setText(data.getName());
- TextView nameView = (TextView) findViewById(R.id.company);
- nameView.setText(data.getCompany());
- }
- }
- });
-
- viewModel.statusData.observe(this, new Observer<AccountViewModel.Status>() {
- @Override
- public void onChanged(AccountViewModel.Status status) {
- findViewById(R.id.loading_spinner).setVisibility(
- status.updating ? View.VISIBLE : View.GONE);
- }
- });
-
- findViewById(R.id.force_refresh).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- viewModel.forceRefresh();
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/PermissionUtils.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/PermissionUtils.java
deleted file mode 100644
index b15b646..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/PermissionUtils.java
+++ /dev/null
@@ -1,45 +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 com.android.flatfoot.apireviewdemo.internal;
-
-import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
-import static android.support.v4.content.ContextCompat.checkSelfPermission;
-
-import android.Manifest;
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.support.v4.app.ActivityCompat;
-
-// ignore it as implementation detail
-public class PermissionUtils {
-
- public static boolean hasLocationPermission(Context context) {
- boolean fineLocationPermission = checkSelfPermission(context, ACCESS_FINE_LOCATION)
- == PackageManager.PERMISSION_GRANTED;
- boolean coarseLocationPermission = checkSelfPermission(context,
- ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
- return fineLocationPermission && coarseLocationPermission;
- }
-
- public static void requestLocationPermission(Activity activity) {
- ActivityCompat.requestPermissions(activity,
- new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/SimpleLocationListener.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/SimpleLocationListener.java
deleted file mode 100644
index 6c364c9..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/internal/SimpleLocationListener.java
+++ /dev/null
@@ -1,35 +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 com.android.flatfoot.apireviewdemo.internal;
-
-import android.location.LocationListener;
-import android.os.Bundle;
-
-public abstract class SimpleLocationListener implements LocationListener {
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationActivity.java
deleted file mode 100644
index 1d59048..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationActivity.java
+++ /dev/null
@@ -1,65 +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 com.android.flatfoot.apireviewdemo.lifecycle_01_basic;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.location.Location;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.flatfoot.apireviewdemo.R;
-import com.android.flatfoot.apireviewdemo.internal.PermissionUtils;
-import com.android.flatfoot.apireviewdemo.internal.SimpleLocationListener;
-
-public class LocationActivity extends LifecycleActivity {
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- // ignore permission handling code as an implementation detail
- if (PermissionUtils.hasLocationPermission(this)) {
- startListening();
- } else {
- Toast.makeText(this, "This sample requires Location access", Toast.LENGTH_LONG).show();
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.location_activity);
- // ignore permission handling code as an implementation detail
- if (PermissionUtils.hasLocationPermission(this)) {
- startListening();
- } else {
- PermissionUtils.requestLocationPermission(this);
- }
- }
-
- private void startListening() {
- LocationListener.listenLocation(this, new SimpleLocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- TextView textView = (TextView) findViewById(R.id.location);
- textView.setText(location.getLatitude() + ", " + location.getLongitude());
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationListener.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationListener.java
deleted file mode 100644
index 33ececc..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_01_basic/LocationListener.java
+++ /dev/null
@@ -1,59 +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 com.android.flatfoot.apireviewdemo.lifecycle_01_basic;
-
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleObserver;
-import android.arch.lifecycle.LifecycleOwner;
-import android.arch.lifecycle.OnLifecycleEvent;
-import android.content.Context;
-import android.location.LocationManager;
-
-import com.android.flatfoot.apireviewdemo.DemoApplication;
-import com.android.flatfoot.apireviewdemo.internal.SimpleLocationListener;
-
-@SuppressWarnings("MissingPermission")
-class LocationListener implements LifecycleObserver {
-
- static void listenLocation(LifecycleOwner provider,
- SimpleLocationListener listener) {
- new LocationListener(provider, listener);
- }
-
- private android.location.LocationManager mLocationManager;
- private final SimpleLocationListener mListener;
-
- private LocationListener(LifecycleOwner provider, SimpleLocationListener listener) {
- provider.getLifecycle().addObserver(this);
- mListener = listener;
- }
-
- @OnLifecycleEvent(Lifecycle.Event.ON_START)
- void start() {
- mLocationManager = (LocationManager) DemoApplication.context().getSystemService(
- Context.LOCATION_SERVICE);
- mLocationManager.requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER, 0, 0,
- mListener);
- }
-
-
- @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
- void stop() {
- mLocationManager.removeUpdates(mListener);
- mLocationManager = null;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LiveLocationActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LiveLocationActivity.java
deleted file mode 100644
index 9af9c6e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LiveLocationActivity.java
+++ /dev/null
@@ -1,68 +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 com.android.flatfoot.apireviewdemo.lifecycle_02_livedata;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.location.Location;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.flatfoot.apireviewdemo.R;
-import com.android.flatfoot.apireviewdemo.internal.PermissionUtils;
-
-public class LiveLocationActivity extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.location_activity);
- // ignore permission handling code as an implementation detail
- if (PermissionUtils.hasLocationPermission(this)) {
- startListening();
- } else {
- PermissionUtils.requestLocationPermission(this);
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- // ignore permission handling code as an implementation detail
- if (PermissionUtils.hasLocationPermission(this)) {
- startListening();
- } else {
- Toast.makeText(this, "This sample requires a location permission",
- Toast.LENGTH_LONG).show();
- }
- }
-
- private void startListening() {
- LocationLiveData liveData = LocationLiveData.getInstance();
- liveData.observe(this, new Observer<Location>() {
- @Override
- public void onChanged(@Nullable Location location) {
- TextView textView = (TextView) findViewById(R.id.location);
- textView.setText(location.getLatitude() + ", " + location.getLongitude());
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LocationLiveData.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LocationLiveData.java
deleted file mode 100644
index 84512c2..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_02_livedata/LocationLiveData.java
+++ /dev/null
@@ -1,62 +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 com.android.flatfoot.apireviewdemo.lifecycle_02_livedata;
-
-import android.arch.lifecycle.LiveData;
-import android.content.Context;
-import android.location.Location;
-import android.location.LocationManager;
-
-import com.android.flatfoot.apireviewdemo.DemoApplication;
-import com.android.flatfoot.apireviewdemo.internal.SimpleLocationListener;
-
-@SuppressWarnings("MissingPermission")
-public class LocationLiveData extends LiveData<Location> {
-
- private static LocationLiveData sInstance;
-
- public static LocationLiveData getInstance() {
- if (sInstance == null) {
- sInstance = new LocationLiveData();
- }
- return sInstance;
- }
-
- private LocationManager mLocationManager;
-
- private SimpleLocationListener mListener = new SimpleLocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- setValue(location);
- }
- };
-
- private LocationLiveData() {
- mLocationManager = (LocationManager) DemoApplication.context().getSystemService(
- Context.LOCATION_SERVICE);
- }
-
- @Override
- protected void onActive() {
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListener);
- }
-
- @Override
- protected void onInactive() {
- mLocationManager.removeUpdates(mListener);
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/AccountViewModel.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/AccountViewModel.java
deleted file mode 100644
index 9cc1716..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/AccountViewModel.java
+++ /dev/null
@@ -1,56 +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 com.android.flatfoot.apireviewdemo.lifecycle_03_viewmodel;
-
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.ViewModel;
-import android.support.annotation.NonNull;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-
-public class AccountViewModel extends ViewModel {
-
- static class PersonDataWithStatus {
- final Person person;
- final String errorMsg;
- final boolean loading;
-
- PersonDataWithStatus(Person person, String errorMsg, boolean loading) {
- this.person = person;
- this.errorMsg = errorMsg;
- this.loading = loading;
- }
- }
-
- public final MutableLiveData<PersonDataWithStatus> personData = new MutableLiveData<>();
-
- public AccountViewModel() {
- personData.setValue(new PersonDataWithStatus(null, null, true));
- DataManagement.getInstance().requestPersonData("jakewharton",
- new DataManagement.Callback() {
- @Override
- public void success(@NonNull Person person) {
- personData.setValue(new PersonDataWithStatus(person, null, false));
- }
-
- @Override
- public void failure(String errorMsg) {
- personData.setValue(new PersonDataWithStatus(null, errorMsg, false));
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/DataManagement.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/DataManagement.java
deleted file mode 100644
index 1a1c1ba..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/DataManagement.java
+++ /dev/null
@@ -1,71 +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 com.android.flatfoot.apireviewdemo.lifecycle_03_viewmodel;
-
-import android.support.annotation.NonNull;
-
-import com.android.flatfoot.apireviewdemo.common.entity.Person;
-import com.android.flatfoot.apireviewdemo.common.github.GithubService;
-
-import retrofit2.Call;
-import retrofit2.Response;
-import retrofit2.Retrofit;
-import retrofit2.converter.gson.GsonConverterFactory;
-
-class DataManagement {
-
- private static DataManagement sInstance = new DataManagement();
-
- interface Callback {
- void success(@NonNull Person person);
-
- void failure(String errorMsg);
- }
-
- public static DataManagement getInstance() {
- return sInstance;
- }
-
- private final GithubService mGithubService;
-
- public DataManagement() {
- Retrofit retrofit = new Retrofit.Builder()
- .baseUrl("https://api.github.com")
- .addConverterFactory(GsonConverterFactory.create())
- .build();
-
- mGithubService = retrofit.create(GithubService.class);
- }
-
- void requestPersonData(String user, final Callback callback) {
- mGithubService.getUser(user).enqueue(new retrofit2.Callback<Person>() {
- @Override
- public void onResponse(Call<Person> call, Response<Person> response) {
- if (response.isSuccessful()) {
- callback.success(response.body());
- } else {
- callback.failure("Failed with " + response.code());
- }
- }
-
- @Override
- public void onFailure(Call<Person> call, Throwable t) {
- callback.failure("Failed with " + t.getMessage());
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/OneAccountActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/OneAccountActivity.java
deleted file mode 100644
index c6743c7..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_03_viewmodel/OneAccountActivity.java
+++ /dev/null
@@ -1,51 +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 com.android.flatfoot.apireviewdemo.lifecycle_03_viewmodel;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.flatfoot.apireviewdemo.R;
-
-public class OneAccountActivity extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.view_model1);
-
- AccountViewModel viewModel = ViewModelProviders.of(this).get(AccountViewModel.class);
- viewModel.personData.observe(this, new Observer<AccountViewModel.PersonDataWithStatus>() {
- @Override
- public void onChanged(AccountViewModel.PersonDataWithStatus data) {
- if (data.person != null) {
- TextView emailView = (TextView) findViewById(R.id.name);
- emailView.setText(data.person.getName());
- TextView nameView = (TextView) findViewById(R.id.company);
- nameView.setText(data.person.getCompany());
- }
-
- findViewById(R.id.loading_spinner).setVisibility(data.loading ?
- View.VISIBLE : View.GONE);
- }
- });
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ChosenShapeFragment.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ChosenShapeFragment.java
deleted file mode 100644
index cd07514..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ChosenShapeFragment.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 com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel;
-
-import android.arch.lifecycle.LifecycleFragment;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.graphics.drawable.ShapeDrawable;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.flatfoot.apireviewdemo.R;
-
-public class ChosenShapeFragment extends LifecycleFragment {
-
- private View mNoneShapeView;
- private View mShapeView;
-
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- View layout = inflater.inflate(R.layout.chosen_shape_layout, container);
- mNoneShapeView = layout.findViewById(R.id.none);
- mShapeView = layout.findViewById(R.id.color);
- SharedViewModel viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
- viewModel.shapeDrawableData.observe(this, new Observer<ShapeDrawable>() {
- @Override
- public void onChanged(@Nullable ShapeDrawable shapeDrawable) {
- updateShape(shapeDrawable);
- }
- });
- return layout;
- }
-
- private void updateShape(ShapeDrawable shape) {
- mNoneShapeView.setVisibility(shape == null ? View.VISIBLE : View.GONE);
- mShapeView.setVisibility(shape != null ? View.VISIBLE : View.GONE);
- if (shape != null) {
- mShapeView.setBackground(shape);
- }
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapeChooserFragment.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapeChooserFragment.java
deleted file mode 100644
index 8a79143..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapeChooserFragment.java
+++ /dev/null
@@ -1,57 +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 com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.LifecycleFragment;
-import android.arch.lifecycle.ViewModelProviders;
-import android.graphics.drawable.ShapeDrawable;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel.internal.ShapesAdapter;
-
-public class ShapeChooserFragment extends LifecycleFragment {
-
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- LifecycleActivity activity = (LifecycleActivity) getActivity();
- final SharedViewModel sharedViewModel = ViewModelProviders.of(getActivity())
- .get(SharedViewModel.class);
-
- RecyclerView rv = new RecyclerView(activity);
- rv.setLayoutManager(new GridLayoutManager(activity, 3));
-
- // adapter itself is implementation detail, ignore it
- ShapesAdapter adapter = new ShapesAdapter();
- adapter.setShapeListener(new ShapesAdapter.ShapeListener() {
- @Override
- public void onShapeChosen(ShapeDrawable shapeDrawable) {
- sharedViewModel.shapeDrawableData.setValue(shapeDrawable);
- }
- });
- rv.setAdapter(adapter);
- return rv;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapesActivity.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapesActivity.java
deleted file mode 100644
index 3ecfef6..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/ShapesActivity.java
+++ /dev/null
@@ -1,31 +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 com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.os.Bundle;
-
-import com.android.flatfoot.apireviewdemo.R;
-
-public class ShapesActivity extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.shape_activity);
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/SharedViewModel.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/SharedViewModel.java
deleted file mode 100644
index c8768ac..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/SharedViewModel.java
+++ /dev/null
@@ -1,31 +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 com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel;
-
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.ViewModel;
-import android.graphics.drawable.ShapeDrawable;
-
-public class SharedViewModel extends ViewModel {
- public final MutableLiveData<ShapeDrawable> shapeDrawableData = createEmpty();
-
- private static MutableLiveData<ShapeDrawable> createEmpty() {
- MutableLiveData<ShapeDrawable> empty = new MutableLiveData<>();
- empty.setValue(null);
- return empty;
- }
-}
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/internal/ShapesAdapter.java b/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/internal/ShapesAdapter.java
deleted file mode 100644
index 9713649..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/java/com/android/flatfoot/apireviewdemo/lifecycle_04_shared_viewmodel/internal/ShapesAdapter.java
+++ /dev/null
@@ -1,115 +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 com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel.internal;
-
-
-import android.graphics.Color;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.OvalShape;
-import android.graphics.drawable.shapes.RectShape;
-import android.graphics.drawable.shapes.RoundRectShape;
-import android.graphics.drawable.shapes.Shape;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.flatfoot.apireviewdemo.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-// ignore it as an implementation detail
-public class ShapesAdapter extends RecyclerView.Adapter<VHolder> {
-
- public interface ShapeListener {
- void onShapeChosen(ShapeDrawable shapeDrawable);
- }
-
- private static final float[] RADII =
- {16.0f, 16.0f, 16.0f, 16.0f, 16.0f, 16.0f, 16.0f, 16.0f};
-
- private static final Shape[] SHAPES = new Shape[]{
- new RectShape(),
- new RoundRectShape(RADII, null, null),
- new OvalShape(),
- };
-
- private static final int[] COLORS = new int[]{
- Color.BLUE,
- Color.CYAN,
- Color.YELLOW,
- Color.RED,
- Color.GREEN,
- Color.LTGRAY,
- Color.MAGENTA,
- };
-
- private final List<ShapeDrawable> mDrawables = new ArrayList<>();
- private ShapeListener mShapeListener;
-
- public ShapesAdapter() {
- for (int color : COLORS) {
- for (Shape shape : SHAPES) {
- ShapeDrawable drawable = new ShapeDrawable(shape);
- drawable.getPaint().setColor(color);
- mDrawables.add(drawable);
- }
- }
- }
-
- @Override
- public VHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shape_item,
- parent, false);
- final VHolder holder = new VHolder(view);
- holder.mShapeView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mShapeListener != null) {
- mShapeListener.onShapeChosen(holder.mShapeDrawable);
- }
- }
- });
- return holder;
- }
-
- @Override
- public void onBindViewHolder(final VHolder holder, int position) {
- holder.mShapeView.setBackground(mDrawables.get(position));
- holder.mShapeDrawable = mDrawables.get(position);
- }
-
- @Override
- public int getItemCount() {
- return mDrawables.size();
- }
-
- public void setShapeListener(ShapeListener shapeListener) {
- mShapeListener = shapeListener;
- }
-}
-
-class VHolder extends RecyclerView.ViewHolder {
- View mShapeView;
- ShapeDrawable mShapeDrawable;
-
- public VHolder(View itemView) {
- super(itemView);
- mShapeView = itemView.findViewById(R.id.shape);
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/chosen_shape_layout.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/chosen_shape_layout.xml
deleted file mode 100644
index 2a88d65..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/chosen_shape_layout.xml
+++ /dev/null
@@ -1,45 +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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_marginBottom="20dp">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/current_chosen_color"
- android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium"
- android:paddingRight="10dp"/>
-
- <ImageView
- android:id="@+id/color"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:layout_gravity="center_vertical"/>
-
- <TextView
- android:id="@+id/none"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium"
- android:text="@string/none"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/location_activity.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/location_activity.xml
deleted file mode 100644
index 6401cc2..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/location_activity.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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <TextView
- android:id="@+id/location"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/note_activity_layout.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/note_activity_layout.xml
deleted file mode 100644
index 5eb0fd8..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/note_activity_layout.xml
+++ /dev/null
@@ -1,46 +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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <ProgressBar
- android:id="@+id/progress_bar"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/note_label"
- android:layout_marginRight="3dp"/>
-
- <TextView
- android:id="@+id/note_label"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </LinearLayout>
- <TextView
- android:id="@+id/note_body"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_activity.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_activity.xml
deleted file mode 100644
index 54548cf..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_activity.xml
+++ /dev/null
@@ -1,34 +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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <fragment
- android:id="@+id/chosen_color_fragment"
- android:name="com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel.ChosenShapeFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
- <fragment
- android:id="@+id/shape_chooser"
- android:name="com.android.flatfoot.apireviewdemo.lifecycle_04_shared_viewmodel.ShapeChooserFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_item.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_item.xml
deleted file mode 100644
index 3f6221e..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/shape_item.xml
+++ /dev/null
@@ -1,30 +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.
- -->
-
-<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"
- android:layout_gravity="center"
- android:background="@color/cardview_light_background">
- <View android:id="@+id/shape"
- android:layout_width="50dp"
- android:layout_height="50dp"
- android:layout_gravity="center"
- android:layout_margin="10dp"
- />
-</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/switch_accounts.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/switch_accounts.xml
deleted file mode 100644
index 78bb969..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/switch_accounts.xml
+++ /dev/null
@@ -1,31 +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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent" android:layout_height="match_parent"
- android:orientation="vertical">
- <Button android:id="@+id/switch_user" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="@string/switch_account"/>
- <ProgressBar android:id="@+id/loading_spinner" android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/name" android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/company" android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <Button android:id="@+id/force_refresh" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="@string/force_refresh"/>>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/view_model1.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/view_model1.xml
deleted file mode 100644
index 3d7f306..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/layout/view_model1.xml
+++ /dev/null
@@ -1,37 +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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <ProgressBar
- android:id="@+id/loading_spinner"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
- <TextView
- android:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <TextView
- android:id="@+id/company"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/colors.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/colors.xml
deleted file mode 100644
index 86b4304..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/colors.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.
- -->
-
-<resources>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
-</resources>
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/strings.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/strings.xml
deleted file mode 100644
index 4482754..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,28 +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.
- -->
-
-<resources>
- <string name="app_name">ApiReviewDemo</string>
- <string name="location_sample">Location Sample</string>
- <string name="live_location_sample">LiveLocation Sample</string>
- <string name="one_account_github">One Account</string>
- <string name="force_refresh">Force refresh</string>
- <string name="switch_account">Switch Account</string>
- <string name="current_chosen_color">Current chosen color:</string>
- <string name="none">None</string>
- <string name="shapes_label">Shapes Activity</string>
- <string name="note_label">Note label:</string>
-</resources>
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/styles.xml b/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/styles.xml
deleted file mode 100644
index 36ef789..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,27 +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.
- -->
-
-<resources>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
-
-</resources>
diff --git a/samples-flatfoot/ApiReviewDemo/app/src/test/java/com/android/flatfoot/apireviewdemo/ExampleUnitTest.java b/samples-flatfoot/ApiReviewDemo/app/src/test/java/com/android/flatfoot/apireviewdemo/ExampleUnitTest.java
deleted file mode 100644
index f3d51be..0000000
--- a/samples-flatfoot/ApiReviewDemo/app/src/test/java/com/android/flatfoot/apireviewdemo/ExampleUnitTest.java
+++ /dev/null
@@ -1,33 +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 com.android.flatfoot.apireviewdemo;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/ApiReviewDemo/build.gradle b/samples-flatfoot/ApiReviewDemo/build.gradle
deleted file mode 100644
index a458edd..0000000
--- a/samples-flatfoot/ApiReviewDemo/build.gradle
+++ /dev/null
@@ -1,43 +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.
- */
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-allprojects { p ->
- repositories {
- jcenter()
- def outFolder = new File(project.rootProject.rootDir, "../../../../out/host/gradle/frameworks/")
- maven {
- url "file://${new File(outFolder, "support/build/support_repo").absolutePath}"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/samples-flatfoot/ApiReviewDemo/gradle.properties b/samples-flatfoot/ApiReviewDemo/gradle.properties
deleted file mode 100644
index be27115..0000000
--- a/samples-flatfoot/ApiReviewDemo/gradle.properties
+++ /dev/null
@@ -1,33 +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.
-#
-
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index be2d403..0000000
--- a/samples-flatfoot/ApiReviewDemo/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,22 +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.
-#
-
-#Mon Dec 28 10:00:20 PST 2015
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
diff --git a/samples-flatfoot/ApiReviewDemo/gradlew b/samples-flatfoot/ApiReviewDemo/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/ApiReviewDemo/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/ApiReviewDemo/gradlew.bat b/samples-flatfoot/ApiReviewDemo/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/ApiReviewDemo/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/ApiReviewDemo/settings.gradle b/samples-flatfoot/ApiReviewDemo/settings.gradle
deleted file mode 100644
index 1df87d4..0000000
--- a/samples-flatfoot/ApiReviewDemo/settings.gradle
+++ /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.
- */
-
-include ':app'
diff --git a/samples-flatfoot/ContentProviderSample/.gitignore b/samples-flatfoot/ContentProviderSample/.gitignore
deleted file mode 100644
index 39fb081..0000000
--- a/samples-flatfoot/ContentProviderSample/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/ContentProviderSample/app/.gitignore b/samples-flatfoot/ContentProviderSample/app/.gitignore
deleted file mode 100644
index 796b96d..0000000
--- a/samples-flatfoot/ContentProviderSample/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
diff --git a/samples-flatfoot/ContentProviderSample/app/build.gradle b/samples-flatfoot/ContentProviderSample/app/build.gradle
deleted file mode 100644
index 72f77c8..0000000
--- a/samples-flatfoot/ContentProviderSample/app/build.gradle
+++ /dev/null
@@ -1,64 +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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId "com.example.android.contentprovidersample"
- minSdkVersion 14
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- // Write out the current schema of Room
- javaCompileOptions {
- annotationProcessorOptions {
- arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
- }
- }
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-}
-
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
-
- // Test
- testCompile 'junit:junit:4.12'
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
-
- // Support Libraries
- compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.android.support:recyclerview-v7:25.3.1'
-
- // App Toolkit
- // TODO: Replace with the actual dependencies
- compile "android.arch.lifecycle:extensions:1.0-SNAPSHOT"
- compile "android.arch.persistence.room:runtime:1.0-SNAPSHOT"
- annotationProcessor "android.arch.lifecycle:compiler:1.0-SNAPSHOT"
- annotationProcessor "android.arch.persistence.room:compiler:1.0-SNAPSHOT"
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/proguard-rules.pro b/samples-flatfoot/ContentProviderSample/app/proguard-rules.pro
deleted file mode 100644
index 06b266f..0000000
--- a/samples-flatfoot/ContentProviderSample/app/proguard-rules.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /usr/local/google/home/yaraki/Android/Sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
diff --git a/samples-flatfoot/ContentProviderSample/app/schemas/com.example.android.contentprovidersample.data.SampleDatabase/1.json b/samples-flatfoot/ContentProviderSample/app/schemas/com.example.android.contentprovidersample.data.SampleDatabase/1.json
deleted file mode 100644
index d154d07..0000000
--- a/samples-flatfoot/ContentProviderSample/app/schemas/com.example.android.contentprovidersample.data.SampleDatabase/1.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "formatVersion": 1,
- "database": {
- "version": 1,
- "identityHash": "d612c3c0739239af787986e19d97626b",
- "entities": [
- {
- "tableName": "cheeses",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)",
- "fields": [
- {
- "fieldPath": "id",
- "columnName": "_id",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "name",
- "columnName": "name",
- "affinity": "TEXT"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "_id"
- ],
- "autoGenerate": true
- },
- "indices": [
- {
- "name": "index_cheeses__id",
- "unique": false,
- "columnNames": [
- "_id"
- ],
- "createSql": "CREATE INDEX `index_cheeses__id` ON `${TABLE_NAME}` (`_id`)"
- }
- ],
- "foreignKeys": []
- }
- ],
- "setupQueries": [
- "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
- "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"d612c3c0739239af787986e19d97626b\")"
- ]
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/CheeseTest.java b/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/CheeseTest.java
deleted file mode 100644
index 7ae4ee6..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/CheeseTest.java
+++ /dev/null
@@ -1,64 +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 com.example.android.contentprovidersample;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import android.arch.persistence.room.Room;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.example.android.contentprovidersample.data.Cheese;
-import com.example.android.contentprovidersample.data.SampleDatabase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.IOException;
-
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class CheeseTest {
-
- private SampleDatabase mDatabase;
-
- @Before
- public void createDatabase() {
- mDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getTargetContext(),
- SampleDatabase.class).build();
- }
-
- @After
- public void closeDatabase() throws IOException {
- mDatabase.close();
- }
-
- @Test
- public void insertAndCount() {
- assertThat(mDatabase.cheese().count(), is(0));
- Cheese cheese = new Cheese();
- cheese.name = "abc";
- mDatabase.cheese().insert(cheese);
- assertThat(mDatabase.cheese().count(), is(1));
- }
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/SampleContentProviderTest.java b/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/SampleContentProviderTest.java
deleted file mode 100644
index 860a551..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/androidTest/java/com/example/android/contentprovidersample/SampleContentProviderTest.java
+++ /dev/null
@@ -1,162 +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 com.example.android.contentprovidersample;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.example.android.contentprovidersample.data.Cheese;
-import com.example.android.contentprovidersample.data.SampleDatabase;
-import com.example.android.contentprovidersample.provider.SampleContentProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class SampleContentProviderTest {
-
- private ContentResolver mContentResolver;
-
- @Before
- public void setUp() {
- final Context context = InstrumentationRegistry.getTargetContext();
- SampleDatabase.switchToInMemory(context);
- mContentResolver = context.getContentResolver();
- }
-
- @Test
- public void cheese_initiallyEmpty() {
- final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor, notNullValue());
- assertThat(cursor.getCount(), is(0));
- cursor.close();
- }
-
- @Test
- public void cheese_insert() {
- final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
- cheeseWithName("Daigo"));
- assertThat(itemUri, notNullValue());
- final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor, notNullValue());
- assertThat(cursor.getCount(), is(1));
- assertThat(cursor.moveToFirst(), is(true));
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(Cheese.COLUMN_NAME)), is("Daigo"));
- cursor.close();
- }
-
- @Test
- public void cheese_update() {
- final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
- cheeseWithName("Daigo"));
- assertThat(itemUri, notNullValue());
- final int count = mContentResolver.update(itemUri, cheeseWithName("Queso"), null, null);
- assertThat(count, is(1));
- final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor, notNullValue());
- assertThat(cursor.getCount(), is(1));
- assertThat(cursor.moveToFirst(), is(true));
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(Cheese.COLUMN_NAME)), is("Queso"));
- cursor.close();
- }
-
- @Test
- public void cheese_delete() {
- final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
- cheeseWithName("Daigo"));
- assertThat(itemUri, notNullValue());
- final Cursor cursor1 = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor1, notNullValue());
- assertThat(cursor1.getCount(), is(1));
- cursor1.close();
- final int count = mContentResolver.delete(itemUri, null, null);
- assertThat(count, is(1));
- final Cursor cursor2 = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor2, notNullValue());
- assertThat(cursor2.getCount(), is(0));
- cursor2.close();
- }
-
- @Test
- public void cheese_bulkInsert() {
- final int count = mContentResolver.bulkInsert(SampleContentProvider.URI_CHEESE,
- new ContentValues[]{
- cheeseWithName("Peynir"),
- cheeseWithName("Queso"),
- cheeseWithName("Daigo"),
- });
- assertThat(count, is(3));
- final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor, notNullValue());
- assertThat(cursor.getCount(), is(3));
- cursor.close();
- }
-
- @Test
- public void cheese_applyBatch() throws RemoteException, OperationApplicationException {
- final ArrayList<ContentProviderOperation> operations = new ArrayList<>();
- operations.add(ContentProviderOperation
- .newInsert(SampleContentProvider.URI_CHEESE)
- .withValue(Cheese.COLUMN_NAME, "Peynir")
- .build());
- operations.add(ContentProviderOperation
- .newInsert(SampleContentProvider.URI_CHEESE)
- .withValue(Cheese.COLUMN_NAME, "Queso")
- .build());
- final ContentProviderResult[] results = mContentResolver.applyBatch(
- SampleContentProvider.AUTHORITY, operations);
- assertThat(results.length, is(2));
- final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME}, null, null, null);
- assertThat(cursor, notNullValue());
- assertThat(cursor.getCount(), is(2));
- assertThat(cursor.moveToFirst(), is(true));
- cursor.close();
- }
-
- private ContentValues cheeseWithName(String name) {
- final ContentValues values = new ContentValues();
- values.put(Cheese.COLUMN_NAME, name);
- return values;
- }
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/AndroidManifest.xml b/samples-flatfoot/ContentProviderSample/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 82d25e4..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,44 +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="com.example.android.contentprovidersample">
-
- <permission android:name="com.example.android.contentprovidersample.provider.READ_WRITE"/>
-
- <application
- android:allowBackup="false"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/Theme.ContentProviderSample"
- tools:ignore="GoogleAppIndexingWarning">
-
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <provider
- android:name=".provider.SampleContentProvider"
- android:authorities="com.example.android.contentprovidersample.provider"
- android:exported="true"
- android:permission="com.example.android.contentprovidersample.provider.READ_WRITE"/>
-
- </application>
-
-</manifest>
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/MainActivity.java b/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/MainActivity.java
deleted file mode 100644
index 89db65f..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/MainActivity.java
+++ /dev/null
@@ -1,137 +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 com.example.android.contentprovidersample;
-
-import android.database.Cursor;
-import android.os.Bundle;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.example.android.contentprovidersample.data.Cheese;
-import com.example.android.contentprovidersample.provider.SampleContentProvider;
-
-
-/**
- * Not very relevant to Room. This just shows data from {@link SampleContentProvider}.
- *
- * <p>Since the data is exposed through the ContentProvider, other apps can read and write the
- * content in a similar manner to this.</p>
- */
-public class MainActivity extends AppCompatActivity {
-
- private static final int LOADER_CHEESES = 1;
-
- private CheeseAdapter mCheeseAdapter;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main_activity);
-
- final RecyclerView list = (RecyclerView) findViewById(R.id.list);
- list.setLayoutManager(new LinearLayoutManager(list.getContext()));
- mCheeseAdapter = new CheeseAdapter();
- list.setAdapter(mCheeseAdapter);
-
- getSupportLoaderManager().initLoader(LOADER_CHEESES, null, mLoaderCallbacks);
- }
-
- private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallbacks =
- new LoaderManager.LoaderCallbacks<Cursor>() {
-
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- switch (id) {
- case LOADER_CHEESES:
- return new CursorLoader(getApplicationContext(),
- SampleContentProvider.URI_CHEESE,
- new String[]{Cheese.COLUMN_NAME},
- null, null, null);
- default:
- throw new IllegalArgumentException();
- }
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- switch (loader.getId()) {
- case LOADER_CHEESES:
- mCheeseAdapter.setCheeses(data);
- break;
- }
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- switch (loader.getId()) {
- case LOADER_CHEESES:
- mCheeseAdapter.setCheeses(null);
- break;
- }
- }
-
- };
-
- private static class CheeseAdapter extends RecyclerView.Adapter<CheeseAdapter.ViewHolder> {
-
- private Cursor mCursor;
-
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new ViewHolder(parent);
- }
-
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- if (mCursor.moveToPosition(position)) {
- holder.mText.setText(mCursor.getString(
- mCursor.getColumnIndexOrThrow(Cheese.COLUMN_NAME)));
- }
- }
-
- @Override
- public int getItemCount() {
- return mCursor == null ? 0 : mCursor.getCount();
- }
-
- void setCheeses(Cursor cursor) {
- mCursor = cursor;
- notifyDataSetChanged();
- }
-
- static class ViewHolder extends RecyclerView.ViewHolder {
-
- TextView mText;
-
- ViewHolder(ViewGroup parent) {
- super(LayoutInflater.from(parent.getContext()).inflate(
- android.R.layout.simple_list_item_1, parent, false));
- mText = (TextView) itemView.findViewById(android.R.id.text1);
- }
-
- }
-
- }
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/Cheese.java b/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/Cheese.java
deleted file mode 100644
index 4534e13..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/Cheese.java
+++ /dev/null
@@ -1,201 +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 com.example.android.contentprovidersample.data;
-
-import android.arch.persistence.room.ColumnInfo;
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-import android.content.ContentValues;
-import android.provider.BaseColumns;
-
-
-/**
- * Represents one record of the Cheese table.
- */
-@Entity(tableName = Cheese.TABLE_NAME)
-public class Cheese {
-
- /** The name of the Cheese table. */
- public static final String TABLE_NAME = "cheeses";
-
- /** The name of the ID column. */
- public static final String COLUMN_ID = BaseColumns._ID;
-
- /** The name of the name column. */
- public static final String COLUMN_NAME = "name";
-
- /** The unique ID of the cheese. */
- @PrimaryKey(autoGenerate = true)
- @ColumnInfo(index = true, name = COLUMN_ID)
- public long id;
-
- /** The name of the cheese. */
- @ColumnInfo(name = COLUMN_NAME)
- public String name;
-
- /**
- * Create a new {@link Cheese} from the specified {@link ContentValues}.
- *
- * @param values A {@link ContentValues} that at least contain {@link #COLUMN_NAME}.
- * @return A newly created {@link Cheese} instance.
- */
- public static Cheese fromContentValues(ContentValues values) {
- final Cheese cheese = new Cheese();
- if (values.containsKey(COLUMN_ID)) {
- cheese.id = values.getAsLong(COLUMN_ID);
- }
- if (values.containsKey(COLUMN_NAME)) {
- cheese.name = values.getAsString(COLUMN_NAME);
- }
- return cheese;
- }
-
- /** Dummy data. */
- static final String[] CHEESES = {
- "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
- "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
- "Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
- "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
- "Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
- "Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
- "Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
- "Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
- "Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
- "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
- "Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
- "Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
- "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
- "Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
- "Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
- "Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
- "Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
- "Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
- "Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
- "Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
- "Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
- "Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
- "Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
- "Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",
- "Capriole Banon", "Carre de l'Est", "Casciotta di Urbino", "Cashel Blue", "Castellano",
- "Castelleno", "Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
- "Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou", "Chabichou du Poitou",
- "Chabis de Gatine", "Chaource", "Charolais", "Chaumes", "Cheddar",
- "Cheddar Clothbound", "Cheshire", "Chevres", "Chevrotin des Aravis", "Chontaleno",
- "Civray", "Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby", "Cold Pack",
- "Comte", "Coolea", "Cooleney", "Coquetdale", "Corleggy", "Cornish Pepper",
- "Cotherstone", "Cotija", "Cottage Cheese", "Cottage Cheese (Australian)",
- "Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
- "Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza",
- "Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley",
- "Cuajada", "Curd", "Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
- "Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo", "Danish Fontina",
- "Daralagjazsky", "Dauphin", "Delice des Fiouves", "Denhany Dorset Drum", "Derby",
- "Dessertnyj Belyj", "Devon Blue", "Devon Garland", "Dolcelatte", "Doolin",
- "Doppelrhamstufel", "Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
- "Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra", "Dunlop", "Dunsyre Blue",
- "Duroblando", "Durrus", "Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
- "Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne", "Esbareich",
- "Esrom", "Etorki", "Evansdale Farmhouse Brie", "Evora De L'Alentejo", "Exmoor Blue",
- "Explorateur", "Feta", "Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
- "Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis", "Flor de Guia",
- "Flower Marie", "Folded", "Folded cheese with mint", "Fondant de Brebis",
- "Fontainebleau", "Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
- "Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire", "Fourme de Montbrison",
- "Fresh Jack", "Fresh Mozzarella", "Fresh Ricotta", "Fresh Truffles", "Fribourgeois",
- "Friesekaas", "Friesian", "Friesla", "Frinault", "Fromage a Raclette", "Fromage Corse",
- "Fromage de Montagne de Savoie", "Fromage Frais", "Fruit Cream Cheese",
- "Frying Cheese", "Fynbo", "Gabriel", "Galette du Paludier", "Galette Lyonnaise",
- "Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail", "Garrotxa", "Gastanberra",
- "Geitost", "Gippsland Blue", "Gjetost", "Gloucester", "Golden Cross", "Gorgonzola",
- "Gornyaltajski", "Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
- "Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
- "Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh", "Greve",
- "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny", "Halloumi",
- "Halloumy (Australian)", "Haloumi-Style Cheese", "Harbourne Blue", "Havarti",
- "Heidi Gruyere", "Hereford Hop", "Herrgardsost", "Herriot Farmhouse", "Herve",
- "Hipi Iti", "Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
- "Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu", "Isle of Mull", "Jarlsberg",
- "Jermi Tortes", "Jibneh Arabieh", "Jindi Brie", "Jubilee Blue", "Juustoleipa",
- "Kadchgall", "Kaseri", "Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
- "Kikorangi", "King Island Cape Wickham Brie", "King River Gold", "Klosterkaese",
- "Knockalara", "Kugelkase", "L'Aveyronnais", "L'Ecir de l'Aubrac", "La Taupiniere",
- "La Vache Qui Rit", "Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
- "Langres", "Lappi", "Laruns", "Lavistown", "Le Brin", "Le Fium Orbo", "Le Lacandou",
- "Le Roule", "Leafield", "Lebbene", "Leerdammer", "Leicester", "Leyden", "Limburger",
- "Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer", "Little Rydings",
- "Livarot", "Llanboidy", "Llanglofan Farmhouse", "Loch Arthur Farmhouse",
- "Loddiswell Avondale", "Longhorn", "Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam",
- "Macconais", "Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
- "Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses", "Maredsous", "Margotin",
- "Maribo", "Maroilles", "Mascares", "Mascarpone", "Mascarpone (Australian)",
- "Mascarpone Torta", "Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
- "Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)", "Meyer Vintage Gouda",
- "Mihalic Peynir", "Milleens", "Mimolette", "Mine-Gabhar", "Mini Baby Bells", "Mixte",
- "Molbo", "Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
- "Monterey Jack", "Monterey Jack Dry", "Morbier", "Morbier Cru de Montagne",
- "Mothais a la Feuille", "Mozzarella", "Mozzarella (Australian)",
- "Mozzarella di Bufala", "Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
- "Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais", "Neufchatel",
- "Neufchatel (Australian)", "Niolo", "Nokkelost", "Northumberland", "Oaxaca",
- "Olde York", "Olivet au Foin", "Olivet Bleu", "Olivet Cendre",
- "Orkney Extra Mature Cheddar", "Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty",
- "Oszczypek", "Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer", "Panela",
- "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)", "Parmigiano Reggiano",
- "Pas de l'Escalette", "Passendale", "Pasteurized Processed", "Pate de Fromage",
- "Patefine Fort", "Pave d'Affinois", "Pave d'Auge", "Pave de Chirac", "Pave du Berry",
- "Pecorino", "Pecorino in Walnut Leaves", "Pecorino Romano", "Peekskill Pyramid",
- "Pelardon des Cevennes", "Pelardon des Corbieres", "Penamellera", "Penbryn",
- "Pencarreg", "Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
- "Picodon de Chevre", "Picos de Europa", "Piora", "Pithtviers au Foin",
- "Plateau de Herve", "Plymouth Cheese", "Podhalanski", "Poivre d'Ane", "Polkolbin",
- "Pont l'Eveque", "Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
- "Pourly", "Prastost", "Pressato", "Prince-Jean", "Processed Cheddar", "Provolone",
- "Provolone (Australian)", "Pyengana Cheddar", "Pyramide", "Quark",
- "Quark (Australian)", "Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
- "Queso Blanco", "Queso Blanco con Frutas --Pina y Mango", "Queso de Murcia",
- "Queso del Montsec", "Queso del Tietar", "Queso Fresco", "Queso Fresco (Adobera)",
- "Queso Iberico", "Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
- "Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette", "Ragusano", "Raschera",
- "Reblochon", "Red Leicester", "Regal de la Dombes", "Reggianito", "Remedou",
- "Requeson", "Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata", "Ridder",
- "Rigotte", "Rocamadour", "Rollot", "Romano", "Romans Part Dieu", "Roncal", "Roquefort",
- "Roule", "Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu", "Saaland Pfarr",
- "Saanenkaese", "Saga", "Sage Derby", "Sainte Maure", "Saint-Marcellin",
- "Saint-Nectaire", "Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
- "Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza", "Schabzieger", "Schloss",
- "Selles sur Cher", "Selva", "Serat", "Seriously Strong Cheddar", "Serra da Estrela",
- "Sharpam", "Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene", "Smoked Gouda",
- "Somerset Brie", "Sonoma Jack", "Sottocenare al Tartufo", "Soumaintrain",
- "Sourire Lozerien", "Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
- "Stilton", "Stinking Bishop", "String", "Sussex Slipcote", "Sveciaost", "Swaledale",
- "Sweet Style Swiss", "Swiss", "Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
- "Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea", "Testouri",
- "Tete de Moine", "Tetilla", "Texas Goat Cheese", "Tibet", "Tillamook Cheddar",
- "Tilsit", "Timboon Brie", "Toma", "Tomme Brulee", "Tomme d'Abondance",
- "Tomme de Chevre", "Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans", "Tommes",
- "Torta del Casar", "Toscanello", "Touree de L'Aubier", "Tourmalet",
- "Trappe (Veritable)", "Trois Cornes De Vendee", "Tronchon", "Trou du Cru", "Truffe",
- "Tupi", "Turunmaa", "Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
- "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
- "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
- "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
- "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
- "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
- "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"
- };
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/CheeseDao.java b/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/CheeseDao.java
deleted file mode 100644
index ea007c5..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/CheeseDao.java
+++ /dev/null
@@ -1,93 +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 com.example.android.contentprovidersample.data;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.Query;
-import android.arch.persistence.room.Update;
-import android.database.Cursor;
-
-
-/**
- * Data access object for Cheese.
- */
-@Dao
-public interface CheeseDao {
-
- /**
- * Counts the number of cheeses in the table.
- *
- * @return The number of cheeses.
- */
- @Query("SELECT COUNT(*) FROM " + Cheese.TABLE_NAME)
- int count();
-
- /**
- * Inserts a cheese into the table.
- *
- * @param cheese A new cheese.
- * @return The row ID of the newly inserted cheese.
- */
- @Insert
- long insert(Cheese cheese);
-
- /**
- * Inserts multiple cheeses into the database
- *
- * @param cheeses An array of new cheeses.
- * @return The row IDs of the newly inserted cheeses.
- */
- @Insert
- long[] insertAll(Cheese[] cheeses);
-
- /**
- * Select all cheeses.
- *
- * @return A {@link Cursor} of all the cheeses in the table.
- */
- @Query("SELECT * FROM " + Cheese.TABLE_NAME)
- Cursor selectAll();
-
- /**
- * Select a cheese by the ID.
- *
- * @param id The row ID.
- * @return A {@link Cursor} of the selected cheese.
- */
- @Query("SELECT * FROM " + Cheese.TABLE_NAME + " WHERE " + Cheese.COLUMN_ID + " = :id")
- Cursor selectById(long id);
-
- /**
- * Delete a cheese by the ID.
- *
- * @param id The row ID.
- * @return A number of cheeses deleted. This should always be {@code 1}.
- */
- @Query("DELETE FROM " + Cheese.TABLE_NAME + " WHERE " + Cheese.COLUMN_ID + " = :id")
- int deleteById(long id);
-
- /**
- * Update the cheese. The cheese is identified by the row ID.
- *
- * @param cheese The cheese to update.
- * @return A number of cheeses updated. This should always be {@code 1}.
- */
- @Update
- int update(Cheese cheese);
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/SampleDatabase.java b/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/SampleDatabase.java
deleted file mode 100644
index 9f27bf0..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/data/SampleDatabase.java
+++ /dev/null
@@ -1,87 +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 com.example.android.contentprovidersample.data;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.Room;
-import android.arch.persistence.room.RoomDatabase;
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-
-
-/**
- * The Room database.
- */
-@Database(entities = {Cheese.class}, version = 1)
-public abstract class SampleDatabase extends RoomDatabase {
-
- /**
- * @return The DAO for the Cheese table.
- */
- @SuppressWarnings("WeakerAccess")
- public abstract CheeseDao cheese();
-
- /** The only instance */
- private static SampleDatabase sInstance;
-
- /**
- * Gets the singleton instance of SampleDatabase.
- *
- * @param context The context.
- * @return The singleton instance of SampleDatabase.
- */
- public static synchronized SampleDatabase getInstance(Context context) {
- if (sInstance == null) {
- sInstance = Room
- .databaseBuilder(context.getApplicationContext(), SampleDatabase.class, "ex")
- .build();
- sInstance.populateInitialData();
- }
- return sInstance;
- }
-
- /**
- * Switches the internal implementation with an empty in-memory database.
- *
- * @param context The context.
- */
- @VisibleForTesting
- public static void switchToInMemory(Context context) {
- sInstance = Room.inMemoryDatabaseBuilder(context.getApplicationContext(),
- SampleDatabase.class).build();
- }
-
- /**
- * Inserts the dummy data into the database if it is currently empty.
- */
- private void populateInitialData() {
- if (cheese().count() == 0) {
- Cheese cheese = new Cheese();
- beginTransaction();
- try {
- for (int i = 0; i < Cheese.CHEESES.length; i++) {
- cheese.name = Cheese.CHEESES[i];
- cheese().insert(cheese);
- }
- setTransactionSuccessful();
- } finally {
- endTransaction();
- }
- }
- }
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/provider/SampleContentProvider.java b/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/provider/SampleContentProvider.java
deleted file mode 100644
index 00ae751..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/java/com/example/android/contentprovidersample/provider/SampleContentProvider.java
+++ /dev/null
@@ -1,213 +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 com.example.android.contentprovidersample.provider;
-
-import android.content.ContentProvider;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-
-import com.example.android.contentprovidersample.data.Cheese;
-import com.example.android.contentprovidersample.data.CheeseDao;
-import com.example.android.contentprovidersample.data.SampleDatabase;
-
-import java.util.ArrayList;
-
-
-/**
- * A {@link ContentProvider} based on a Room database.
- *
- * <p>Note that you don't need to implement a ContentProvider unless you want to expose the data
- * outside your process or your application already uses a ContentProvider.</p>
- */
-public class SampleContentProvider extends ContentProvider {
-
- /** The authority of this content provider. */
- public static final String AUTHORITY = "com.example.android.contentprovidersample.provider";
-
- /** The URI for the Cheese table. */
- public static final Uri URI_CHEESE = Uri.parse(
- "content://" + AUTHORITY + "/" + Cheese.TABLE_NAME);
-
- /** The match code for some items in the Cheese table. */
- private static final int CODE_CHEESE_DIR = 1;
-
- /** The match code for an item in the Cheese table. */
- private static final int CODE_CHEESE_ITEM = 2;
-
- /** The URI matcher. */
- private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
-
- static {
- MATCHER.addURI(AUTHORITY, Cheese.TABLE_NAME, CODE_CHEESE_DIR);
- MATCHER.addURI(AUTHORITY, Cheese.TABLE_NAME + "/*", CODE_CHEESE_ITEM);
- }
-
- @Override
- public boolean onCreate() {
- return true;
- }
-
- @Nullable
- @Override
- public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
- @Nullable String[] selectionArgs, @Nullable String sortOrder) {
- final int code = MATCHER.match(uri);
- if (code == CODE_CHEESE_DIR || code == CODE_CHEESE_ITEM) {
- final Context context = getContext();
- if (context == null) {
- return null;
- }
- CheeseDao cheese = SampleDatabase.getInstance(context).cheese();
- final Cursor cursor;
- if (code == CODE_CHEESE_DIR) {
- cursor = cheese.selectAll();
- } else {
- cursor = cheese.selectById(ContentUris.parseId(uri));
- }
- cursor.setNotificationUri(context.getContentResolver(), uri);
- return cursor;
- } else {
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
- @Nullable
- @Override
- public String getType(@NonNull Uri uri) {
- switch (MATCHER.match(uri)) {
- case CODE_CHEESE_DIR:
- return "vnd.android.cursor.dir/" + AUTHORITY + "." + Cheese.TABLE_NAME;
- case CODE_CHEESE_ITEM:
- return "vnd.android.cursor.item/" + AUTHORITY + "." + Cheese.TABLE_NAME;
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
- @Nullable
- @Override
- public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
- switch (MATCHER.match(uri)) {
- case CODE_CHEESE_DIR:
- final Context context = getContext();
- if (context == null) {
- return null;
- }
- final long id = SampleDatabase.getInstance(context).cheese()
- .insert(Cheese.fromContentValues(values));
- context.getContentResolver().notifyChange(uri, null);
- return ContentUris.withAppendedId(uri, id);
- case CODE_CHEESE_ITEM:
- throw new IllegalArgumentException("Invalid URI, cannot insert with ID: " + uri);
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
- @Override
- public int delete(@NonNull Uri uri, @Nullable String selection,
- @Nullable String[] selectionArgs) {
- switch (MATCHER.match(uri)) {
- case CODE_CHEESE_DIR:
- throw new IllegalArgumentException("Invalid URI, cannot update without ID" + uri);
- case CODE_CHEESE_ITEM:
- final Context context = getContext();
- if (context == null) {
- return 0;
- }
- final int count = SampleDatabase.getInstance(context).cheese()
- .deleteById(ContentUris.parseId(uri));
- context.getContentResolver().notifyChange(uri, null);
- return count;
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
- @Override
- public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
- @Nullable String[] selectionArgs) {
- switch (MATCHER.match(uri)) {
- case CODE_CHEESE_DIR:
- throw new IllegalArgumentException("Invalid URI, cannot update without ID" + uri);
- case CODE_CHEESE_ITEM:
- final Context context = getContext();
- if (context == null) {
- return 0;
- }
- final Cheese cheese = Cheese.fromContentValues(values);
- cheese.id = ContentUris.parseId(uri);
- final int count = SampleDatabase.getInstance(context).cheese()
- .update(cheese);
- context.getContentResolver().notifyChange(uri, null);
- return count;
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
- @NonNull
- @Override
- public ContentProviderResult[] applyBatch(
- @NonNull ArrayList<ContentProviderOperation> operations)
- throws OperationApplicationException {
- final Context context = getContext();
- if (context == null) {
- return new ContentProviderResult[0];
- }
- final SampleDatabase database = SampleDatabase.getInstance(context);
- database.beginTransaction();
- try {
- final ContentProviderResult[] result = super.applyBatch(operations);
- database.setTransactionSuccessful();
- return result;
- } finally {
- database.endTransaction();
- }
- }
-
- @Override
- public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] valuesArray) {
- switch (MATCHER.match(uri)) {
- case CODE_CHEESE_DIR:
- final Context context = getContext();
- if (context == null) {
- return 0;
- }
- final SampleDatabase database = SampleDatabase.getInstance(context);
- final Cheese[] cheeses = new Cheese[valuesArray.length];
- for (int i = 0; i < valuesArray.length; i++) {
- cheeses[i] = Cheese.fromContentValues(valuesArray[i]);
- }
- return database.cheese().insertAll(cheeses).length;
- case CODE_CHEESE_ITEM:
- throw new IllegalArgumentException("Invalid URI, cannot insert with ID: " + uri);
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
-
-}
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/layout/main_activity.xml b/samples-flatfoot/ContentProviderSample/app/src/main/res/layout/main_activity.xml
deleted file mode 100644
index 24592dd..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/layout/main_activity.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<android.support.v7.widget.RecyclerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipToPadding="false"
- android:paddingBottom="8dp"
- android:paddingTop="8dp"
- android:scrollbars="vertical"
- tools:context="com.example.android.contentprovidersample.MainActivity"/>
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 821d510..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index cbe549e..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index ca02616..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1a7720c..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e12fb7a..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/colors.xml b/samples-flatfoot/ContentProviderSample/app/src/main/res/values/colors.xml
deleted file mode 100644
index e1723942..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,18 +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.
--->
-<resources>
- <color name="primary">#009688</color>
- <color name="primary_dark">#00796B</color>
- <color name="accent">#536DFE</color>
-</resources>
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/strings.xml b/samples-flatfoot/ContentProviderSample/app/src/main/res/values/strings.xml
deleted file mode 100644
index b2e4230..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,16 +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.
--->
-<resources>
- <string name="app_name">ContentProvider Sample</string>
-</resources>
diff --git a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/styles.xml b/samples-flatfoot/ContentProviderSample/app/src/main/res/values/styles.xml
deleted file mode 100644
index 4a858f5..0000000
--- a/samples-flatfoot/ContentProviderSample/app/src/main/res/values/styles.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.
--->
-<resources>
-
- <style name="Theme.ContentProviderSample" parent="Theme.AppCompat.Light.DarkActionBar">
- <item name="colorPrimary">@color/primary</item>
- <item name="colorPrimaryDark">@color/primary_dark</item>
- <item name="colorAccent">@color/accent</item>
- </style>
-
-</resources>
diff --git a/samples-flatfoot/ContentProviderSample/build.gradle b/samples-flatfoot/ContentProviderSample/build.gradle
deleted file mode 100644
index 79c0183..0000000
--- a/samples-flatfoot/ContentProviderSample/build.gradle
+++ /dev/null
@@ -1,41 +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.
- */
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.4.0-alpha6'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- // TODO: Replace this
- maven {
- url "file:///usr/local/google_ssd/android/m2repository"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/samples-flatfoot/ContentProviderSample/gradle.properties b/samples-flatfoot/ContentProviderSample/gradle.properties
deleted file mode 100644
index aac7c9b..0000000
--- a/samples-flatfoot/ContentProviderSample/gradle.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index c6e5060..0000000
--- a/samples-flatfoot/ContentProviderSample/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Apr 21 15:24:08 JST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/samples-flatfoot/ContentProviderSample/gradlew b/samples-flatfoot/ContentProviderSample/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/ContentProviderSample/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/ContentProviderSample/gradlew.bat b/samples-flatfoot/ContentProviderSample/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/ContentProviderSample/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/ContentProviderSample/settings.gradle b/samples-flatfoot/ContentProviderSample/settings.gradle
deleted file mode 100644
index e7b4def..0000000
--- a/samples-flatfoot/ContentProviderSample/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include ':app'
diff --git a/samples-flatfoot/GithubBrowser/.gitignore b/samples-flatfoot/GithubBrowser/.gitignore
deleted file mode 100644
index 39fb081..0000000
--- a/samples-flatfoot/GithubBrowser/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/GithubBrowser/app/.gitignore b/samples-flatfoot/GithubBrowser/app/.gitignore
deleted file mode 100644
index 796b96d..0000000
--- a/samples-flatfoot/GithubBrowser/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
diff --git a/samples-flatfoot/GithubBrowser/app/build.gradle b/samples-flatfoot/GithubBrowser/app/build.gradle
deleted file mode 100644
index b1f12ac..0000000
--- a/samples-flatfoot/GithubBrowser/app/build.gradle
+++ /dev/null
@@ -1,70 +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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId "com.android.sample.githubbrowser"
- minSdkVersion 14
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- javaCompileOptions {
- annotationProcessorOptions {
- arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
- }
- }
- }
- dataBinding {
- enabled = true
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-}
-
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile "com.android.support:percent:$supportLibVersion"
- compile "com.android.support:cardview-v7:$supportLibVersion"
- compile "com.android.support:appcompat-v7:$supportLibVersion"
- compile "com.android.support:design:$supportLibVersion"
- compile 'com.squareup.retrofit2:retrofit:2.1.0'
- compile 'com.squareup.retrofit2:converter-gson:2.1.0'
- compile 'com.github.bumptech.glide:glide:3.7.0'
- compile "com.android.support.room:runtime:$flatfootVersion"
- compile "com.android.support.lifecycle:runtime:$flatfootVersion"
- compile "com.android.support.lifecycle:extensions:$flatfootVersion"
-
- compile "com.google.dagger:dagger:$daggerVersion"
-
- annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
- annotationProcessor "com.android.support.room:compiler:$flatfootVersion"
- annotationProcessor "com.android.support.lifecycle:compiler:$flatfootVersion"
-
- testCompile 'junit:junit:4.12'
-}
diff --git a/samples-flatfoot/GithubBrowser/app/proguard-rules.pro b/samples-flatfoot/GithubBrowser/app/proguard-rules.pro
deleted file mode 100644
index 99e1cd4..0000000
--- a/samples-flatfoot/GithubBrowser/app/proguard-rules.pro
+++ /dev/null
@@ -1,35 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Users/kirillg/Android/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
-# Platform calls Class.forName on types which do not exist on Android to determine platform.
--dontnote retrofit2.Platform
-# Platform used when running on RoboVM on iOS. Will not be used at runtime.
--dontnote retrofit2.Platform$IOS$MainThreadExecutor
-# Platform used when running on Java 8 VMs. Will not be used at runtime.
--dontwarn retrofit2.Platform$Java8
-# Retain generic type information for use by reflection by converters and adapters.
--keepattributes Signature
-# Retain declared checked exceptions for use by a Proxy instance.
--keepattributes Exceptions
-
--keep public class * implements com.bumptech.glide.module.GlideModule
--keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
- **[] $VALUES;
- public *;
-}
--keepresourcexmlelements manifest/application/meta-data@value=GlideModule
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/schemas/com.android.sample.githubbrowser.db.GithubDatabase/1.json b/samples-flatfoot/GithubBrowser/app/schemas/com.android.sample.githubbrowser.db.GithubDatabase/1.json
deleted file mode 100644
index 1409973..0000000
--- a/samples-flatfoot/GithubBrowser/app/schemas/com.android.sample.githubbrowser.db.GithubDatabase/1.json
+++ /dev/null
@@ -1,393 +0,0 @@
-{
- "formatVersion": 1,
- "database": {
- "version": 1,
- "identityHash": "b1b39c866af4b7b44d7ea3c6202c4352",
- "entities": [
- {
- "tableName": "PersonData",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`login` TEXT, `id` TEXT, `avatar_url` TEXT, `repos_url` TEXT, `name` TEXT, `company` TEXT, `blog` TEXT, `location` TEXT, `email` TEXT, `public_repos` INTEGER, `followers` INTEGER, `following` INTEGER, `created_at` TEXT, PRIMARY KEY(`login`))",
- "fields": [
- {
- "fieldPath": "login",
- "columnName": "login",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "id",
- "columnName": "id",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "avatar_url",
- "columnName": "avatar_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "repos_url",
- "columnName": "repos_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "name",
- "columnName": "name",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "company",
- "columnName": "company",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "blog",
- "columnName": "blog",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "location",
- "columnName": "location",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "email",
- "columnName": "email",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "public_repos",
- "columnName": "public_repos",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "followers",
- "columnName": "followers",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "following",
- "columnName": "following",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "created_at",
- "columnName": "created_at",
- "affinity": "TEXT"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "login"
- ],
- "autoGenerate": false
- },
- "indices": []
- },
- {
- "tableName": "SearchQueryData",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`searchQuery` TEXT, `searchKind` INTEGER, `timestamp` INTEGER, `indexOfLastFetchedPage` INTEGER, `numberOfFetchedItems` INTEGER, `hasNoMoreData` INTEGER, PRIMARY KEY(`searchQuery`, `searchKind`))",
- "fields": [
- {
- "fieldPath": "searchQuery",
- "columnName": "searchQuery",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "searchKind",
- "columnName": "searchKind",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "timestamp",
- "columnName": "timestamp",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "indexOfLastFetchedPage",
- "columnName": "indexOfLastFetchedPage",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "numberOfFetchedItems",
- "columnName": "numberOfFetchedItems",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "hasNoMoreData",
- "columnName": "hasNoMoreData",
- "affinity": "INTEGER"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "searchQuery",
- "searchKind"
- ],
- "autoGenerate": false
- },
- "indices": []
- },
- {
- "tableName": "GeneralRepoSearchData",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`searchQuery` TEXT, `resultIndex` INTEGER, `repoId` TEXT, PRIMARY KEY(`searchQuery`, `resultIndex`, `repoId`))",
- "fields": [
- {
- "fieldPath": "searchQuery",
- "columnName": "searchQuery",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "resultIndex",
- "columnName": "resultIndex",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "repoId",
- "columnName": "repoId",
- "affinity": "TEXT"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "searchQuery",
- "resultIndex",
- "repoId"
- ],
- "autoGenerate": false
- },
- "indices": []
- },
- {
- "tableName": "RepositoryData",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT, `name` TEXT, `full_name` TEXT, `description` TEXT, `created_at` TEXT, `stargazers_count` INTEGER, `language` TEXT, `forks_count` INTEGER, `open_issues_count` INTEGER, `subscribers_count` INTEGER, `owner_login` TEXT, `owner_id` TEXT, `owner_avatar_url` TEXT, `owner_repos_url` TEXT, `owner_name` TEXT, `owner_company` TEXT, `owner_blog` TEXT, `owner_location` TEXT, `owner_email` TEXT, `owner_public_repos` INTEGER, `owner_followers` INTEGER, `owner_following` INTEGER, `owner_created_at` TEXT, `organization_login` TEXT, `organization_id` TEXT, `organization_avatar_url` TEXT, `organization_repos_url` TEXT, `organization_name` TEXT, `organization_company` TEXT, `organization_blog` TEXT, `organization_location` TEXT, `organization_email` TEXT, `organization_public_repos` INTEGER, `organization_followers` INTEGER, `organization_following` INTEGER, `organization_created_at` TEXT, PRIMARY KEY(`id`))",
- "fields": [
- {
- "fieldPath": "id",
- "columnName": "id",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "name",
- "columnName": "name",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "full_name",
- "columnName": "full_name",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "description",
- "columnName": "description",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "created_at",
- "columnName": "created_at",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "stargazers_count",
- "columnName": "stargazers_count",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "language",
- "columnName": "language",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "forks_count",
- "columnName": "forks_count",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "open_issues_count",
- "columnName": "open_issues_count",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "subscribers_count",
- "columnName": "subscribers_count",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "owner.login",
- "columnName": "owner_login",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.id",
- "columnName": "owner_id",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.avatar_url",
- "columnName": "owner_avatar_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.repos_url",
- "columnName": "owner_repos_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.name",
- "columnName": "owner_name",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.company",
- "columnName": "owner_company",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.blog",
- "columnName": "owner_blog",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.location",
- "columnName": "owner_location",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.email",
- "columnName": "owner_email",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "owner.public_repos",
- "columnName": "owner_public_repos",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "owner.followers",
- "columnName": "owner_followers",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "owner.following",
- "columnName": "owner_following",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "owner.created_at",
- "columnName": "owner_created_at",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.login",
- "columnName": "organization_login",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.id",
- "columnName": "organization_id",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.avatar_url",
- "columnName": "organization_avatar_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.repos_url",
- "columnName": "organization_repos_url",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.name",
- "columnName": "organization_name",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.company",
- "columnName": "organization_company",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.blog",
- "columnName": "organization_blog",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.location",
- "columnName": "organization_location",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.email",
- "columnName": "organization_email",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "organization.public_repos",
- "columnName": "organization_public_repos",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "organization.followers",
- "columnName": "organization_followers",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "organization.following",
- "columnName": "organization_following",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "organization.created_at",
- "columnName": "organization_created_at",
- "affinity": "TEXT"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "id"
- ],
- "autoGenerate": false
- },
- "indices": []
- },
- {
- "tableName": "ContributorSearchData",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`searchQuery` TEXT, `resultIndex` INTEGER, `contributorId` TEXT, `contributions` INTEGER, PRIMARY KEY(`searchQuery`, `resultIndex`, `contributorId`))",
- "fields": [
- {
- "fieldPath": "searchQuery",
- "columnName": "searchQuery",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "resultIndex",
- "columnName": "resultIndex",
- "affinity": "INTEGER"
- },
- {
- "fieldPath": "contributorId",
- "columnName": "contributorId",
- "affinity": "TEXT"
- },
- {
- "fieldPath": "contributions",
- "columnName": "contributions",
- "affinity": "INTEGER"
- }
- ],
- "primaryKey": {
- "columnNames": [
- "searchQuery",
- "resultIndex",
- "contributorId"
- ],
- "autoGenerate": false
- },
- "indices": []
- }
- ],
- "setupQueries": [
- "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
- "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"b1b39c866af4b7b44d7ea3c6202c4352\")"
- ]
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/AndroidManifest.xml b/samples-flatfoot/GithubBrowser/app/src/main/AndroidManifest.xml
deleted file mode 100644
index b2af65a..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +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 package="com.android.sample.githubbrowser"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <uses-permission android:name="android.permission.INTERNET" />
- <application
- android:name=".GithubBrowserApp"
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity
- android:name="com.android.sample.githubbrowser.MainActivity"
- android:label="@string/app_name"
- android:theme="@style/AppTheme.NoActionBar"
- android:windowSoftInputMode="stateHidden">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
-
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseActivity.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseActivity.java
deleted file mode 100644
index d66258d..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseActivity.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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.support.v7.app.AppCompatActivity;
-
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.support.lifecycle.LifecycleRegistry;
-import com.android.support.lifecycle.LifecycleRegistryProvider;
-
-/**
- * Temporary base activity that acts as lifecycle provider.
- */
-public abstract class BaseActivity extends AppCompatActivity implements LifecycleRegistryProvider,
- InjectableLifecycleProvider {
-
- private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);
-
- @Override
- public LifecycleRegistry getLifecycle() {
- return mRegistry;
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseFragment.java
deleted file mode 100644
index 75c85d8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/BaseFragment.java
+++ /dev/null
@@ -1,38 +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 com.android.sample.githubbrowser;
-
-import android.os.Bundle;
-
-import com.android.sample.githubbrowser.navigation.NavigationController;
-import com.android.support.lifecycle.LifecycleFragment;
-
-/**
- * Base fragment w/ navigation controller access.
- */
-public class BaseFragment extends LifecycleFragment {
- private NavigationController mNavigationController;
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- mNavigationController = ((MainActivity) getActivity()).getNavigationController();
- }
-
- public NavigationController getNavigationController() {
- return mNavigationController;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/EditUserDetailsFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/EditUserDetailsFragment.java
deleted file mode 100644
index 21235e1..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/EditUserDetailsFragment.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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.Fragment;
-import android.support.v7.app.AlertDialog;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-import android.widget.EditText;
-
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.databinding.EditUserDetailsBinding;
-import com.android.sample.githubbrowser.viewmodel.PersonDataModel;
-import com.android.support.lifecycle.LifecycleRegistry;
-import com.android.support.lifecycle.LifecycleRegistryProvider;
-import com.android.support.lifecycle.Observer;
-import com.android.support.lifecycle.ViewModelStore;
-
-/**
- * Edit user details fragment.
- */
-public class EditUserDetailsFragment extends DialogFragment implements LifecycleRegistryProvider {
- private static final String LOGIN = "editUser.login";
- private static final int CODE_EDIT = 1;
-
- private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
- private PersonDataModel mPersonDataModel;
-
- public EditUserDetailsFragment() {
- }
-
- public static EditUserDetailsFragment createFor(Fragment target, PersonData personData) {
- EditUserDetailsFragment editUserDetailsFragment = new EditUserDetailsFragment();
- Bundle editUserDetailsFragmentArgs = new Bundle();
- editUserDetailsFragmentArgs.putString(EditUserDetailsFragment.LOGIN, personData.login);
- editUserDetailsFragment.setArguments(editUserDetailsFragmentArgs);
- editUserDetailsFragment.setTargetFragment(target, CODE_EDIT);
- return editUserDetailsFragment;
- }
-
- @Override
- public LifecycleRegistry getLifecycle() {
- return mLifecycleRegistry;
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final String login = getArguments().getString(LOGIN);
-
- // Configure the dialog to pass the data back when "OK" button is clicked
- AlertDialog.Builder editBuilder = new AlertDialog.Builder(getContext())
- .setTitle("Edit details")
- .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- // Ask the model to update the two fields on the user
- mPersonDataModel.update(login, getCurrentEmail(),
- getCurrentLocation());
- getTargetFragment().onActivityResult(getTargetRequestCode(),
- Activity.RESULT_OK, null);
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- getTargetFragment().onActivityResult(getTargetRequestCode(),
- Activity.RESULT_CANCELED, null);
- }
- });
-
- // Inflate the main editor area and set it as custom view on the dialog
- final LayoutInflater inflater = LayoutInflater.from(getContext());
- final EditUserDetailsBinding binding = DataBindingUtil.inflate(
- inflater, R.layout.edit_user_details, null, false);
- final ViewGroup editor = (ViewGroup) binding.getRoot();
- editBuilder.setView(editor);
- final AlertDialog result = editBuilder.create();
-
- // Get our view model instance and register ourselves to observe change to the
- // user data. When a change is reported, update all UI elements based on the new
- // data.
- mPersonDataModel = ViewModelStore.get(this, login, PersonDataModel.class);
- // Ask the model to load the data for this user. When the data becomes available (either
- // immediately from the previous load or later on when it's fetched from remote API call),
- // we will be notified since this fragment registered itself as an observer on the matching
- // live data object.
- mPersonDataModel.loadData(login, false);
- mPersonDataModel.getPersonData().observe(this, new Observer<PersonData>() {
- @Override
- public void onChanged(@Nullable PersonData personData) {
- if (!isDetached() && (personData != null)) {
- android.util.Log.e("GithubBrowser", "Got data for editing from model");
- getDialog().setTitle(personData.name);
- binding.setUser(personData);
- binding.executePendingBindings();
- }
- }
- });
-
- return result;
- }
-
- private String getCurrentEmail() {
- EditText runtime = (EditText) getDialog().findViewById(R.id.email);
- return runtime.getText().toString();
- }
-
- private String getCurrentLocation() {
- EditText rated = (EditText) getDialog().findViewById(R.id.location);
- return rated.getText().toString();
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GetAuthTokenFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GetAuthTokenFragment.java
deleted file mode 100644
index 6cfbc95..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GetAuthTokenFragment.java
+++ /dev/null
@@ -1,100 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.DialogFragment;
-import android.support.v7.app.AlertDialog;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-import android.widget.EditText;
-
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-import com.android.support.lifecycle.LifecycleRegistry;
-import com.android.support.lifecycle.LifecycleRegistryProvider;
-
-import javax.inject.Inject;
-
-/**
- * UI for getting an auth token for Github API calls.
- */
-public class GetAuthTokenFragment extends DialogFragment implements LifecycleRegistryProvider,
- InjectableLifecycleProvider {
- LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
- @Inject
- AuthTokenModel mAuthTokenModel;
-
- @Override
- public LifecycleRegistry getLifecycle() {
- return mLifecycleRegistry;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- AlertDialog.Builder editBuilder = new AlertDialog.Builder(getContext())
- .setTitle(R.string.auth_token_title)
- .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- mAuthTokenModel.saveToken(getCurrentAuthToken());
- }
- })
- .setNegativeButton(R.string.cancel, null);
-
- LayoutInflater inflater = LayoutInflater.from(getContext());
- ViewGroup editor = (ViewGroup) inflater.inflate(R.layout.get_auth_token, null, false);
- editBuilder.setView(editor);
-
- return editBuilder.create();
- }
-
- private String getCurrentAuthToken() {
- EditText runtime = (EditText) getDialog().findViewById(R.id.token);
- return runtime.getText().toString();
- }
-
- @Override
- public void inject(LifecycleProviderComponent component) {
- component.inject(this);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GithubBrowserApp.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GithubBrowserApp.java
deleted file mode 100644
index 02918fd..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/GithubBrowserApp.java
+++ /dev/null
@@ -1,108 +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 com.android.sample.githubbrowser;
-
-import android.app.Activity;
-import android.app.Application;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentManager;
-
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.sample.githubbrowser.di.AppModule;
-import com.android.sample.githubbrowser.di.DaggerAppComponent;
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.di.LifecycleProviderModule;
-import com.android.support.lifecycle.LifecycleProvider;
-
-public class GithubBrowserApp extends Application {
- AppComponent mAppComponent;
-
- @Override
- public void onCreate() {
- super.onCreate();
- mAppComponent = DaggerAppComponent.builder()
- .appModule(new AppModule(this)).build();
- registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacksAdapter() {
- @Override
- public void onActivityCreated(Activity activity, Bundle bundle) {
- tryInject(mAppComponent, activity);
-
- if (activity instanceof FragmentActivity) {
- ((FragmentActivity) activity).getSupportFragmentManager()
- .registerFragmentLifecycleCallbacks(
- new FragmentManager.FragmentLifecycleCallbacks() {
- @Override
- public void onFragmentPreAttached(FragmentManager fm,
- Fragment f, Context context) {
- tryInject(mAppComponent, f);
- }
- }, true);
- }
- }
- });
- }
-
- public AppComponent getAppComponent() {
- return mAppComponent;
- }
-
- private void tryInject(AppComponent appComponent, Object object) {
- if (object instanceof LifecycleProvider
- && object instanceof InjectableLifecycleProvider) {
- final LifecycleProviderComponent component = appComponent
- .plus(new LifecycleProviderModule((LifecycleProvider) object));
- ((InjectableLifecycleProvider) object).inject(component);
- }
- }
-
- /**
- * Empty activity callback impl.
- */
- private static class ActivityLifecycleCallbacksAdapter implements ActivityLifecycleCallbacks {
- @Override
- public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
- }
-
- @Override
- public void onActivityStarted(Activity activity) {
- }
-
- @Override
- public void onActivityResumed(Activity activity) {
- }
-
- @Override
- public void onActivityPaused(Activity activity) {
- }
-
- @Override
- public void onActivityStopped(Activity activity) {
- }
-
- @Override
- public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
- }
-
- @Override
- public void onActivityDestroyed(Activity activity) {
- }
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/MainActivity.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/MainActivity.java
deleted file mode 100644
index de5b9fe..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/MainActivity.java
+++ /dev/null
@@ -1,168 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.widget.Snackbar;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.EditText;
-
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-import com.android.sample.githubbrowser.navigation.NavigationController;
-import com.android.sample.githubbrowser.viewmodel.RepositorySearchModel;
-import com.android.support.lifecycle.Observer;
-import com.android.support.lifecycle.ViewModelStore;
-
-import javax.inject.Inject;
-
-/**
- * Our main activity.
- */
-public class MainActivity extends BaseActivity {
- private static final String AUTH_TOKEN_FRAGMENT_TAG = "get_auth_token";
- @Inject
- AuthTokenModel mAuthTokenModel;
- private NavigationController mNavigationController;
-
- @Override
- public void inject(LifecycleProviderComponent component) {
- component.inject(this);
- }
-
- @SuppressLint("SetTextI18n")
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mNavigationController = new NavigationController(this, getSupportFragmentManager(),
- R.id.fragment_container);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- final EditText search = (EditText) toolbar.findViewById(R.id.search);
- final RepositorySearchModel mainSearchModel = ViewModelStore.get(this,
- RepositorySearchModel.class);
-
- String currentSearch = search.getText().toString();
- if (TextUtils.isEmpty(currentSearch)) {
- search.setText("google");
- currentSearch = "google";
- }
- mainSearchModel.setQuery(currentSearch, true);
-
- // Check that the activity is using the layout version with
- // the fragment_container FrameLayout
- if (savedInstanceState == null) {
- // Create a new Fragment to be placed in the activity layout
- RepositoryListFragment mainFragment = new RepositoryListFragment();
-
- // Add the fragment to the 'fragment_container' FrameLayout
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, mainFragment, "main").commit();
- }
-
- search.setOnKeyListener(new View.OnKeyListener() {
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if ((event.getAction() == KeyEvent.ACTION_DOWN)
- && (keyCode == KeyEvent.KEYCODE_ENTER)) {
- String query = search.getText().toString();
- Snackbar.make(findViewById(R.id.col), "Searching for " + query,
- Snackbar.LENGTH_SHORT).show();
-
- // Dismiss keyboard
- InputMethodManager imm = (InputMethodManager) getSystemService(
- Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(search.getWindowToken(), 0);
-
- // Pop everything off of the stack except the first entry
- FragmentManager fragmentManager = getSupportFragmentManager();
- while (fragmentManager.getBackStackEntryCount() > 0) {
- fragmentManager.popBackStackImmediate();
- }
-
- // Perform search action on key press
- mainSearchModel.setQuery(query, false);
- return true;
- }
- return false;
- }
- });
-
- mAuthTokenModel.getAuthTokenData().observe(this, new Observer<String>() {
- @Override
- public void onChanged(@Nullable String token) {
- search.setEnabled(token != null);
- // show get auth token fragment
- // Pop everything off of the stack except the first entry
- FragmentManager fragmentManager = getSupportFragmentManager();
- GetAuthTokenFragment getAuthTokenFragment = getGetAuthTokenFragment(
- fragmentManager);
- if (token == null) {
- if (!getAuthTokenFragment.isAdded()) {
- getAuthTokenFragment.show(fragmentManager, AUTH_TOKEN_FRAGMENT_TAG);
- }
- } else {
- if (getAuthTokenFragment.isAdded()) {
- getAuthTokenFragment.dismiss();
- }
- }
- }
- });
- }
-
- @NonNull
- private GetAuthTokenFragment getGetAuthTokenFragment(FragmentManager fragmentManager) {
- Fragment authTokenFragment = fragmentManager
- .findFragmentByTag(AUTH_TOKEN_FRAGMENT_TAG);
- GetAuthTokenFragment getAuthTokenFragment;
- if (authTokenFragment instanceof GetAuthTokenFragment) {
- getAuthTokenFragment = (GetAuthTokenFragment) authTokenFragment;
- } else {
- getAuthTokenFragment = new GetAuthTokenFragment();
- }
- return getAuthTokenFragment;
- }
-
- public NavigationController getNavigationController() {
- return mNavigationController;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryDetailsFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryDetailsFragment.java
deleted file mode 100644
index aad6eed..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryDetailsFragment.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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.sample.githubbrowser.adapter.ContributorListAdapter;
-import com.android.sample.githubbrowser.adapter.LoadMoreCallback;
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.databinding.FragmentRepoDetailsBinding;
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.view.PersonClickCallback;
-import com.android.sample.githubbrowser.viewmodel.ContributorListModel;
-import com.android.sample.githubbrowser.viewmodel.RepositoryDataModel;
-import com.android.support.lifecycle.Observer;
-import com.android.support.lifecycle.ViewModelStore;
-
-import java.util.List;
-
-/**
- * Fragment that shows details of a single repository, including the list of its contributors.
- */
-public class RepositoryDetailsFragment extends BaseFragment implements
- InjectableLifecycleProvider {
- private static final String REPO_ID = "repoDetails.id";
- private static final String REPO_FULL_NAME = "repoDetails.fullName";
- private LifecycleProviderComponent mComponent;
- private FragmentRepoDetailsBinding mBinding;
-
- public RepositoryDetailsFragment() {
- }
-
- public static RepositoryDetailsFragment createFor(RepositoryData repo) {
- RepositoryDetailsFragment fragment = new RepositoryDetailsFragment();
- Bundle detailsFragmentArgs = new Bundle();
- detailsFragmentArgs.putString(RepositoryDetailsFragment.REPO_ID, repo.id);
- detailsFragmentArgs.putString(RepositoryDetailsFragment.REPO_FULL_NAME, repo.full_name);
- fragment.setArguments(detailsFragmentArgs);
- return fragment;
- }
-
- @Override
- public View onCreateView(final LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- mBinding = DataBindingUtil.inflate(
- inflater, R.layout.fragment_repo_details, container, false, mComponent);
- return mBinding.getRoot();
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- RepositoryDataModel repositoryDataModel = ViewModelStore.get(this,
- RepositoryDataModel.class);
- final ContributorListModel contributorListModel = ViewModelStore.get(this,
- ContributorListModel.class);
-
- final String repoId = getArguments().getString(REPO_ID);
- final String repoFullName = getArguments().getString(REPO_FULL_NAME);
- setupRecyclerView(contributorListModel);
- // Ask the model to load the data for this repository. When the data becomes available
- // (either immediately from the previous load or later on when it's fetched from
- // remote API call), we will be notified since this fragment registered itself as an
- // observer on the matching live data object.
- repositoryDataModel.loadData(repoId, repoFullName);
-
- repositoryDataModel.getRepositoryData().observe(this, new Observer<RepositoryData>() {
- @Override
- public void onChanged(@Nullable final RepositoryData repositoryData) {
- if (repositoryData != null) {
- // Bind the data on this fragment
- mBinding.setRepo(repositoryData);
- // TODO decompose this data
- String[] split = repositoryData.full_name.split("/");
- contributorListModel.setSearchTerms(split[0], repositoryData.name);
- } else {
- contributorListModel.setSearchTerms(null, null);
- }
- }
- });
- }
-
- private PersonClickCallback mPersonClickCallback = new PersonClickCallback() {
- @Override
- public void onClick(PersonData person) {
- getNavigationController().openUserDetailsFragment(person);
- }
- };
-
- private void setupRecyclerView(final ContributorListModel contributorListModel) {
- final ContributorListAdapter adapter = new ContributorListAdapter(mComponent,
- mPersonClickCallback,
- new LoadMoreCallback() {
- @Override
- public void loadMore(int currentSize) {
- contributorListModel.fetchAtIndexIfNecessary(currentSize);
- }
- });
- contributorListModel.getContributorListLiveData().observe(this,
- new Observer<List<ContributorData>>() {
- @Override
- public void onChanged(@Nullable List<ContributorData> contributorList) {
- adapter.setData(contributorList);
- }
- });
- mBinding.contributors.setAdapter(adapter);
- }
-
- @Override
- public void inject(LifecycleProviderComponent component) {
- mComponent = component;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryListFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryListFragment.java
deleted file mode 100644
index 049a6d2..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/RepositoryListFragment.java
+++ /dev/null
@@ -1,154 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.sample.githubbrowser.adapter.LoadMoreCallback;
-import com.android.sample.githubbrowser.adapter.RepositoryListAdapter;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.databinding.FragmentRepoListBinding;
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-import com.android.sample.githubbrowser.view.RepoClickCallback;
-import com.android.sample.githubbrowser.viewmodel.RepositoryListModel;
-import com.android.sample.githubbrowser.viewmodel.RepositorySearchModel;
-import com.android.support.lifecycle.LifecycleProvider;
-import com.android.support.lifecycle.Observer;
-import com.android.support.lifecycle.ViewModelStore;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-/**
- * Fragment that shows the list of all repositories that match the current search term.
- */
-public class RepositoryListFragment extends BaseFragment implements
- InjectableLifecycleProvider {
- @Inject
- AuthTokenModel mAuthTokenModel;
- FragmentRepoListBinding mBinding;
- LifecycleProviderComponent mComponent;
-
- @Override
- public void inject(LifecycleProviderComponent component) {
- mComponent = component;
- component.inject(this);
- }
- @Override
- public View onCreateView(final LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- mBinding = DataBindingUtil.inflate(
- inflater, R.layout.fragment_repo_list, container, false);
- return mBinding.getRoot();
- }
-
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final RecyclerView recyclerView = mBinding.repoList;
-
- // Get all the models that are needed for this fragment
-
- // The model for our search query. Note that we are using the activity scope since
- // that is where the search box "lives"
- final RepositorySearchModel mainSearchModel = ViewModelStore.get(
- (LifecycleProvider) getActivity(), RepositorySearchModel.class);
- // The model for the list of repositories that are shown in this fragment.
- final RepositoryListModel repositoryListModel = ViewModelStore.get(
- this, RepositoryListModel.class);
- // The model for auth token.
- final RepositoryListAdapter adapter = new RepositoryListAdapter(mComponent,
- new RepoClickCallback() {
- @Override
- public void onClick(RepositoryData repositoryData) {
- getNavigationController().openRepositoryDetailsFragment(repositoryData);
- }
- },
- new LoadMoreCallback() {
- @Override
- public void loadMore(int currentSize) {
- repositoryListModel.fetchAtIndexIfNecessary(currentSize);
- }
- });
- recyclerView.setAdapter(adapter);
-
- // Wire changes in search query to update the list of repositories
- mainSearchModel.getSearchQueryData().observe(this, new Observer<String>() {
- @Override
- public void onChanged(@Nullable String s) {
- // When the main search query changes, update the list model with that query
- // so that it starts loading new data.
- repositoryListModel.setSearchTerm(s);
- mBinding.setQuery(s);
- }
- });
-
- repositoryListModel.getRepositoryListLiveData().observe(this,
- new Observer<List<RepositoryData>>() {
- @Override
- public void onChanged(@Nullable List<RepositoryData> repoList) {
- adapter.setData(repoList);
- }
- });
-
- repositoryListModel.getStateLiveData().observe(this, new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer state) {
- mBinding.setState(state);
- }
- });
-
- final int columnCount = getContext().getResources().getInteger(R.integer.column_count);
- recyclerView.setLayoutManager(new GridLayoutManager(getContext(), columnCount));
-
- // Wire changes in auth token to continue loading the list of repositories
- mAuthTokenModel.getAuthTokenData().observe(this, new Observer<String>() {
- @Override
- public void onChanged(@Nullable String s) {
- if (!TextUtils.isEmpty(s)) {
- repositoryListModel.resumeLoading();
- }
- }
- });
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/UserDetailsFragment.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/UserDetailsFragment.java
deleted file mode 100644
index fe0acf8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/UserDetailsFragment.java
+++ /dev/null
@@ -1,163 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser;
-
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.GridLayoutManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.sample.githubbrowser.adapter.LoadMoreCallback;
-import com.android.sample.githubbrowser.adapter.RepositoryListAdapter;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.databinding.FragmentUserDetailsBinding;
-import com.android.sample.githubbrowser.di.InjectableLifecycleProvider;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.view.PersonClickCallback;
-import com.android.sample.githubbrowser.view.RepoClickCallback;
-import com.android.sample.githubbrowser.viewmodel.PersonDataModel;
-import com.android.sample.githubbrowser.viewmodel.RepositoryListModel;
-import com.android.support.lifecycle.Observer;
-import com.android.support.lifecycle.ViewModelStore;
-
-import java.util.List;
-
-/**
- * Fragment that shows details of a single user, including the list of their repositories.
- */
-public class UserDetailsFragment extends BaseFragment implements InjectableLifecycleProvider {
- private static final String USER_LOGIN = "userDetails.login";
-
- private String mLogin;
- private PersonDataModel mPersonDataModel;
- private LifecycleProviderComponent mComponent;
-
- public UserDetailsFragment() {
- }
-
- @Override
- public void inject(LifecycleProviderComponent component) {
- mComponent = component;
- }
-
- public static UserDetailsFragment createFor(PersonData person) {
- UserDetailsFragment fragment = new UserDetailsFragment();
- Bundle detailsFragmentArgs = new Bundle();
- detailsFragmentArgs.putString(UserDetailsFragment.USER_LOGIN, person.login);
- fragment.setArguments(detailsFragmentArgs);
- return fragment;
- }
-
- @Override
- public View onCreateView(final LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- final FragmentUserDetailsBinding binding = DataBindingUtil.inflate(
- inflater, R.layout.fragment_user_details, container, false, mComponent);
-
- mLogin = getArguments().getString(USER_LOGIN);
-
- // Get our view model instance and register ourselves to observe change to the
- // full user data. When a change is reported, update all UI elements based on the new
- // data.
- mPersonDataModel = ViewModelStore.get(this, mLogin, PersonDataModel.class);
- // Ask the model to load the data for this user. When the data becomes available (either
- // immediately from the previous load or later on when it's fetched from remote API call),
- // we will be notified since this fragment registered itself as an observer on the matching
- // live data object.
- // Note that the last parameter specifies that we're fine with getting partial data as
- // quickly as possible.
- mPersonDataModel.loadData(mLogin, false);
- binding.setEditCallback(new PersonClickCallback() {
- @Override
- public void onClick(PersonData user) {
- if (user == null) {
- return;
- }
- getNavigationController().openEditUserDetailsFragment(UserDetailsFragment.this,
- user);
- }
- });
- mPersonDataModel.getPersonData().observe(this, new Observer<PersonData>() {
- @Override
- public void onChanged(@Nullable final PersonData personData) {
- if (personData == null) {
- return;
- }
-
- // Populate as much info on this user as we can
- binding.setUser(personData);
- binding.executePendingBindings();
-
- if (!personData.isFullData()) {
- // If we only have partial data, initiate a full load.
- mPersonDataModel.loadData(mLogin, true);
- }
- }
- });
-
- // Load the list of repositories for this user based on the passed login.
- final RepositoryListModel repositoriesListModel = ViewModelStore.get(this,
- RepositoryListModel.class);
- repositoriesListModel.setSearchTerm(mLogin);
-
- final RepositoryListAdapter adapter = new RepositoryListAdapter(mComponent,
- new RepoClickCallback() {
- @Override
- public void onClick(RepositoryData repositoryData) {
- getNavigationController().openRepositoryDetailsFragment(repositoryData);
- }
- },
- new LoadMoreCallback() {
- @Override
- public void loadMore(int currentSize) {
- repositoriesListModel.fetchAtIndexIfNecessary(currentSize);
- }
- });
- binding.repositories.setAdapter(adapter);
- repositoriesListModel.getRepositoryListLiveData().observe(this,
- new Observer<List<RepositoryData>>() {
- @Override
- public void onChanged(@Nullable List<RepositoryData> data) {
- adapter.setData(data);
- }
- });
- final int columnCount = getContext().getResources().getInteger(
- R.integer.column_count);
- binding.repositories.setLayoutManager(new GridLayoutManager(getContext(), columnCount));
-
- return binding.getRoot();
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/ContributorListAdapter.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/ContributorListAdapter.java
deleted file mode 100644
index f8de8c6..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/ContributorListAdapter.java
+++ /dev/null
@@ -1,134 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.adapter;
-
-import android.databinding.DataBindingUtil;
-import android.support.annotation.MainThread;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.util.DiffUtil.DiffResult;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.android.sample.githubbrowser.R;
-import com.android.sample.githubbrowser.adapter.ContributorListAdapter.ContributorBindingHolder;
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.databinding.UserRowBinding;
-import com.android.sample.githubbrowser.di.LifecycleProviderComponent;
-import com.android.sample.githubbrowser.view.PersonClickCallback;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Adapter for the list of contributors.
- */
-public class ContributorListAdapter extends RecyclerView.Adapter<ContributorBindingHolder> {
- /**
- * Holder for the data cell.
- */
- static class ContributorBindingHolder extends RecyclerView.ViewHolder {
- private UserRowBinding mViewDataBinding;
-
- ContributorBindingHolder(UserRowBinding viewDataBinding) {
- super(viewDataBinding.getRoot());
- mViewDataBinding = viewDataBinding;
- }
-
- public UserRowBinding getBinding() {
- return mViewDataBinding;
- }
- }
-
- private List<ContributorData> mCurrList;
- private PersonClickCallback mPersonClickCallback;
- private LoadMoreCallback mLoadMoreCallback;
- private LifecycleProviderComponent mComponent;
-
- public ContributorListAdapter(LifecycleProviderComponent component,
- PersonClickCallback personClickCallback, LoadMoreCallback loadMoreCallback) {
- mComponent = component;
- mPersonClickCallback = personClickCallback;
- mLoadMoreCallback = loadMoreCallback;
- }
-
- @MainThread
- public void setData(final List<ContributorData> newList) {
- if (newList == null) {
- setData(Collections.<ContributorData>emptyList());
- return;
- }
- if (mCurrList == null) {
- mCurrList = newList;
- notifyItemRangeInserted(0, newList.size());
- } else {
- DiffResult result = DiffUtil.calculateDiff(
- new DiffUtilListCallback<ContributorData, String>(mCurrList, newList) {
- @Override
- String getId(ContributorData item) {
- return item.id;
- }
- });
- result.dispatchUpdatesTo(ContributorListAdapter.this);
- mCurrList = newList;
- }
- }
-
- @Override
- public ContributorBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- UserRowBinding binding = DataBindingUtil.inflate(
- LayoutInflater.from(parent.getContext()),
- R.layout.user_row, parent, false, mComponent);
- binding.setCallback(mPersonClickCallback);
- return new ContributorBindingHolder(binding);
- }
-
- @Override
- public void onBindViewHolder(ContributorBindingHolder holder, final int position) {
- final ContributorData data = mCurrList.get(position);
-
- // Use data binding for wiring the data and the click handler
- UserRowBinding binding = holder.getBinding();
- binding.setContributor(data);
- binding.executePendingBindings();
-
- // Do we need to request another page?
- if (position > (mCurrList.size() - 2)) {
- mLoadMoreCallback.loadMore(mCurrList.size());
- }
- }
-
- @Override
- public int getItemCount() {
- return mCurrList == null ? 0 : mCurrList.size();
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/DiffUtilListCallback.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/DiffUtilListCallback.java
deleted file mode 100644
index 4378267..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/DiffUtilListCallback.java
+++ /dev/null
@@ -1,61 +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 com.android.sample.githubbrowser.adapter;
-
-import android.support.v7.util.DiffUtil;
-
-import java.util.List;
-
-/**
- * A DiffUtil callback implementation for lists which use equals for comparison.
- * @param <T>
- * @param <K>
- */
-abstract class DiffUtilListCallback<T, K> extends DiffUtil.Callback {
- private final List<T> mOldList;
- private final List<T> mNewList;
-
- DiffUtilListCallback(List<T> oldList, List<T> newList) {
- mOldList = oldList;
- mNewList = newList;
- }
-
- @Override
- public int getOldListSize() {
- return mOldList.size();
- }
-
- @Override
- public int getNewListSize() {
- return mNewList.size();
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- K oldId = getId(mOldList.get(oldItemPosition));
- K newId = getId(mNewList.get(newItemPosition));
- return oldId.equals(newId);
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldList.get(oldItemPosition).equals(
- mNewList.get(newItemPosition));
- }
-
- abstract K getId(T item);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/LoadMoreCallback.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/LoadMoreCallback.java
deleted file mode 100644
index c1ebb52..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/LoadMoreCallback.java
+++ /dev/null
@@ -1,21 +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 com.android.sample.githubbrowser.adapter;
-
-public interface LoadMoreCallback {
- void loadMore(int currentSize);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/RepositoryListAdapter.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/RepositoryListAdapter.java
deleted file mode 100644
index 9bc23ef..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/adapter/RepositoryListAdapter.java
+++ /dev/null
@@ -1,137 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.adapter;
-
-import android.databinding.DataBindingComponent;
-import android.databinding.DataBindingUtil;
-import android.support.annotation.MainThread;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.util.DiffUtil.DiffResult;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.android.sample.githubbrowser.R;
-import com.android.sample.githubbrowser.adapter.RepositoryListAdapter.RepositoryBindingHolder;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.databinding.RepositoryCardBinding;
-import com.android.sample.githubbrowser.view.RepoClickCallback;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Adapter for a list of repositories.
- */
-public class RepositoryListAdapter extends RecyclerView.Adapter<RepositoryBindingHolder> {
- /**
- * Holder for the data cell.
- */
- static class RepositoryBindingHolder extends RecyclerView.ViewHolder {
- private RepositoryCardBinding mViewDataBinding;
-
- RepositoryBindingHolder(RepositoryCardBinding viewDataBinding) {
- super(viewDataBinding.getRoot());
- mViewDataBinding = viewDataBinding;
- }
-
- public RepositoryCardBinding getBinding() {
- return mViewDataBinding;
- }
- }
-
- private List<RepositoryData> mCurrList;
- private DataBindingComponent mComponent;
- private RepoClickCallback mRepoClickCallback;
- private LoadMoreCallback mLoadMoreCallback;
-
- /**
- * Creates an adapter.
- */
- public RepositoryListAdapter(android.databinding.DataBindingComponent component,
- RepoClickCallback callback, LoadMoreCallback loadMoreCallback) {
- mComponent = component;
- mRepoClickCallback = callback;
- mLoadMoreCallback = loadMoreCallback;
- }
-
- @MainThread
- public void setData(final List<RepositoryData> newList) {
- if (newList == null) {
- setData(Collections.<RepositoryData>emptyList());
- return;
- }
- if (mCurrList == null) {
- mCurrList = newList;
- notifyItemRangeInserted(0, newList.size());
- } else {
- DiffResult result = DiffUtil.calculateDiff(
- new DiffUtilListCallback<RepositoryData, String>(mCurrList, newList) {
- @Override
- String getId(RepositoryData item) {
- return item.id;
- }
- });
- result.dispatchUpdatesTo(RepositoryListAdapter.this);
- mCurrList = newList;
- }
- }
-
- @Override
- public RepositoryBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- RepositoryCardBinding binding = DataBindingUtil.inflate(
- LayoutInflater.from(parent.getContext()),
- R.layout.repository_card, parent, false, mComponent);
- binding.setRepoClickCallback(mRepoClickCallback);
- return new RepositoryBindingHolder(binding);
- }
-
- @Override
- public void onBindViewHolder(RepositoryBindingHolder holder, final int position) {
- final RepositoryData data = mCurrList.get(position);
-
- // Use data binding for wiring the data and the click handler
- RepositoryCardBinding binding = holder.getBinding();
- binding.setRepo(data);
- binding.executePendingBindings();
-
- // Do we need to request another page?
- if (position > (mCurrList.size() - 2)) {
- mLoadMoreCallback.loadMore(mCurrList.size());
- }
- }
-
- @Override
- public int getItemCount() {
- return mCurrList == null ? 0 : mCurrList.size();
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorData.java
deleted file mode 100644
index c170902..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorData.java
+++ /dev/null
@@ -1,64 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import com.android.support.room.Entity;
-
-/**
- * Contributor data object.
- */
-@Entity
-public class ContributorData extends PersonData {
- public int contributions;
-
- public ContributorData() {
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- if (!super.equals(o)) return false;
-
- ContributorData that = (ContributorData) o;
-
- return contributions == that.contributions;
-
- }
-
- @Override
- public int hashCode() {
- int result = super.hashCode();
- result = 31 * result + contributions;
- return result;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorSearchData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorSearchData.java
deleted file mode 100644
index 20bdd3f..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/ContributorSearchData.java
+++ /dev/null
@@ -1,48 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import com.android.support.room.Entity;
-
-/**
- * Contains information on a single locally persisted entry from contributor list.
- */
-@Entity(primaryKeys = {"searchQuery", "resultIndex", "contributorId"})
-public class ContributorSearchData {
- public String searchQuery;
- public int resultIndex;
- public String contributorId;
- public int contributions;
-
- public ContributorSearchData() {
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/GeneralRepoSearchData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/GeneralRepoSearchData.java
deleted file mode 100644
index 1c89cca..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/GeneralRepoSearchData.java
+++ /dev/null
@@ -1,47 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import com.android.support.room.Entity;
-
-/**
- * Contains information on a single locally persisted entry from repo search.
- */
-@Entity(primaryKeys = {"searchQuery", "resultIndex", "repoId"})
-public class GeneralRepoSearchData {
- public String searchQuery;
- public int resultIndex;
- public String repoId;
-
- public GeneralRepoSearchData() {
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/PersonData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/PersonData.java
deleted file mode 100644
index ef37c69..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/PersonData.java
+++ /dev/null
@@ -1,111 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import android.text.TextUtils;
-
-import com.android.support.room.Entity;
-import com.android.support.room.PrimaryKey;
-
-/**
- * Person data object.
- */
-@Entity
-public class PersonData {
- @PrimaryKey public String login;
- public String id;
- public String avatar_url;
- public String repos_url;
- public String name;
- public String company;
- public String blog;
- public String location;
- public String email;
- public int public_repos;
- public int followers;
- public int following;
- public String created_at;
-
- public PersonData() {
- }
-
- public boolean isFullData() {
- return !TextUtils.isEmpty(created_at);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- PersonData that = (PersonData) o;
-
- if (public_repos != that.public_repos) return false;
- if (followers != that.followers) return false;
- if (following != that.following) return false;
- if (login != null ? !login.equals(that.login) : that.login != null) return false;
- if (id != null ? !id.equals(that.id) : that.id != null) return false;
- if (avatar_url != null ? !avatar_url.equals(that.avatar_url) : that.avatar_url != null) {
- return false;
- }
- if (repos_url != null ? !repos_url.equals(that.repos_url) : that.repos_url != null) {
- return false;
- }
- if (name != null ? !name.equals(that.name) : that.name != null) return false;
- if (company != null ? !company.equals(that.company) : that.company != null) return false;
- if (blog != null ? !blog.equals(that.blog) : that.blog != null) return false;
- if (location != null ? !location.equals(that.location) : that.location != null) {
- return false;
- }
- if (email != null ? !email.equals(that.email) : that.email != null) return false;
- return created_at != null ? created_at.equals(that.created_at) : that.created_at == null;
-
- }
-
- @Override
- public int hashCode() {
- int result = login != null ? login.hashCode() : 0;
- result = 31 * result + (id != null ? id.hashCode() : 0);
- result = 31 * result + (avatar_url != null ? avatar_url.hashCode() : 0);
- result = 31 * result + (repos_url != null ? repos_url.hashCode() : 0);
- result = 31 * result + (name != null ? name.hashCode() : 0);
- result = 31 * result + (company != null ? company.hashCode() : 0);
- result = 31 * result + (blog != null ? blog.hashCode() : 0);
- result = 31 * result + (location != null ? location.hashCode() : 0);
- result = 31 * result + (email != null ? email.hashCode() : 0);
- result = 31 * result + public_repos;
- result = 31 * result + followers;
- result = 31 * result + following;
- result = 31 * result + (created_at != null ? created_at.hashCode() : 0);
- return result;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/RepositoryData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/RepositoryData.java
deleted file mode 100644
index 0bb64cc..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/RepositoryData.java
+++ /dev/null
@@ -1,110 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import com.android.support.room.Decompose;
-import com.android.support.room.Entity;
-import com.android.support.room.PrimaryKey;
-import com.android.support.room.RoomWarnings;
-
-/**
- * Repository data object.
- */
-@Entity
-public class RepositoryData {
- @PrimaryKey public String id;
- public String name;
- public String full_name;
- @SuppressWarnings(RoomWarnings.PRIMARY_KEY_FROM_DECOMPOSED_IS_DROPPED)
- @Decompose(prefix = "owner_") public PersonData owner;
- public String description;
- public String created_at;
- public int stargazers_count;
- public String language;
- public int forks_count;
- public int open_issues_count;
- @SuppressWarnings(RoomWarnings.PRIMARY_KEY_FROM_DECOMPOSED_IS_DROPPED)
- @Decompose(prefix = "organization_") public PersonData organization;
- public int subscribers_count;
-
- public RepositoryData() {
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- RepositoryData that = (RepositoryData) o;
-
- if (stargazers_count != that.stargazers_count) return false;
- if (forks_count != that.forks_count) return false;
- if (open_issues_count != that.open_issues_count) return false;
- if (subscribers_count != that.subscribers_count) return false;
- if (id != null ? !id.equals(that.id) : that.id != null) return false;
- if (name != null ? !name.equals(that.name) : that.name != null) return false;
- if (full_name != null ? !full_name.equals(that.full_name) : that.full_name != null) {
- return false;
- }
- if (owner != null ? !owner.equals(that.owner) : that.owner != null) return false;
- if (description != null ? !description.equals(that.description)
- : that.description != null) {
- return false;
- }
- if (created_at != null ? !created_at.equals(that.created_at) : that.created_at != null) {
- return false;
- }
- if (language != null ? !language.equals(that.language) : that.language != null) {
- return false;
- }
- return organization != null ? organization.equals(that.organization)
- : that.organization == null;
-
- }
-
- @Override
- public int hashCode() {
- int result = id != null ? id.hashCode() : 0;
- result = 31 * result + (name != null ? name.hashCode() : 0);
- result = 31 * result + (full_name != null ? full_name.hashCode() : 0);
- result = 31 * result + (owner != null ? owner.hashCode() : 0);
- result = 31 * result + (description != null ? description.hashCode() : 0);
- result = 31 * result + (created_at != null ? created_at.hashCode() : 0);
- result = 31 * result + stargazers_count;
- result = 31 * result + (language != null ? language.hashCode() : 0);
- result = 31 * result + forks_count;
- result = 31 * result + open_issues_count;
- result = 31 * result + (organization != null ? organization.hashCode() : 0);
- result = 31 * result + subscribers_count;
- return result;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/SearchQueryData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/SearchQueryData.java
deleted file mode 100644
index c9d230f..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/data/SearchQueryData.java
+++ /dev/null
@@ -1,53 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.data;
-
-import com.android.support.room.Entity;
-
-/**
- * Contains information about locally persisted data on a single paginable query.
- */
-@Entity(primaryKeys = {"searchQuery", "searchKind"})
-public class SearchQueryData {
- public static final int GENERAL_REPOSITORIES = 0;
- public static final int REPOSITORY_CONTRIBUTORS = 1;
-
- public String searchQuery;
- public int searchKind;
- public long timestamp;
- public int indexOfLastFetchedPage;
- public int numberOfFetchedItems;
- public boolean hasNoMoreData;
-
- public SearchQueryData() {
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/databinding/DataBindingAdapters.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/databinding/DataBindingAdapters.java
deleted file mode 100644
index d70ae64..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/databinding/DataBindingAdapters.java
+++ /dev/null
@@ -1,99 +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 com.android.sample.githubbrowser.databinding;
-
-import android.databinding.BindingAdapter;
-import android.support.annotation.StringRes;
-import android.support.v4.app.Fragment;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.RequestManager;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-public class DataBindingAdapters {
- private static SimpleDateFormat sJsonDateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",
- Locale.ENGLISH);
-
- RequestManager mRequestManager;
- public DataBindingAdapters(RequestManager requestManager) {
- mRequestManager = requestManager;
- }
-
- @SuppressWarnings("WeakerAccess")
- @BindingAdapter({"imageUrl"})
- public void loadImage(ImageView imageView, String url) {
- if (!TextUtils.isEmpty(url)) {
- mRequestManager.load(url).fitCenter().crossFade().into(imageView);
- } else {
- imageView.setImageBitmap(null);
- }
- }
-
- /**
- * Displays formatted date given a JSON-originating date.
- */
- @BindingAdapter("jsonDate")
- public static void formatDate(TextView textView, String jsonDate) {
- if (TextUtils.isEmpty(jsonDate)) {
- return;
- }
- try {
- textView.setText(SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT).format(
- sJsonDateParser.parse(jsonDate)));
- } catch (ParseException pe) {
- // WTF
- }
- }
-
- /**
- * Displays formatted date given a JSON-originating date.
- */
- @BindingAdapter({"stringRes", "jsonDate"})
- public static void formatDateWithString(TextView textView, @StringRes int stringRes,
- String jsonDate) {
- if (TextUtils.isEmpty(jsonDate)) {
- return;
- }
- try {
- Date date = sJsonDateParser.parse(jsonDate);
- String formattedDate = SimpleDateFormat.getDateInstance(
- SimpleDateFormat.SHORT).format(date);
- textView.setText(textView.getResources().getString(stringRes,
- formattedDate));
- } catch (ParseException pe) {
- // WTF
- }
- }
-
- @BindingAdapter("visibleInvisible")
- public static void changeVisiblity(View view, boolean value) {
- view.setVisibility(value ? View.VISIBLE : View.INVISIBLE);
- }
-
- @BindingAdapter("visibleGone")
- public static void showHide(View view, boolean value) {
- view.setVisibility(value ? View.VISIBLE : View.GONE);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDao.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDao.java
deleted file mode 100644
index f4868e6..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDao.java
+++ /dev/null
@@ -1,111 +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 com.android.sample.githubbrowser.db;
-
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.data.ContributorSearchData;
-import com.android.sample.githubbrowser.data.GeneralRepoSearchData;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.data.SearchQueryData;
-import com.android.support.lifecycle.LiveData;
-import com.android.support.room.Dao;
-import com.android.support.room.Insert;
-import com.android.support.room.OnConflictStrategy;
-import com.android.support.room.Query;
-
-import java.util.List;
-
-/**
- * Data access object for github data table.
- */
-@Dao
-public interface GithubDao {
- /**
- * Load full data for a person based on the login.
- */
- @Query("select * from persondata where login = ?")
- LiveData<PersonData> loadPerson(String login);
-
- /**
- * Insert or update full data for a person.
- */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertOrReplacePerson(PersonData personData);
-
- @Query("UPDATE PersonData SET email = :email, location = :location WHERE login = :login")
- void updateUser(String login, String email, String location);
-
- /** Load search data for the specified query. */
- @Query("select * from searchquerydata where searchQuery = :searchQuery"
- + " AND searchKind = :searchKind")
- SearchQueryData getSearchQueryData(String searchQuery, int searchKind);
-
- /** Updates search data. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void update(SearchQueryData searchQueryData);
-
- /** Inserts or updates metadata for results of repository search. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insert(GeneralRepoSearchData[] generalRepoSearchDataArray);
-
- /** Inserts or updates the repository data objects. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insert(RepositoryData[] repoDataArray);
-
- /** Insert or update full data for a repository. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertOrReplaceRepository(RepositoryData repositoryData);
-
- /** Loads full data for a repository. */
- @Query("select * from repositorydata where id = ?")
- LiveData<RepositoryData> loadRepository(String id);
-
- /** Inserts or updates metadata for results of contributor search. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insert(ContributorSearchData[] contributorSearchDataArray);
-
- /** Inserts or updates the person data objects. */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insert(PersonData[] personDataArray);
-
- /**
- * Loads repository results for the specified query.
- */
- @Query("SELECT r.*, MIN(qr.resultIndex) as resultIndex from repositorydata r, "
- + "generalreposearchdata qr, searchquerydata q"
- + " WHERE q.searchQuery = qr.searchQuery"
- + " AND q.searchKind = " + SearchQueryData.GENERAL_REPOSITORIES
- + " AND r.id = qr.repoId"
- + " AND q.searchQuery = ?"
- + " GROUP BY r.id"
- + " ORDER BY resultIndex")
- LiveData<List<RepositoryData>> getRepositories(String searchQuery);
-
- /**
- * Loads contributor results for the specified repository.
- */
- @Query("SELECT p.*, qr.contributions, MIN(qr.resultIndex) as resultIndex from persondata p, "
- + "contributorsearchdata qr, searchquerydata q"
- + " WHERE q.searchQuery = qr.searchQuery"
- + " AND q.searchKind = " + SearchQueryData.REPOSITORY_CONTRIBUTORS
- + " AND p.id = qr.contributorId"
- + " AND q.searchQuery = ?"
- + " GROUP BY p.id"
- + " ORDER BY resultIndex")
- LiveData<List<ContributorData>> getContributors(String repoName);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDatabase.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDatabase.java
deleted file mode 100644
index 91f7fbe..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/db/GithubDatabase.java
+++ /dev/null
@@ -1,37 +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 com.android.sample.githubbrowser.db;
-
-import com.android.sample.githubbrowser.data.ContributorSearchData;
-import com.android.sample.githubbrowser.data.GeneralRepoSearchData;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.data.SearchQueryData;
-import com.android.support.room.Database;
-import com.android.support.room.RoomDatabase;
-
-/**
- * Database for Github entities.
- */
-@Database(version = 1, entities = {PersonData.class, SearchQueryData.class,
- GeneralRepoSearchData.class, RepositoryData.class, ContributorSearchData.class})
-public abstract class GithubDatabase extends RoomDatabase {
- /**
- * Gets the data access object.
- */
- public abstract GithubDao getGithubDao();
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppComponent.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppComponent.java
deleted file mode 100644
index ef7d173..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppComponent.java
+++ /dev/null
@@ -1,39 +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 com.android.sample.githubbrowser.di;
-
-import com.android.sample.githubbrowser.viewmodel.ContributorListModel;
-import com.android.sample.githubbrowser.viewmodel.PersonDataModel;
-import com.android.sample.githubbrowser.viewmodel.RepositoryDataModel;
-import com.android.sample.githubbrowser.viewmodel.RepositoryListModel;
-
-import javax.inject.Singleton;
-
-import dagger.Component;
-
-@Singleton
-@Component(modules = AppModule.class)
-public interface AppComponent {
- LifecycleProviderComponent plus(LifecycleProviderModule lifecycleProviderModule);
- void inject(PersonDataModel personDataModel);
-
- void inject(RepositoryListModel repositoryListModel);
-
- void inject(ContributorListModel contributorListModel);
-
- void inject(RepositoryDataModel repositoryDataModel);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppModule.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppModule.java
deleted file mode 100644
index e3d6a11..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/AppModule.java
+++ /dev/null
@@ -1,62 +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 com.android.sample.githubbrowser.di;
-
-import android.app.Application;
-
-import com.android.sample.githubbrowser.db.GithubDatabase;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-import com.android.sample.githubbrowser.network.GithubNetworkManager;
-import com.android.support.room.Room;
-
-import javax.inject.Singleton;
-
-import dagger.Module;
-import dagger.Provides;
-
-@Module
-public class AppModule {
- private final Application mApplication;
-
- public AppModule(Application application) {
- mApplication = application;
- }
-
- @Singleton
- @Provides
- public GithubNetworkManager provideGithubNetworkManager(AuthTokenModel authTokenModel) {
- return new GithubNetworkManager(authTokenModel);
- }
-
- @Singleton
- @Provides
- public AuthTokenModel provideAuthTokenModel(Application application) {
- return new AuthTokenModel(application);
- }
-
- @Provides
- public Application provideApplication() {
- return mApplication;
- }
-
- @Singleton
- @Provides
- public GithubDatabase provideGithubDatabase(Application application) {
- return Room.databaseBuilder(application, GithubDatabase.class, "github.db")
- .build();
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/InjectableLifecycleProvider.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/InjectableLifecycleProvider.java
deleted file mode 100644
index 5cfd517..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/InjectableLifecycleProvider.java
+++ /dev/null
@@ -1,21 +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 com.android.sample.githubbrowser.di;
-
-public interface InjectableLifecycleProvider {
- void inject(LifecycleProviderComponent component);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderComponent.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderComponent.java
deleted file mode 100644
index de379c8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderComponent.java
+++ /dev/null
@@ -1,36 +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 com.android.sample.githubbrowser.di;
-
-import android.databinding.DataBindingComponent;
-
-import com.android.sample.githubbrowser.GetAuthTokenFragment;
-import com.android.sample.githubbrowser.MainActivity;
-import com.android.sample.githubbrowser.RepositoryListFragment;
-import com.android.sample.githubbrowser.databinding.DataBindingAdapters;
-
-import dagger.Subcomponent;
-
-@LifecycleProviderScope
-@Subcomponent(modules = {LifecycleProviderModule.class})
-public interface LifecycleProviderComponent extends android.databinding.DataBindingComponent {
- void inject(MainActivity mainActivity);
- void inject(GetAuthTokenFragment getAuthTokenFragment);
- void inject(RepositoryListFragment repositoryListFragment);
- @Override
- DataBindingAdapters getDataBindingAdapters();
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderModule.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderModule.java
deleted file mode 100644
index 75b18eb..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderModule.java
+++ /dev/null
@@ -1,92 +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 com.android.sample.githubbrowser.di;
-
-import android.app.Application;
-import android.content.Context;
-
-import com.android.sample.githubbrowser.databinding.DataBindingAdapters;
-import com.android.support.lifecycle.LifecycleObserver;
-import com.android.support.lifecycle.LifecycleProvider;
-import com.android.support.lifecycle.OnLifecycleEvent;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.RequestManager;
-import com.bumptech.glide.manager.Lifecycle;
-import com.bumptech.glide.manager.LifecycleListener;
-import com.bumptech.glide.manager.RequestManagerRetriever;
-import com.bumptech.glide.manager.RequestManagerTreeNode;
-
-import java.util.Collections;
-import java.util.Set;
-
-import javax.inject.Singleton;
-
-import dagger.Module;
-import dagger.Provides;
-
-@Module
-public class LifecycleProviderModule {
- private final LifecycleProvider mLifecycleProvider;
-
- public LifecycleProviderModule(LifecycleProvider lifecycleProvider) {
- mLifecycleProvider = lifecycleProvider;
- }
-
- @Provides
- @Singleton
- public LifecycleProvider provideLifecycleProvider() {
- return mLifecycleProvider;
- }
-
- @Provides
- @LifecycleProviderScope
- public DataBindingAdapters provideAdapters(RequestManager requestManager) {
- return new DataBindingAdapters(requestManager);
- }
-
- @Provides
- @LifecycleProviderScope
- public RequestManager provideGlideRequestManager(Application application) {
- return new RequestManager(application, new Lifecycle() {
- @Override
- public void addListener(final LifecycleListener listener) {
- mLifecycleProvider.getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(com.android.support.lifecycle.Lifecycle.ON_START)
- public void onStart() {
- listener.onStart();
- }
-
- @OnLifecycleEvent(com.android.support.lifecycle.Lifecycle.ON_STOP)
- public void onStop() {
- listener.onStop();
- }
-
- @OnLifecycleEvent(com.android.support.lifecycle.Lifecycle.ON_DESTROY)
- public void onDestroy() {
- listener.onDestroy();
- }
- });
- }
- }, new RequestManagerTreeNode() {
- @Override
- public Set<RequestManager> getDescendants() {
- return Collections.emptySet();
- }
- });
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderScope.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderScope.java
deleted file mode 100644
index 87dbb46..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/di/LifecycleProviderScope.java
+++ /dev/null
@@ -1,27 +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 com.android.sample.githubbrowser.di;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Scope;
-
-@Scope
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LifecycleProviderScope {
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/model/AuthTokenModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/model/AuthTokenModel.java
deleted file mode 100644
index 8b06c33..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/model/AuthTokenModel.java
+++ /dev/null
@@ -1,96 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.model;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.AsyncTask;
-
-import com.android.sample.githubbrowser.BuildConfig;
-import com.android.support.lifecycle.LiveData;
-
-import javax.inject.Singleton;
-
-/**
- * Model for the auth token.
- */
-@Singleton
-public class AuthTokenModel {
- private static final String AUTH_TOKEN_KEY = "auth_token";
-
- private LiveData<String> mAuthToken = new LiveData<>();
- private final SharedPreferences mSharedPreferences;
-
- public AuthTokenModel(Application application) {
- mSharedPreferences = application
- .getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
- loadAsync();
- }
-
- public void saveToken(String token) {
- saveAsync(token);
- mAuthToken.postValue(token);
- }
-
- private void loadAsync() {
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... voids) {
- String token = mSharedPreferences.getString(AUTH_TOKEN_KEY, null);
- mAuthToken.postValue(token);
- return null;
- }
- }.execute();
- }
-
- private void saveAsync(String token) {
- new AsyncTask<String, Void, Void>() {
- @Override
- protected Void doInBackground(String... tokens) {
- mSharedPreferences.edit().putString(AUTH_TOKEN_KEY, tokens[0]).apply();
- return null;
- }
- }.execute(token);
- }
-
- /**
- * Returns the {@link LiveData} object that wraps the auth token.
- */
- public LiveData<String> getAuthTokenData() {
- return mAuthToken;
- }
-
- public void clearToken() {
- saveToken(null);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/navigation/NavigationController.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/navigation/NavigationController.java
deleted file mode 100644
index a4a66ba..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/navigation/NavigationController.java
+++ /dev/null
@@ -1,71 +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 com.android.sample.githubbrowser.navigation;
-
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-
-import com.android.sample.githubbrowser.EditUserDetailsFragment;
-import com.android.sample.githubbrowser.RepositoryDetailsFragment;
-import com.android.sample.githubbrowser.UserDetailsFragment;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.support.lifecycle.Lifecycle;
-import com.android.support.lifecycle.LifecycleProvider;
-
-public class NavigationController {
- private final FragmentManager mFragmentManager;
- private final int mHostViewId;
- private final Lifecycle mLifecycle;
-
- public NavigationController(LifecycleProvider lifecycleProvider,
- FragmentManager fragmentManager, int hostViewId) {
- mLifecycle = lifecycleProvider.getLifecycle();
- mFragmentManager = fragmentManager;
- mHostViewId = hostViewId;
- }
-
- private boolean isActive() {
- return mLifecycle.getCurrentState() >= Lifecycle.STARTED;
- }
-
- public void openRepositoryDetailsFragment(RepositoryData repo) {
- RepositoryDetailsFragment fragment = RepositoryDetailsFragment.createFor(repo);
- FragmentTransaction transaction = mFragmentManager.beginTransaction();
- transaction.add(mHostViewId, fragment, "repoDetails:" + repo.id);
- transaction.addToBackStack("repoDetails:" + repo.id);
- transaction.commitAllowingStateLoss();
- }
-
- public void openUserDetailsFragment(PersonData person) {
- UserDetailsFragment fragment = UserDetailsFragment.createFor(person);
- FragmentTransaction transaction = mFragmentManager.beginTransaction();
- transaction.add(mHostViewId, fragment, "userDetails:" + person.login);
- transaction.addToBackStack("userDetails:" + person.login);
- transaction.commitAllowingStateLoss();
- }
-
- public void openEditUserDetailsFragment(Fragment target, PersonData user) {
- if (!isActive()) {
- return;
- }
- EditUserDetailsFragment editUserDetailsFragment =
- EditUserDetailsFragment.createFor(target, user);
- editUserDetailsFragment.show(mFragmentManager, "editUser:" + user.login);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubNetworkManager.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubNetworkManager.java
deleted file mode 100644
index e95a5e8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubNetworkManager.java
+++ /dev/null
@@ -1,257 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.network;
-
-import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-
-import java.io.IOException;
-import java.util.List;
-
-import javax.inject.Singleton;
-
-import okhttp3.HttpUrl;
-import okhttp3.Interceptor;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import retrofit2.Call;
-import retrofit2.Callback;
-import retrofit2.Response;
-import retrofit2.Retrofit;
-import retrofit2.converter.gson.GsonConverterFactory;
-
-/**
- * This class is responsible for loading data from network.
- */
-@Singleton
-public class GithubNetworkManager {
- private GithubService mGithubService;
- private final AuthTokenModel mAuthTokenModel;
-
- /**
- * Interface that exposes successful / failed calls to the rest of the application.
- *
- * @param <T> Payload data class.
- */
- public interface NetworkCallListener<T> {
- /** Called when network response returned empty data, passing back the HTTP code. */
- void onLoadEmpty(int httpCode);
-
- /** Called when data has been succesfully loaded from the network. */
- void onLoadSuccess(T data);
-
- /** Called when data has failed loading from the network. */
- void onLoadFailure();
- }
-
- /**
- * Interface that exposes the option to cancel an existing network call.
- */
- public interface Cancelable {
- /** Cancel the ongoing network call. */
- void cancel();
- }
-
- private class CancelableCall implements Cancelable {
- @NonNull private Call mCall;
-
- private CancelableCall(@NonNull Call call) {
- mCall = call;
- }
-
- @Override
- public void cancel() {
- mCall.cancel();
- }
- }
-
- public GithubNetworkManager(AuthTokenModel authTokenModel) {
- mAuthTokenModel = authTokenModel;
- OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
- httpClient.addInterceptor(new Interceptor() {
- @Override
- public okhttp3.Response intercept(Chain chain) throws IOException {
- Request original = chain.request();
- HttpUrl originalHttpUrl = original.url();
-
- HttpUrl url = originalHttpUrl.newBuilder()
- .addQueryParameter("access_token",
- mAuthTokenModel.getAuthTokenData().getValue())
- .build();
- Request.Builder requestBuilder = original.newBuilder().url(url);
-
- Request request = requestBuilder.build();
- return chain.proceed(request);
- }
- });
-
- httpClient.addInterceptor(new Interceptor() {
- @Override
- public okhttp3.Response intercept(Chain chain) throws IOException {
- Request request = chain.request();
- okhttp3.Response response = chain.proceed(request);
- if (response.code() == 401 || response.code() == 403) {
- mAuthTokenModel.clearToken();
- }
- return response;
- }
- });
-
-
- Retrofit retrofit = new Retrofit.Builder()
- .baseUrl("https://api.github.com")
- .addConverterFactory(GsonConverterFactory.create())
- .client(httpClient.build())
- .build();
-
- mGithubService = retrofit.create(GithubService.class);
- }
-
- /**
- * Fetches the specified page of repositories.
- */
- @MainThread
- public CancelableCall listRepositories(String user, int pageIndex,
- final NetworkCallListener<List<RepositoryData>> networkCallListener) {
- Call<List<RepositoryData>> listRepositoriesCall = mGithubService.listRepositories(
- user, pageIndex);
- listRepositoriesCall.enqueue(new Callback<List<RepositoryData>>() {
- @Override
- public void onResponse(Call<List<RepositoryData>> call,
- Response<List<RepositoryData>> response) {
- List<RepositoryData> body = response.body();
- if (body == null) {
- networkCallListener.onLoadEmpty(response.code());
- } else {
- networkCallListener.onLoadSuccess(body);
- }
- }
-
- @Override
- public void onFailure(Call<List<RepositoryData>> call, Throwable t) {
- android.util.Log.e("GithubBrowser", "Call = " + call.toString(), t);
- networkCallListener.onLoadFailure();
- }
- });
- return new CancelableCall(listRepositoriesCall);
- }
-
- /**
- * Fetches the details of the specified repository.
- */
- @MainThread
- public CancelableCall getRepository(String user, String name,
- final NetworkCallListener<RepositoryData> networkCallListener) {
- Call<RepositoryData> getRepositoryCall = mGithubService.getRepository(user, name);
- getRepositoryCall.enqueue(new Callback<RepositoryData>() {
- @Override
- public void onResponse(Call<RepositoryData> call,
- Response<RepositoryData> response) {
- RepositoryData body = response.body();
- if (body == null) {
- networkCallListener.onLoadEmpty(response.code());
- } else {
- networkCallListener.onLoadSuccess(body);
- }
- }
-
- @Override
- public void onFailure(Call<RepositoryData> call, Throwable t) {
- android.util.Log.e("GithubBrowser", "Call = " + call.toString(), t);
- networkCallListener.onLoadFailure();
- }
- });
- return new CancelableCall(getRepositoryCall);
- }
-
- /**
- * Fetches the specified page of contributors.
- */
- @MainThread
- public CancelableCall getContributors(String owner, String project, int page,
- final NetworkCallListener<List<ContributorData>> networkCallListener) {
- Call<List<ContributorData>> getContributorsCall = mGithubService.getContributors(
- owner, project, page);
- getContributorsCall.enqueue(new Callback<List<ContributorData>>() {
- @Override
- public void onResponse(Call<List<ContributorData>> call,
- Response<List<ContributorData>> response) {
- List<ContributorData> body = response.body();
- if (body == null) {
- networkCallListener.onLoadEmpty(response.code());
- } else {
- networkCallListener.onLoadSuccess(body);
- }
- }
-
- @Override
- public void onFailure(Call<List<ContributorData>> call, Throwable t) {
- android.util.Log.e("GithubBrowser", "Call = " + call.toString(), t);
- networkCallListener.onLoadFailure();
- }
- });
- return new CancelableCall(getContributorsCall);
- }
-
- /**
- * Fetches the details of the specified user.
- */
- @MainThread
- public CancelableCall getUser(String user,
- final NetworkCallListener<PersonData> networkCallListener) {
- Call<PersonData> getUserCall = mGithubService.getUser(user);
- getUserCall.enqueue(new Callback<PersonData>() {
- @Override
- public void onResponse(Call<PersonData> call,
- Response<PersonData> response) {
- PersonData body = response.body();
- if (body == null) {
- networkCallListener.onLoadEmpty(response.code());
- } else {
- networkCallListener.onLoadSuccess(body);
- }
- }
-
- @Override
- public void onFailure(Call<PersonData> call, Throwable t) {
- android.util.Log.e("GithubBrowser", "Call = " + call.toString(), t);
- networkCallListener.onLoadFailure();
- }
- });
- return new CancelableCall(getUserCall);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubService.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubService.java
deleted file mode 100644
index c26c11e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/network/GithubService.java
+++ /dev/null
@@ -1,73 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.network;
-
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-
-import java.util.List;
-
-import retrofit2.Call;
-import retrofit2.http.GET;
-import retrofit2.http.Path;
-import retrofit2.http.Query;
-
-/**
- * Retrofit-powered service to connect to Github backend.
- */
-public interface GithubService {
- /**
- * Lists the repositories for the specified user.
- */
- @GET("/users/{user}/repos")
- Call<List<RepositoryData>> listRepositories(@Path("user") String user, @Query("page") int page);
-
- /**
- * Gets the information about the specified repository.
- */
- @GET("/repos/{user}/{name}")
- Call<RepositoryData> getRepository(@Path("user") String user, @Path("name") String name);
-
- /**
- * Lists the contributors for the specified project owned by the specified user.
- */
- @GET("/repos/{user}/{project}/contributors")
- Call<List<ContributorData>> getContributors(@Path("user") String owner,
- @Path("project") String project, @Query("page") int page);
-
- /**
- * Gets the information about the specified user.
- */
- @GET("/users/{user}")
- Call<PersonData> getUser(@Path("user") String user);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/util/ChainedLiveData.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/util/ChainedLiveData.java
deleted file mode 100644
index edba758..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/util/ChainedLiveData.java
+++ /dev/null
@@ -1,73 +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 com.android.sample.githubbrowser.util;
-
-import android.support.annotation.Nullable;
-
-import com.android.support.lifecycle.LiveData;
-import com.android.support.lifecycle.Observer;
-
-/**
- * A live data that can be backed by another live data and this backing live data can be swapped.
- * It automatically starts / stops observing on the backing live data as this LiveData's observers
- * and active state changes.
- * <p>
- * This is useful when we want to use a LiveData in a model that arrives from another provider. We
- * don't want the UI to care about this nor we want to leak previous LiveData instances.
- * @param <T>
- */
-public class ChainedLiveData<T> extends LiveData<T> {
- private final Observer<T> mObserver = new Observer<T>() {
- @Override
- public void onChanged(@Nullable T t) {
- setValue(t);
- }
- };
-
- @Nullable
- private LiveData<T> mBackingLiveData;
-
- public void setBackingLiveData(@Nullable LiveData<T> backingLiveData) {
- if (mBackingLiveData != null) {
- mBackingLiveData.removeObserver(mObserver);
- }
- mBackingLiveData = backingLiveData;
- if (backingLiveData == null) {
- setValue(null);
- } else {
- if (getActiveObserverCount() > 0) {
- backingLiveData.observeForever(mObserver);
- } else {
- setValue(backingLiveData.getValue());
- }
- }
- }
-
- @Override
- protected void onActive() {
- if (mBackingLiveData != null) {
- mBackingLiveData.observeForever(mObserver);
- }
- }
-
- @Override
- protected void onInactive() {
- if (mBackingLiveData != null) {
- mBackingLiveData.removeObserver(mObserver);
- }
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/PersonClickCallback.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/PersonClickCallback.java
deleted file mode 100644
index 189c6cc..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/PersonClickCallback.java
+++ /dev/null
@@ -1,23 +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 com.android.sample.githubbrowser.view;
-
-import com.android.sample.githubbrowser.data.PersonData;
-
-public interface PersonClickCallback {
- void onClick(PersonData user);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/RepoClickCallback.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/RepoClickCallback.java
deleted file mode 100644
index 4f6658b..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/view/RepoClickCallback.java
+++ /dev/null
@@ -1,23 +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 com.android.sample.githubbrowser.view;
-
-import com.android.sample.githubbrowser.data.RepositoryData;
-
-public interface RepoClickCallback {
- void onClick(RepositoryData repositoryData);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/ContributorListModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/ContributorListModel.java
deleted file mode 100644
index 7facc31..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/ContributorListModel.java
+++ /dev/null
@@ -1,252 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.viewmodel;
-
-import android.os.AsyncTask;
-import android.support.annotation.MainThread;
-import android.support.annotation.WorkerThread;
-
-import com.android.sample.githubbrowser.data.ContributorData;
-import com.android.sample.githubbrowser.data.ContributorSearchData;
-import com.android.sample.githubbrowser.data.SearchQueryData;
-import com.android.sample.githubbrowser.db.GithubDao;
-import com.android.sample.githubbrowser.db.GithubDatabase;
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.sample.githubbrowser.network.GithubNetworkManager;
-import com.android.sample.githubbrowser.util.ChainedLiveData;
-import com.android.support.lifecycle.LiveData;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.inject.Inject;
-
-/**
- * View model for contributor list data.
- */
-public class ContributorListModel extends InjectableViewModel {
- private String mOwner;
- private String mProject;
-
- private final ChainedLiveData<List<ContributorData>> mContributorListLiveData
- = new ChainedLiveData<>();
- private AtomicBoolean mHasNetworkRequestPending = new AtomicBoolean(false);
- private GithubNetworkManager.Cancelable mCurrentNetworkCall;
-
- private SearchQueryData mSearchQueryData;
- private AtomicInteger mLastRequestedIndex = new AtomicInteger(0);
-
- @Inject
- GithubNetworkManager mGithubNetworkManager;
- @Inject
- GithubDatabase mDatabase;
-
- @Override
- void inject(AppComponent appComponent) {
- appComponent.inject(this);
- }
-
- /**
- * Sets new search terms.
- */
- @MainThread
- public void setSearchTerms(String owner, String project) {
- mOwner = owner;
- mProject = project;
-
- if (mCurrentNetworkCall != null) {
- mCurrentNetworkCall.cancel();
- }
- if (mOwner == null || mProject == null) {
- mContributorListLiveData.setBackingLiveData(null);
- return;
- }
-
- final GithubDao githubDao = mDatabase.getGithubDao();
-
- // Get the LiveData wrapper around the list of contributors that match our current
- // search query. The wrapped list will be updated on every successful network request
- // that is performed for data that is not available in our database.
- mContributorListLiveData
- .setBackingLiveData(githubDao.getContributors(mOwner + "/" + mProject));
-
- mHasNetworkRequestPending.set(false);
-
- new AsyncTask<String, Void, Void>() {
- @Override
- protected Void doInBackground(String... params) {
- // Get data about locally persisted results of our current search query. Note that
- // since this is working with a disk-based database, we're running off the main
- // thread.
- mSearchQueryData = githubDao.getSearchQueryData(
- params[0], SearchQueryData.REPOSITORY_CONTRIBUTORS);
- if (mSearchQueryData == null) {
- // This query has not been performed before - initialize an entry in the
- // database. TODO - consult the timestamp of network requests for staleness.
- mSearchQueryData = new SearchQueryData();
- mSearchQueryData.searchQuery = params[0];
- mSearchQueryData.searchKind = SearchQueryData.REPOSITORY_CONTRIBUTORS;
- mSearchQueryData.numberOfFetchedItems = -1;
- githubDao.update(mSearchQueryData);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void aVoid) {
- fetchNextPage();
- }
- }.execute(mOwner + "/" + mProject);
- }
-
- private void fetchNextPage() {
- if (mSearchQueryData == null) {
- // Not ready to fetch yet.
- return;
- }
-
- // Do we have data in the database?
- if (mSearchQueryData.numberOfFetchedItems >= mLastRequestedIndex.get()) {
- // We already have the data stored (and retrieved) from database.
- return;
- }
-
- if (mHasNetworkRequestPending.get() || mSearchQueryData.hasNoMoreData) {
- // Previous request still processing or no more results
- return;
- }
-
- mHasNetworkRequestPending.set(true);
- mCurrentNetworkCall = mGithubNetworkManager.getContributors(
- mOwner, mProject, mSearchQueryData.indexOfLastFetchedPage + 1,
- new GithubNetworkManager.NetworkCallListener<List<ContributorData>>() {
- @Override
- public void onLoadEmpty(int httpCode) {
- }
-
- @Override
- public void onLoadSuccess(List<ContributorData> data) {
- new AsyncTask<ContributorData, Void, Void>() {
- @Override
- protected Void doInBackground(ContributorData... params) {
- // Note that since we're going to be inserting data into disk-based
- // database, we need to be running off the main thread.
- processNewPageOfData(params);
- return null;
- }
- }.execute(data.toArray(new ContributorData[data.size()]));
- }
-
- @Override
- public void onLoadFailure() {
- }
- });
- }
-
- @WorkerThread
- private void processNewPageOfData(ContributorData... data) {
- try {
- mDatabase.beginTransaction();
- int newDataCount = data.length;
-
- final GithubDao githubDao = mDatabase.getGithubDao();
- final int indexOfFirstData = mSearchQueryData.numberOfFetchedItems;
- // Update the metadata about our current search query (in the database)
- if (newDataCount == 0) {
- mSearchQueryData.hasNoMoreData = true;
- } else {
- if (mSearchQueryData.indexOfLastFetchedPage == 0) {
- mSearchQueryData.timestamp = System.currentTimeMillis();
- }
- mSearchQueryData.indexOfLastFetchedPage++;
- mSearchQueryData.numberOfFetchedItems += newDataCount;
- }
- githubDao.update(mSearchQueryData);
-
- if (newDataCount > 0) {
- // Insert entries for the newly loaded contributors in two places:
- // 1. The table that stores contributor IDs that match a specific query.
- // 2. The table that stores full data on each individual contributor.
- // This way we don't store multiple full entries for the same contributor
- // that happens to match two or more search queries.
- ContributorSearchData[] contributorSearchDataArray =
- new ContributorSearchData[newDataCount];
- for (int i = 0; i < newDataCount; i++) {
- contributorSearchDataArray[i] = new ContributorSearchData();
- contributorSearchDataArray[i].searchQuery = mOwner + "/" + mProject;
- contributorSearchDataArray[i].resultIndex = indexOfFirstData + i;
- contributorSearchDataArray[i].contributorId = data[i].id;
- contributorSearchDataArray[i].contributions = data[i].contributions;
- }
- githubDao.insert(contributorSearchDataArray);
- githubDao.insert(data);
- }
- mDatabase.setTransactionSuccessful();
- } finally {
- mDatabase.endTransaction();
- }
-
- mHasNetworkRequestPending.set(false);
- }
-
- /**
- * Fetches data at specified index if data does not exist yet.
- */
- public void fetchAtIndexIfNecessary(int index) {
- if (mSearchQueryData == null) {
- // If we're here, we've been asked to start fetching items before we've retrieved
- // the top-level metadata for our search. Save the requested index and return. Once
- // that metadata is fetched off the main thread in the AsyncTask executed in
- // setSearchTerms, we'll call fetchNextPage().
- mLastRequestedIndex.set(index);
- return;
- }
-
- if (mHasNetworkRequestPending.get() || mSearchQueryData.hasNoMoreData) {
- // Previous request still processing or no more results
- return;
- }
-
- mLastRequestedIndex.set(index);
-
- fetchNextPage();
- }
-
- /**
- * Returns the {@link LiveData} object that wraps the current list of contributors that matches
- * the last set search terms.
- */
- public LiveData<List<ContributorData>> getContributorListLiveData() {
- return mContributorListLiveData;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/InjectableViewModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/InjectableViewModel.java
deleted file mode 100644
index 1598448..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/InjectableViewModel.java
+++ /dev/null
@@ -1,29 +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 com.android.sample.githubbrowser.viewmodel;
-
-import com.android.sample.githubbrowser.GithubBrowserApp;
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.support.lifecycle.ViewModel;
-
-public abstract class InjectableViewModel extends ViewModel {
- public InjectableViewModel() {
- inject(((GithubBrowserApp) getApplication()).getAppComponent());
- }
-
- abstract void inject(AppComponent appComponent);
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/PersonDataModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/PersonDataModel.java
deleted file mode 100644
index fda04f2..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/PersonDataModel.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.
- */
-
-/*
- * 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.android.sample.githubbrowser.viewmodel;
-
-import android.os.AsyncTask;
-import android.support.annotation.MainThread;
-
-import com.android.sample.githubbrowser.data.PersonData;
-import com.android.sample.githubbrowser.db.GithubDatabase;
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.sample.githubbrowser.network.GithubNetworkManager;
-import com.android.sample.githubbrowser.network.GithubNetworkManager.NetworkCallListener;
-import com.android.sample.githubbrowser.util.ChainedLiveData;
-import com.android.support.lifecycle.LiveData;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.inject.Inject;
-
-/**
- * View model for the full person data.
- */
-public class PersonDataModel extends InjectableViewModel {
- private AtomicBoolean mHasNetworkRequestPending = new AtomicBoolean(false);
- private final ChainedLiveData<PersonData> mPersonData = new ChainedLiveData<>();
-
- @Inject
- GithubNetworkManager mGithubNetworkManager;
- @Inject
- GithubDatabase mDatabase;
-
- @Override
- public void inject(AppComponent appComponent) {
- appComponent.inject(this);
- }
-
- /**
- * Returns the {@LiveData} object that wraps the full person data.
- */
- public LiveData<PersonData> getPersonData() {
- return mPersonData;
- }
-
- /**
- * Sets the login for fetching the full person data.
- */
- @MainThread
- public synchronized void loadData(final String login, final boolean forceFullLoad) {
- // Note that the usage of this view model class guarantees that we're always calling
- // with the same login. So checking the value of fetching field is enough to prevent
- // multiple concurrent remote / local DB fetches.
- boolean isFetching = mHasNetworkRequestPending.get();
- boolean havePersonDataAlready = mPersonData.getValue() != null
- && (!forceFullLoad || mPersonData.getValue().isFullData());
- if (isFetching || havePersonDataAlready) {
- // We are either fetching the data or have the data already
- return;
- }
- mPersonData.setBackingLiveData(mDatabase.getGithubDao().loadPerson(login));
- if (mPersonData.getValue() == null || forceFullLoad) {
- // Issue the network request to bring in the data
- mHasNetworkRequestPending.set(true);
-
- mGithubNetworkManager.getUser(login,
- new NetworkCallListener<PersonData>() {
- @Override
- public void onLoadEmpty(int httpCode) {
- mHasNetworkRequestPending.set(false);
- }
-
- @Override
- public void onLoadSuccess(PersonData data) {
- onDataLoadedFromNetwork(data);
- }
-
- @Override
- public void onLoadFailure() {
- mHasNetworkRequestPending.set(false);
- }
- });
- }
- }
-
- @MainThread
- private void onDataLoadedFromNetwork(PersonData data) {
- mHasNetworkRequestPending.set(false);
-
- // Wrap a DB insert call with another AsyncTask. Otherwise we'd
- // be doing a disk IO operation on the UI thread.
- new AsyncTask<PersonData, Void, Void>() {
- @Override
- protected Void doInBackground(PersonData... params) {
- mDatabase.getGithubDao().insertOrReplacePerson(params[0]);
- return null;
- }
- }.execute(data);
- }
-
- /**
- * Updates the data wrapped by this model.
- */
- @MainThread
- public void update(final String login, final String email, final String location) {
- // Create a copy of the currently wrapped data
- // Update the relevant fields
- // And update the entry for this person in our database so that it's reflected
- // in the UI the next time it's fetched and displayed
- // Wrap a DB update call with an AsyncTask. Otherwise we'd be doing a disk IO operation on
- // the UI thread.
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- mDatabase.getGithubDao().updateUser(login, email, location);
- return null;
- }
- }.execute();
-
- // Note - this is where you would also issue a network request to update user data
- // on the remote backend.
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryDataModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryDataModel.java
deleted file mode 100644
index 8f659ad..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryDataModel.java
+++ /dev/null
@@ -1,130 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.viewmodel;
-
-import android.os.AsyncTask;
-import android.support.annotation.MainThread;
-
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.db.GithubDatabase;
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.sample.githubbrowser.network.GithubNetworkManager;
-import com.android.sample.githubbrowser.util.ChainedLiveData;
-import com.android.support.lifecycle.LiveData;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.inject.Inject;
-
-/**
- * View model for the full repository data.
- */
-public class RepositoryDataModel extends InjectableViewModel {
- private AtomicBoolean mHasNetworkRequestPending = new AtomicBoolean(false);
- private final ChainedLiveData<RepositoryData> mRepositoryData = new ChainedLiveData<>();
- @Inject
- GithubNetworkManager mGithubNetworkManager;
- @Inject
- GithubDatabase mDatabase;
-
- @Override
- void inject(AppComponent appComponent) {
- appComponent.inject(this);
- }
-
- /**
- * Returns the {@link LiveData} object that wraps the full repository data.
- */
- public LiveData<RepositoryData> getRepositoryData() {
- return mRepositoryData;
- }
-
- /**
- * Sets the information for fetching the full repository data.
- */
- @MainThread
- public synchronized void loadData(final String id, final String fullName) {
- // Note that the usage of this view model class guarantees that we're always calling
- // with the same info. So checking the value of fetching field is enough to prevent
- // multiple concurrent remote / local DB fetches.
- boolean isFetching = mHasNetworkRequestPending.get();
- boolean haveRepoDataAlready = (mRepositoryData != null)
- && (mRepositoryData.getValue() != null);
- if (isFetching || haveRepoDataAlready) {
- // We are either fetching the data or have the data already
- return;
- }
-
- mRepositoryData.setBackingLiveData(mDatabase.getGithubDao().loadRepository(id));
- if (mRepositoryData.getValue() == null) {
- // Issue the network request to bring in the data
- mHasNetworkRequestPending.set(true);
-
- // TODO - this is temporary until Room persists non-primitive fields. Until
- // then we split full name into user and name manually
- String[] split = fullName.split("/");
- mGithubNetworkManager.getRepository(split[0], split[1],
- new GithubNetworkManager.NetworkCallListener<RepositoryData>() {
- @Override
- public void onLoadEmpty(int httpCode) {
- mHasNetworkRequestPending.set(false);
- }
-
- @Override
- public void onLoadSuccess(RepositoryData data) {
- onDataLoadedFromNetwork(data, mDatabase);
- }
-
- @Override
- public void onLoadFailure() {
- mHasNetworkRequestPending.set(false);
- }
- });
- }
- }
-
- @MainThread
- private void onDataLoadedFromNetwork(RepositoryData data, final GithubDatabase db) {
- mRepositoryData.setValue(data);
- mHasNetworkRequestPending.set(false);
-
- // Wrap a DB insert call with another AsyncTask. Otherwise we'd
- // be doing a disk IO operation on the UI thread.
- new AsyncTask<RepositoryData, Void, Void>() {
- @Override
- protected Void doInBackground(RepositoryData... params) {
- db.getGithubDao().insertOrReplaceRepository(params[0]);
- return null;
- }
- }.execute(data);
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryListModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryListModel.java
deleted file mode 100644
index 6a158df..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositoryListModel.java
+++ /dev/null
@@ -1,302 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.viewmodel;
-
-import android.os.AsyncTask;
-import android.support.annotation.MainThread;
-import android.support.annotation.WorkerThread;
-import android.text.TextUtils;
-
-import com.android.sample.githubbrowser.data.GeneralRepoSearchData;
-import com.android.sample.githubbrowser.data.RepositoryData;
-import com.android.sample.githubbrowser.data.SearchQueryData;
-import com.android.sample.githubbrowser.db.GithubDao;
-import com.android.sample.githubbrowser.db.GithubDatabase;
-import com.android.sample.githubbrowser.di.AppComponent;
-import com.android.sample.githubbrowser.model.AuthTokenModel;
-import com.android.sample.githubbrowser.network.GithubNetworkManager;
-import com.android.sample.githubbrowser.util.ChainedLiveData;
-import com.android.sample.githubbrowser.viewmodel.InjectableViewModel;
-import com.android.support.lifecycle.LiveData;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.inject.Inject;
-
-/**
- * View model for repository list data.
- */
-public class RepositoryListModel extends InjectableViewModel {
- /** Constant for the initial loading state. */
- public static final int STATE_INITIAL_LOADING = 0;
- /** Constant for the empty / no data state. */
- public static final int STATE_EMPTY = 1;
- /** Constant for the data state. */
- public static final int STATE_DATA = 2;
- /** Constant for the error state. */
- public static final int STATE_ERROR = 3;
-
- private String mSearchTerm;
-
- private final ChainedLiveData<List<RepositoryData>> mRepositoryListLiveData
- = new ChainedLiveData<>();
- private final LiveData<Integer> mStateLiveData = new LiveData<>();
- private AtomicBoolean mHasNetworkRequestPending = new AtomicBoolean(false);
- private GithubNetworkManager.Cancelable mCurrentNetworkCall;
-
- private SearchQueryData mSearchQueryData;
- private AtomicInteger mLastRequestedIndex = new AtomicInteger(0);
-
- @Inject
- GithubNetworkManager mGithubNetworkManager;
- @Inject
- GithubDatabase mDatabase;
- @Inject
- AuthTokenModel mAuthTokenModel;
-
- @Override
- void inject(AppComponent appComponent) {
- appComponent.inject(this);
- }
-
- /**
- * Returns true if the current search term is not empty.
- */
- public boolean hasSearchTerm() {
- return !TextUtils.isEmpty(mSearchTerm);
- }
-
- /**
- * Sets new search term.
- */
- @MainThread
- public void setSearchTerm(String searchTerm) {
- mSearchTerm = searchTerm;
-
- if (mCurrentNetworkCall != null) {
- mCurrentNetworkCall.cancel();
- }
-
- final GithubDao githubDao = mDatabase.getGithubDao();
-
- // Get the LiveData wrapper around the list of repositories that match our current
- // search query. The wrapped list will be updated on every successful network request
- // that is performed for data that is not available in our database.
- mRepositoryListLiveData.setBackingLiveData(githubDao.getRepositories(mSearchTerm));
-
- mStateLiveData.setValue(STATE_INITIAL_LOADING);
- mHasNetworkRequestPending.set(false);
-
- new AsyncTask<String, Void, Void>() {
- @Override
- protected Void doInBackground(String... params) {
- // Get data about locally persisted results of our current search query. Note that
- // since this is working with a disk-based database, we're running off the main
- // thread.
- mSearchQueryData = githubDao.getSearchQueryData(
- params[0], SearchQueryData.GENERAL_REPOSITORIES);
- if (mSearchQueryData == null) {
- // This query has not been performed before - initialize an entry in the
- // database. TODO - consult the timestamp of network requests for staleness.
- mSearchQueryData = new SearchQueryData();
- mSearchQueryData.searchQuery = params[0];
- mSearchQueryData.searchKind = SearchQueryData.GENERAL_REPOSITORIES;
- mSearchQueryData.numberOfFetchedItems = -1;
- githubDao.update(mSearchQueryData);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void aVoid) {
- fetchNextPage();
- }
- }.execute(mSearchTerm);
- }
-
- private void fetchNextPage() {
- if (mSearchQueryData == null) {
- // Not ready to fetch yet.
- return;
- }
-
- // Do we have data in the database?
- if (mSearchQueryData.numberOfFetchedItems >= mLastRequestedIndex.get()) {
- // We already have the data stored (and retrieved) from database.
- mStateLiveData.setValue(STATE_DATA);
- return;
- }
-
- if (mHasNetworkRequestPending.get()) {
- // Previous request still processing
- return;
- }
-
- if (mSearchQueryData.hasNoMoreData) {
- // We don't have any more results
- if (mSearchQueryData.numberOfFetchedItems <= 0) {
- mStateLiveData.setValue(STATE_EMPTY);
- }
- return;
- }
-
- mHasNetworkRequestPending.set(true);
- mCurrentNetworkCall = mGithubNetworkManager.listRepositories(
- mSearchTerm, mSearchQueryData.indexOfLastFetchedPage + 1,
- new GithubNetworkManager.NetworkCallListener<List<RepositoryData>>() {
- @Override
- public void onLoadEmpty(int httpCode) {
- switch (httpCode) {
- case 404:
- // No such user
- mStateLiveData.setValue(STATE_EMPTY);
- break;
- default:
- mStateLiveData.setValue(STATE_ERROR);
- }
- }
-
- @Override
- public void onLoadSuccess(List<RepositoryData> data) {
- new AsyncTask<RepositoryData, Void, Void>() {
- @Override
- protected Void doInBackground(RepositoryData... params) {
- // Note that since we're going to be inserting data into disk-based
- // database, we need to be running off the main thread.
- processNewPageOfData(params);
- return null;
- }
- }.execute(data.toArray(new RepositoryData[data.size()]));
- }
-
- @Override
- public void onLoadFailure() {
- mStateLiveData.setValue(STATE_ERROR);
- }
- });
- }
-
- @WorkerThread
- private void processNewPageOfData(RepositoryData... data) {
- try {
- mDatabase.beginTransaction();
- int newDataCount = data.length;
-
- final GithubDao githubDao = mDatabase.getGithubDao();
- final int indexOfFirstData = mSearchQueryData.numberOfFetchedItems;
- // Update the metadata about our current search query (in the database)
- if (newDataCount == 0) {
- mSearchQueryData.hasNoMoreData = true;
- } else {
- if (mSearchQueryData.indexOfLastFetchedPage == 0) {
- mSearchQueryData.timestamp = System.currentTimeMillis();
- }
- mSearchQueryData.indexOfLastFetchedPage++;
- mSearchQueryData.numberOfFetchedItems += newDataCount;
- }
- githubDao.update(mSearchQueryData);
-
- if (newDataCount > 0) {
- // Insert entries for the newly loaded repositories in two places:
- // 1. The table that stores repository IDs that match a specific query.
- // 2. The table that stores full data on each individual repository.
- // This way we don't store multiple full entries for the same repository
- // that happens to match two or more search queries.
- GeneralRepoSearchData[] generalRepoSearchDataArray =
- new GeneralRepoSearchData[newDataCount];
- for (int i = 0; i < newDataCount; i++) {
- generalRepoSearchDataArray[i] = new GeneralRepoSearchData();
- generalRepoSearchDataArray[i].searchQuery = mSearchTerm;
- generalRepoSearchDataArray[i].resultIndex = indexOfFirstData + i;
- generalRepoSearchDataArray[i].repoId = data[i].id;
- }
- githubDao.insert(generalRepoSearchDataArray);
- githubDao.insert(data);
- }
- mDatabase.setTransactionSuccessful();
- } finally {
- mDatabase.endTransaction();
- }
-
- mHasNetworkRequestPending.set(false);
- mStateLiveData.postValue(
- (mSearchQueryData.numberOfFetchedItems <= 0) && mSearchQueryData.hasNoMoreData
- ? STATE_EMPTY : STATE_DATA);
- }
-
- /**
- * Fetches data at specified index if data does not exist yet.
- */
- public void fetchAtIndexIfNecessary(int index) {
- if (mSearchQueryData == null) {
- // If we're here, we've been asked to start fetching items before we've retrieved
- // the top-level metadata for our search. Save the requested index and return. Once
- // that metadata is fetched off the main thread in the AsyncTask executed in
- // setSearchTerms, we'll call fetchNextPage().
- mLastRequestedIndex.set(index);
- return;
- }
-
- if (mHasNetworkRequestPending.get() || mSearchQueryData.hasNoMoreData) {
- // Previous request still processing or no more results
- return;
- }
-
- mLastRequestedIndex.set(index);
-
- fetchNextPage();
- }
-
- /**
- * Resumes loading of data in this model.
- */
- public void resumeLoading() {
- fetchNextPage();
- }
-
- /**
- * Returns the {@LiveData} object that wraps the current list of repos that matches the last
- * set search term.
- */
- public LiveData<List<RepositoryData>> getRepositoryListLiveData() {
- return mRepositoryListLiveData;
- }
-
- /**
- * Returns the {@LiveData} object that wraps the current data state.
- */
- public LiveData<Integer> getStateLiveData() {
- return mStateLiveData;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositorySearchModel.java b/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositorySearchModel.java
deleted file mode 100644
index 7dd9ad9..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/java/com/android/sample/githubbrowser/viewmodel/RepositorySearchModel.java
+++ /dev/null
@@ -1,63 +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.
- */
-
-/*
- * 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.android.sample.githubbrowser.viewmodel;
-
-import android.text.TextUtils;
-
-import com.android.support.lifecycle.LiveData;
-import com.android.support.lifecycle.ViewModel;
-
-/**
- * Model for the top-level search.
- */
-public class RepositorySearchModel extends ViewModel {
- private LiveData<String> mSearchQuery = new LiveData<>();
-
- /**
- * Sets new search query. The second parameter should be used to specify whether
- * the currently set query should be overwritten.
- */
- public void setQuery(String query, boolean ignoreIfAlreadySet) {
- if (ignoreIfAlreadySet && !TextUtils.isEmpty(mSearchQuery.getValue())) {
- return;
- }
-
- mSearchQuery.setValue(query);
- }
-
- /**
- * Returns the {@LiveData} object that wraps the top-level search query.
- */
- public LiveData<String> getSearchQueryData() {
- return mSearchQuery;
- }
-}
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_bug_report_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_bug_report_black_18dp.png
deleted file mode 100644
index 9eff049..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_bug_report_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_content_copy_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_content_copy_black_18dp.png
deleted file mode 100644
index 91b3acf..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_content_copy_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_email_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_email_black_18dp.png
deleted file mode 100644
index ef03f95..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_email_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_link_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_link_black_18dp.png
deleted file mode 100644
index 788c578..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_link_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_location_on_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_location_on_black_18dp.png
deleted file mode 100644
index 5e45f7e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_location_on_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png
deleted file mode 100644
index e531d72..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_people_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_people_black_18dp.png
deleted file mode 100644
index f6ac436..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_people_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_remove_red_eye_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_remove_red_eye_black_18dp.png
deleted file mode 100644
index debb2b3..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_remove_red_eye_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png
deleted file mode 100644
index c593e7a..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_black_18dp.png
deleted file mode 100644
index 4ea8d0c..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_rate_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_rate_black_18dp.png
deleted file mode 100644
index cd18bed..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_star_rate_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_watch_later_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_watch_later_black_18dp.png
deleted file mode 100644
index c910f75..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-hdpi/ic_watch_later_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_bug_report_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_bug_report_black_18dp.png
deleted file mode 100644
index b3d2e3e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_bug_report_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_content_copy_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_content_copy_black_18dp.png
deleted file mode 100644
index 6363bc4..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_content_copy_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_email_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_email_black_18dp.png
deleted file mode 100644
index 977c4cb..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_email_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_link_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_link_black_18dp.png
deleted file mode 100644
index 6e5c394..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_link_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_location_on_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_location_on_black_18dp.png
deleted file mode 100644
index b35923a..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_location_on_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png
deleted file mode 100644
index 9efbaae..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_people_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_people_black_18dp.png
deleted file mode 100644
index cc204fd..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_people_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_remove_red_eye_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_remove_red_eye_black_18dp.png
deleted file mode 100644
index 0f72bfa..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_remove_red_eye_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png
deleted file mode 100644
index 6b16343..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_black_18dp.png
deleted file mode 100644
index b125aa0..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_rate_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_rate_black_18dp.png
deleted file mode 100644
index d6496ab..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_star_rate_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_watch_later_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_watch_later_black_18dp.png
deleted file mode 100644
index 19e22c0..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-mdpi/ic_watch_later_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_bug_report_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_bug_report_black_18dp.png
deleted file mode 100644
index 1bccb1d..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_bug_report_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_content_copy_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_content_copy_black_18dp.png
deleted file mode 100644
index 9a9e570..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_content_copy_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_email_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_email_black_18dp.png
deleted file mode 100644
index 36c6311..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_email_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_link_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_link_black_18dp.png
deleted file mode 100644
index 76003e2..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_link_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_location_on_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_location_on_black_18dp.png
deleted file mode 100644
index df1f340..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_location_on_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png
deleted file mode 100644
index 87f8de1..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_people_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_people_black_18dp.png
deleted file mode 100644
index 0782166..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_people_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_remove_red_eye_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_remove_red_eye_black_18dp.png
deleted file mode 100644
index 329e617..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_remove_red_eye_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png
deleted file mode 100644
index 6381902..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_black_18dp.png
deleted file mode 100644
index 92a0f58..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_rate_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_rate_black_18dp.png
deleted file mode 100644
index 33a02af..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_star_rate_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_watch_later_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_watch_later_black_18dp.png
deleted file mode 100644
index c643539..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xhdpi/ic_watch_later_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_bug_report_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_bug_report_black_18dp.png
deleted file mode 100644
index 145f2e6..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_bug_report_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_content_copy_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_content_copy_black_18dp.png
deleted file mode 100644
index 7ef1968..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_content_copy_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_email_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_email_black_18dp.png
deleted file mode 100644
index 0648fbd..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_email_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_link_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_link_black_18dp.png
deleted file mode 100644
index 69ea7ef..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_link_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_location_on_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_location_on_black_18dp.png
deleted file mode 100644
index ebe833b..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_location_on_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png
deleted file mode 100644
index 4af4ae6..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_people_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_people_black_18dp.png
deleted file mode 100644
index a595b2e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_people_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_remove_red_eye_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_remove_red_eye_black_18dp.png
deleted file mode 100644
index 2e54e32..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_remove_red_eye_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png
deleted file mode 100644
index 3ae490e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_black_18dp.png
deleted file mode 100644
index 4f67f97..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_rate_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_rate_black_18dp.png
deleted file mode 100644
index 658b08d..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_star_rate_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_watch_later_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_watch_later_black_18dp.png
deleted file mode 100644
index 3b41d99..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxhdpi/ic_watch_later_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_bug_report_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_bug_report_black_18dp.png
deleted file mode 100644
index af8c82e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_bug_report_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_content_copy_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_content_copy_black_18dp.png
deleted file mode 100644
index 074ea88..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_content_copy_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_email_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_email_black_18dp.png
deleted file mode 100644
index 3d13627..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_email_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_link_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_link_black_18dp.png
deleted file mode 100644
index af03b85..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_link_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_18dp.png
deleted file mode 100644
index 5a21dfa..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png
deleted file mode 100644
index d6761ba..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_people_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_people_black_18dp.png
deleted file mode 100644
index 5a8b5d0..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_people_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_remove_red_eye_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_remove_red_eye_black_18dp.png
deleted file mode 100644
index c816ab4..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_remove_red_eye_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png
deleted file mode 100644
index 21be572..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_black_18dp.png
deleted file mode 100644
index 54d3065..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_rate_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_rate_black_18dp.png
deleted file mode 100644
index 1823bbb..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_star_rate_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_watch_later_black_18dp.png b/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_watch_later_black_18dp.png
deleted file mode 100644
index bfb296d..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/drawable-xxxhdpi/ic_watch_later_black_18dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/activity_main.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 7aacfcb..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,67 +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.
- -->
-
-<android.support.design.widget.CoordinatorLayout
- 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/col"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fitsSystemWindows="true"
- tools:context="com.android.sample.githubbrowser.MainActivity">
-
- <android.support.design.widget.AppBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:theme="@style/AppTheme.AppBarOverlay">
-
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:background="?attr/colorPrimary"
- app:contentInsetStart="0dp"
- app:popupTheme="@style/AppTheme.PopupOverlay">
-
- <android.support.v7.widget.CardView
- android:id="@+id/card_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="8dip"
- app:cardCornerRadius="4dp"
- app:cardElevation="8dp">
-
- <EditText
- android:id="@+id/search"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:background="@null"
- android:drawableRight="@drawable/ic_search_black_24dp"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
- android:maxLines="1"
- android:inputType="textNoSuggestions"
- android:textColor="@color/colorPrimary"/>
- </android.support.v7.widget.CardView>
- </android.support.v7.widget.Toolbar>
-
- </android.support.design.widget.AppBarLayout>
-
- <include layout="@layout/content_main"/>
-</android.support.design.widget.CoordinatorLayout>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/content_main.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/content_main.xml
deleted file mode 100644
index ad98eda..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/content_main.xml
+++ /dev/null
@@ -1,22 +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.
- -->
-
-<FrameLayout android:id="@+id/fragment_container"
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/edit_user_details.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/edit_user_details.xml
deleted file mode 100644
index 3113520..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/edit_user_details.xml
+++ /dev/null
@@ -1,56 +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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
- <data>
- <variable name="user" type="com.android.sample.githubbrowser.data.PersonData"/>
- </data>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingTop="16dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp">
-
- <android.support.design.widget.TextInputLayout
- android:id="@+id/wrapper_email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <EditText
- android:id="@+id/email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/hint_email"
- android:text="@{user.email}" />
- </android.support.design.widget.TextInputLayout>
-
- <android.support.design.widget.TextInputLayout
- android:id="@+id/wrapper_location"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <EditText
- android:id="@+id/location"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/hint_location"
- android:text="@{user.location}" />
- </android.support.design.widget.TextInputLayout>
-
- </LinearLayout>
-</layout>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_details.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_details.xml
deleted file mode 100644
index 8727bb8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_details.xml
+++ /dev/null
@@ -1,155 +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.
- -->
-
-<layout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <variable name="repo" type="com.android.sample.githubbrowser.data.RepositoryData"/>
- </data>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/background"
- android:orientation="vertical">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <ImageView
- android:id="@+id/avatar"
- android:layout_width="96dp"
- android:layout_height="96dp"
- android:background="#FAFAFA"
- app:imageUrl="@{repo.owner.avatar_url}"/>
-
- <TextView
- android:id="@+id/name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{repo.name}"
- android:textColor="#222"
- android:textSize="20sp"/>
-
- <TextView
- android:id="@+id/description"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/name"
- android:layout_toRightOf="@id/avatar"
- android:lines="2"
- android:maxLines="2"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{repo.description}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/created"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignBottom="@id/avatar"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="2dp"
- android:paddingLeft="8dp"
- android:textColor="#444"
- android:textSize="14sp"
- app:jsonDate="@{repo.created_at}"/>
-
- <TextView
- android:id="@+id/bugs"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/avatar"
- android:drawableLeft="@drawable/ic_bug_report_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:paddingTop="8dp"
- android:text="@{Integer.toString(repo.open_issues_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/starred"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/avatar"
- android:layout_toRightOf="@id/bugs"
- android:drawableLeft="@drawable/ic_star_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:paddingTop="8dp"
- android:text="@{Integer.toString(repo.stargazers_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/forked"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/avatar"
- android:layout_toRightOf="@id/starred"
- android:drawableLeft="@drawable/ic_content_copy_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:paddingRight="10dp"
- android:paddingTop="8dp"
- android:text="@{Integer.toString(repo.forks_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- </RelativeLayout>
-
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="4dp"
- android:paddingLeft="12dp"
- android:paddingTop="24dp"
- android:text="@string/contributors"
- android:textAppearance="@style/TextAppearance.AppCompat.Body2"
- app:textAllCaps="true"/>
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/contributors"
- android:layout_width="match_parent"
- app:layoutManager="LinearLayoutManager"
- android:layout_height="0dip"
- android:layout_weight="1"/>
-
- </LinearLayout>
-</layout>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_list.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_list.xml
deleted file mode 100644
index 8424df0..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_repo_list.xml
+++ /dev/null
@@ -1,60 +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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <import type="java.lang.String"/>
- <import type="com.android.sample.githubbrowser.viewmodel.RepositoryListModel"/>
- <variable name="state" type="Integer"/>
- <variable name="query" type="String"/>
- </data>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/background">
-
- <ProgressBar
- android:id="@+id/loading"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:indeterminate="true"
- app:visibleInvisible="@{state == RepositoryListModel.STATE_INITIAL_LOADING}"/>
-
- <TextView
- android:id="@+id/status"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:textSize="20sp"
- android:text="@{state == RepositoryListModel.STATE_EMPTY ? @string/no_results(query) : @string/load_error(query)}"
- app:visibleInvisible="@{state == RepositoryListModel.STATE_EMPTY || state == RepositoryListModel.STATE_ERROR}"/>
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/repo_list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:visibleInvisible="@{state == RepositoryListModel.STATE_DATA}"/>
-
- </FrameLayout>
-</layout>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_user_details.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_user_details.xml
deleted file mode 100644
index 3ed4e05..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/fragment_user_details.xml
+++ /dev/null
@@ -1,257 +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.
- -->
-
-<layout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <import type="android.text.TextUtils"/>
- <import type="com.android.sample.githubbrowser.R"/>
- <variable name="user" type="com.android.sample.githubbrowser.data.PersonData"/>
- <variable name="editCallback" type="com.android.sample.githubbrowser.view.PersonClickCallback"/>
- </data>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/background"
- android:orientation="vertical">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <ImageView
- android:id="@+id/avatar"
- android:layout_width="96dp"
- android:layout_height="96dp"
- android:background="#FAFAFA"
- app:imageUrl="@{user.avatar_url}"/>
-
- <TextView
- android:id="@+id/name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{user.name}"
- android:textColor="#222"
- android:textSize="20sp"
- app:visibleInvisible="@{!(user == null || TextUtils.isEmpty(user.name))}"/>
-
- <TextView
- android:id="@+id/login"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/name"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{user.login}"
- android:textColor="#444"
- android:textSize="18sp"/>
-
- <TextView
- android:id="@+id/created"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignBottom="@id/avatar"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="2dp"
- android:paddingLeft="8dp"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleInvisible="@{!(user == null || TextUtils.isEmpty(user.created_at))}"
- app:jsonDate="@{user.created_at}"
- app:stringRes="@{R.string.joined}"/>
-
- </RelativeLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="16dp"
- android:paddingTop="8dp">
- <TextView
- android:id="@+id/company"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawableLeft="@drawable/ic_people_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:text="@{user.company}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{!(user == null || TextUtils.isEmpty(user.company))}"/>
-
- <TextView
- android:id="@+id/location"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawableLeft="@drawable/ic_location_on_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:text="@{user.location}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{!(user == null || TextUtils.isEmpty(user.location))}"/>
-
- <View
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1"/>
-
- <ImageButton
- android:id="@+id/edit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:background="@null"
- android:clickable="true"
- android:onClick="@{() -> editCallback.onClick(user)}"
- android:src="@drawable/ic_mode_edit_black_24dp"
- app:visibleGone="@{user != null}"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="16dp"
- android:paddingTop="8dp">
- <TextView
- android:id="@+id/email"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawableLeft="@drawable/ic_email_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:text="@{user.email}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{!(user == null || TextUtils.isEmpty(user.email))}"/>
-
- <TextView
- android:id="@+id/blog"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawableLeft="@drawable/ic_link_black_18dp"
- android:drawablePadding="2dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:text="@{user.blog}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{!(user == null || TextUtils.isEmpty(user.blog))}"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="16dp"
- android:paddingTop="8dp">
- <TextView
- android:id="@+id/followers_label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:lines="1"
- android:maxLines="1"
- android:paddingRight="4dp"
- android:text="@string/followers"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{user != null}"/>
-
- <TextView
- android:id="@+id/followers"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="#CCC"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="4dp"
- android:paddingRight="4dp"
- android:text="@{Integer.toString(user.followers)}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{user != null}"/>
-
- <TextView
- android:id="@+id/following_label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="16dp"
- android:paddingRight="4dp"
- android:text="@string/following"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{user != null}"/>
-
- <TextView
- android:id="@+id/following"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="#CCC"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="4dp"
- android:paddingRight="4dp"
- android:text="@{Integer.toString(user.following)}"
- android:textColor="#444"
- android:textSize="14sp"
- app:visibleGone="@{user != null}"/>
- </LinearLayout>
-
- <TextView
- android:id="@+id/repositories_header"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="4dp"
- android:paddingLeft="12dp"
- android:paddingTop="24dp"
- android:text="@string/repositories"
- android:textAppearance="@style/TextAppearance.AppCompat.Body2"
- app:visibleGone="@{user != null}"/>
- app:textAllCaps="true"/>
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/repositories"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"/>
-
- </LinearLayout>
-</layout>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/get_auth_token.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/get_auth_token.xml
deleted file mode 100644
index 9547f40..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/get_auth_token.xml
+++ /dev/null
@@ -1,37 +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.
- -->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="16dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp">
-
- <android.support.design.widget.TextInputLayout
- android:id="@+id/wrapper_token"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <EditText
- android:id="@+id/token"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/hint_token"/>
- </android.support.design.widget.TextInputLayout>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/repository_card.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/repository_card.xml
deleted file mode 100644
index dc2f6b8..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/repository_card.xml
+++ /dev/null
@@ -1,140 +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.
- -->
-
-<layout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <variable name="repo" type="com.android.sample.githubbrowser.data.RepositoryData"/>
- <variable name="repoClickCallback"
- type="com.android.sample.githubbrowser.view.RepoClickCallback"/>
- </data>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:onClick="@{() -> repoClickCallback.onClick(repo)}">
-
- <android.support.v7.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginLeft="10dp"
- android:layout_marginRight="10dp"
- android:layout_marginTop="6dp"
- app:cardCornerRadius="4dp"
- app:cardElevation="2dp">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="96dp">
-
- <TextView
- android:id="@+id/name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{repo.name}"
- android:textColor="#222"
- android:textSize="18sp"/>
-
- <TextView
- android:id="@+id/description"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/name"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{repo.description}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/created"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="8dp"
- android:paddingLeft="8dp"
- android:textColor="#444"
- android:textSize="14sp"
- app:jsonDate="@{repo.created_at}"/>
-
- <TextView
- android:id="@+id/forked"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
- android:drawableLeft="@drawable/ic_content_copy_black_18dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="8dp"
- android:paddingLeft="6dp"
- android:paddingRight="10dp"
- android:text="@{Integer.toString(repo.forks_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/starred"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toLeftOf="@id/forked"
- android:drawableLeft="@drawable/ic_star_black_18dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="8dp"
- android:paddingLeft="6dp"
- android:paddingRight="6dp"
- android:text="@{Integer.toString(repo.stargazers_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- <TextView
- android:id="@+id/bugs"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toLeftOf="@id/starred"
- android:drawableLeft="@drawable/ic_bug_report_black_18dp"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="8dp"
- android:paddingLeft="6dp"
- android:paddingRight="6dp"
- android:text="@{Integer.toString(repo.open_issues_count)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- </RelativeLayout>
-
- </android.support.v7.widget.CardView>
-
- </FrameLayout>
-</layout>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/user_row.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/layout/user_row.xml
deleted file mode 100644
index 495720c..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/layout/user_row.xml
+++ /dev/null
@@ -1,74 +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.
- -->
-
-<layout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <variable name="contributor" type="com.android.sample.githubbrowser.data.ContributorData"/>
- <variable name="callback" type="com.android.sample.githubbrowser.view.PersonClickCallback"/>
- </data>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="64dp"
- android:onClick="@{() -> callback.onClick(contributor)}">
-
- <ImageView
- android:id="@+id/avatar"
- android:layout_width="64dp"
- android:layout_height="64dp"
- app:imageUrl="@{contributor.avatar_url}"/>
-
- <View
- android:id="@+id/separator"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:layout_toRightOf="@id/avatar"
- android:background="#80222222"/>
-
- <TextView
- android:id="@+id/login"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="4dp"
- android:text="@{contributor.login}"
- android:textColor="#222"
- android:textSize="16sp"/>
-
- <TextView
- android:id="@+id/contributions"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/avatar"
- android:lines="1"
- android:maxLines="1"
- android:paddingBottom="6dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:text="@{@plurals/contributions(contributor.contributions, contributor.contributions)}"
- android:textColor="#444"
- android:textSize="14sp"/>
-
- </RelativeLayout>
-</layout>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values-land/ints.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values-land/ints.xml
deleted file mode 100644
index 5b3006e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values-land/ints.xml
+++ /dev/null
@@ -1,20 +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.
- -->
-
-<resources>
- <integer name="column_count">2</integer>
-</resources>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values-v21/styles.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values-v21/styles.xml
deleted file mode 100644
index 064fa76..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values-v21/styles.xml
+++ /dev/null
@@ -1,24 +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.
- -->
-
-<resources>
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="windowNoTitle">true</item>
- <item name="android:windowDrawsSystemBarBackgrounds">true</item>
- <item name="android:statusBarColor">@android:color/transparent</item>
- </style>
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w600dp/ints.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values-w600dp/ints.xml
deleted file mode 100644
index 5b3006e..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w600dp/ints.xml
+++ /dev/null
@@ -1,20 +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.
- -->
-
-<resources>
- <integer name="column_count">2</integer>
-</resources>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/dimens.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/dimens.xml
deleted file mode 100644
index 73f6d98..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,22 +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.
- -->
-
-<resources>
- <!-- Example customization of dimensions originally defined in res/values/dimens.xml
- (such as screen margins) for screens with more than 820dp of available width. This
- would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
- <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/ints.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/ints.xml
deleted file mode 100644
index 574f711..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values-w820dp/ints.xml
+++ /dev/null
@@ -1,20 +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.
- -->
-
-<resources>
- <integer name="column_count">3</integer>
-</resources>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values/colors.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values/colors.xml
deleted file mode 100644
index c375001..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,23 +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.
- -->
-
-<resources>
- <color name="colorPrimary">#e91e63</color>
- <color name="colorPrimaryDark">#d81b60</color>
- <color name="colorAccent">#4caf50</color>
- <color name="background">#eeeeee</color>
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values/dimens.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 87c9565..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,22 +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.
- -->
-
-<resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="fab_margin">16dp</dimen>
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values/ints.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values/ints.xml
deleted file mode 100644
index e489869..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values/ints.xml
+++ /dev/null
@@ -1,20 +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.
- -->
-
-<resources>
- <integer name="column_count">1</integer>
-</resources>
\ No newline at end of file
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values/strings.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values/strings.xml
deleted file mode 100644
index a77f5ef..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,45 +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.
- -->
-
-<resources>
- <string name="app_name">GithubBrowser</string>
- <string name="ok">OK</string>
- <string name="cancel">Cancel</string>
-
- <string name="auth_token_title">Type or paste your GitHub token</string>
- <string name="hint_token">GitHub token</string>
- <string name="contributors">Contributors</string>
- <plurals name="bugs">
- <item quantity="one">%1$d issue</item>
- <item quantity="other">%1$d issues</item>
- </plurals>
- <string name="starred">%1$d starred</string>
- <string name="forked">%1$d forked</string>
- <plurals name="contributions">
- <item quantity="one">%1$d contribution</item>
- <item quantity="other">%1$d contributions</item>
- </plurals>
- <string name="created">Created on %1$s</string>
- <string name="repositories">Repositories</string>
- <string name="followers">Followers</string>
- <string name="following">Following</string>
- <string name="joined">Joined on %1$s</string>
- <string name="hint_email">Email</string>
- <string name="hint_location">Location</string>
-
- <string name="no_results">No data for \'%1$s\'</string>
- <string name="load_error">Couldn\'t load data for \'%1$s\'</string>
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/app/src/main/res/values/styles.xml b/samples-flatfoot/GithubBrowser/app/src/main/res/values/styles.xml
deleted file mode 100644
index 4b769cc..0000000
--- a/samples-flatfoot/GithubBrowser/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,33 +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.
- -->
-
-<resources>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="windowNoTitle">true</item>
- </style>
- <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
- <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
-
-</resources>
diff --git a/samples-flatfoot/GithubBrowser/build.gradle b/samples-flatfoot/GithubBrowser/build.gradle
deleted file mode 100644
index 99ae156..0000000
--- a/samples-flatfoot/GithubBrowser/build.gradle
+++ /dev/null
@@ -1,44 +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.
- */
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-ext.flatfootVersion = "1.0-SNAPSHOT"
-ext.supportLibVersion = "25.2.0"
-ext.daggerVersion = "2.7"
-
-allprojects { p ->
- repositories {
- jcenter()
- maven { url '/Volumes/ssd/src/ff-repo/m2repository' }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/samples-flatfoot/GithubBrowser/gradle.properties b/samples-flatfoot/GithubBrowser/gradle.properties
deleted file mode 100644
index be27115..0000000
--- a/samples-flatfoot/GithubBrowser/gradle.properties
+++ /dev/null
@@ -1,33 +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.
-#
-
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index de8435f..0000000
--- a/samples-flatfoot/GithubBrowser/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,22 +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.
-#
-
-#Mon Mar 13 21:50:29 PDT 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
diff --git a/samples-flatfoot/GithubBrowser/gradlew b/samples-flatfoot/GithubBrowser/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/GithubBrowser/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/GithubBrowser/gradlew.bat b/samples-flatfoot/GithubBrowser/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/GithubBrowser/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/GithubBrowser/settings.gradle b/samples-flatfoot/GithubBrowser/settings.gradle
deleted file mode 100644
index 1df87d4..0000000
--- a/samples-flatfoot/GithubBrowser/settings.gradle
+++ /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.
- */
-
-include ':app'
diff --git a/samples-flatfoot/MusicPlayer/.gitignore b/samples-flatfoot/MusicPlayer/.gitignore
deleted file mode 100644
index 39fb081..0000000
--- a/samples-flatfoot/MusicPlayer/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/MusicPlayer/app/build.gradle b/samples-flatfoot/MusicPlayer/app/build.gradle
deleted file mode 100644
index 58a68a1..0000000
--- a/samples-flatfoot/MusicPlayer/app/build.gradle
+++ /dev/null
@@ -1,38 +0,0 @@
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId "com.android.sample.musicplayer"
- minSdkVersion 14
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- dataBinding {
- enabled = true
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-}
-
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile "com.android.support:appcompat-v7:$supportLibVersion"
- compile "com.android.support:design:$supportLibVersion"
- compile "com.android.support.lifecycle:runtime:$flatfootVersion"
- compile "com.android.support.lifecycle:extensions:$flatfootVersion"
-
- annotationProcessor "com.android.support.lifecycle:compiler:$flatfootVersion"
-
- testCompile 'junit:junit:4.12'
-}
diff --git a/samples-flatfoot/MusicPlayer/app/proguard-rules.pro b/samples-flatfoot/MusicPlayer/app/proguard-rules.pro
deleted file mode 100644
index 3916ad7..0000000
--- a/samples-flatfoot/MusicPlayer/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Users/kirillg/Android/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/AndroidManifest.xml b/samples-flatfoot/MusicPlayer/app/src/main/AndroidManifest.xml
deleted file mode 100644
index d96b452..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest package="com.android.sample.musicplayer"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
-
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name"
- android:theme="@style/AppTheme.NoActionBar">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
-
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <service android:exported="false" android:name=".MusicService">
- <intent-filter>
- <action android:name="com.android.sample.musicplayer.action.START" />
- <action android:name="com.android.sample.musicplayer.action.PLAY" />
- <action android:name="com.android.sample.musicplayer.action.PAUSE" />
- <action android:name="com.android.sample.musicplayer.action.NEXT" />
- <action android:name="com.android.sample.musicplayer.action.PREV" />
- <action android:name="com.android.sample.musicplayer.action.STOP" />
- </intent-filter>
- </service>
- </application>
-
-</manifest>
\ No newline at end of file
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/BaseActivity.java b/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/BaseActivity.java
deleted file mode 100644
index 2ca54a9..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/BaseActivity.java
+++ /dev/null
@@ -1,62 +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 com.android.sample.musicplayer;
-
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-
-import com.android.support.lifecycle.ActivityLifecycleDispatcher;
-import com.android.support.lifecycle.Lifecycle;
-import com.android.support.lifecycle.LifecycleProvider;
-
-/**
- * Temporary base activity that acts as lifecycle provider.
- */
-public abstract class BaseActivity extends AppCompatActivity implements LifecycleProvider {
- private final ActivityLifecycleDispatcher mDispatcher = new ActivityLifecycleDispatcher(this,
- this);
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mDispatcher.onActivityPostSuperOnCreate();
- }
- @Override
- protected void onResume() {
- mDispatcher.onActivityPreSuperOnResume();
- super.onResume();
- }
- @Override
- protected void onPause() {
- mDispatcher.onActivityPreSuperOnPause();
- super.onPause();
- }
- @Override
- protected void onStop() {
- mDispatcher.onActivityPreSuperOnStop();
- super.onStop();
- }
- @Override
- protected void onDestroy() {
- mDispatcher.onActivityPreSuperOnDestroy();
- super.onDestroy();
- }
-
- @Override
- public Lifecycle getLifecycle() {
- return mDispatcher.getLifecycle();
- }
-}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MainActivity.java b/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MainActivity.java
deleted file mode 100644
index e07610a..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MainActivity.java
+++ /dev/null
@@ -1,113 +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 com.android.sample.musicplayer;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.design.widget.FloatingActionButton;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.Toolbar;
-import android.view.View;
-
-import com.android.sample.musicplayer.MusicRepository.TrackMetadata;
-import com.android.sample.musicplayer.adapter.MusicTrackListAdapter;
-import com.android.support.lifecycle.LiveData;
-import com.android.support.lifecycle.Observer;
-
-import java.util.List;
-
-/**
- * Our main activity.
- */
-public class MainActivity extends BaseActivity {
- private RecyclerView mRecyclerView;
-
- private MusicTrackListAdapter mMusicTrackListAdapter;
- private int mCurrPlaybackState;
-
- private void updateFab() {
- final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
- switch (mCurrPlaybackState) {
- case MusicRepository.STATE_PLAYING:
- fab.setImageResource(R.drawable.ic_pause_white_36dp);
- break;
- case MusicRepository.STATE_PAUSED:
- case MusicRepository.STATE_STOPPED:
- fab.setImageResource(R.drawable.ic_play_arrow_white_36dp);
- break;
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
-
- // Start the service. From this point on there is no direct communication between the
- // activity and the service. Everything is done by updating LiveData objects in the
- // repository and observing / reacting to those changes.
- startService(new Intent(MusicService.ACTION_START).setPackage(
- "com.android.sample.musicplayer"));
-
- final MusicRepository musicRepository = MusicRepository.getInstance();
- LiveData<Integer> currentlyActiveTrackData = musicRepository.getCurrentlyActiveTrackData();
- currentlyActiveTrackData.observe(this, new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer integer) {
- if (mMusicTrackListAdapter != null) {
- mMusicTrackListAdapter.setActiveTrackIndex(integer);
- }
- }
- });
- LiveData<Integer> stateData = musicRepository.getStateData();
- stateData.observe(this, new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer integer) {
- mCurrPlaybackState = integer;
- updateFab();
- }
- });
-
- final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
- updateFab();
-
- fab.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (mCurrPlaybackState == MusicRepository.STATE_INITIAL) {
- // If the FAB is clicked in the initial state, start the playback from the
- // first track
- musicRepository.setTrack(0);
- } else {
- // Otherwise we're past the initial state. Set the state to playing or
- // paused based on the current state
- musicRepository.setState((mCurrPlaybackState == MusicRepository.STATE_PLAYING)
- ? MusicRepository.STATE_PAUSED : MusicRepository.STATE_PLAYING);
- }
- }
- });
-
- mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
- final List<TrackMetadata> tracks = MusicRepository.getInstance().getTracks();
- mMusicTrackListAdapter = new MusicTrackListAdapter(tracks);
- mRecyclerView.setAdapter(mMusicTrackListAdapter);
- mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
- }
-}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicRepository.java b/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicRepository.java
deleted file mode 100644
index 5fb04a4..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicRepository.java
+++ /dev/null
@@ -1,162 +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 com.android.sample.musicplayer;
-
-import android.support.annotation.RawRes;
-
-import com.android.support.lifecycle.LiveData;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Music track / state repository.
- */
-public class MusicRepository {
- public static final int STATE_INITIAL = 0;
- public static final int STATE_PLAYING = 1;
- public static final int STATE_PAUSED = 2;
- public static final int STATE_PREPARING = 3;
- public static final int STATE_STOPPED = 4;
-
- private static MusicRepository sInstance;
-
- /**
- * Metadata for a single track.
- */
- public static final class TrackMetadata {
- private final int mIndex;
- private final String mTitle;
- private final String mArtist;
- @RawRes private final int mTrackRes;
-
- public TrackMetadata(int index, String title, String artist, @RawRes int trackRes) {
- mIndex = index;
- mTitle = title;
- mArtist = artist;
- mTrackRes = trackRes;
- }
-
- public int getIndex() {
- return mIndex;
- }
-
- public String getTitle() {
- return mTitle;
- }
-
- public String getArtist() {
- return mArtist;
- }
-
- @RawRes
- public int getTrackRes() {
- return mTrackRes;
- }
- }
-
- private List<TrackMetadata> mTracks;
-
- private LiveData<Integer> mCurrentlyActiveTrackData;
- private LiveData<Integer> mStateData;
-
- /**
- * Gets the repository instance.
- */
- public static synchronized MusicRepository getInstance() {
- if (sInstance == null) {
- sInstance = new MusicRepository();
- }
- return sInstance;
- }
-
- private MusicRepository() {
- mTracks = new ArrayList<>(9);
- mTracks.add(new TrackMetadata(1, "Tilt You Better", "Dawn Lentil", R.raw.track1));
- mTracks.add(new TrackMetadata(2, "Moongirl", "The Weekdy", R.raw.track2));
- mTracks.add(new TrackMetadata(3, "Further", "The Linkdrinkers", R.raw.track3));
- mTracks.add(new TrackMetadata(4, "Back and Forth", "Marina Venti", R.raw.track4));
- mTracks.add(new TrackMetadata(5, "Let Me Hate You", "Juji Beans", R.raw.track5));
- mTracks.add(new TrackMetadata(6, "Thirsty", "Smiley Leftfield", R.raw.track6));
- mTracks.add(new TrackMetadata(7, "Cheap Deals", "Skia", R.raw.track7));
- mTracks.add(new TrackMetadata(8, "Don't Stop the Drilling", "Raw Oilfield", R.raw.track8));
- mTracks.add(new TrackMetadata(9, "Million Regressions", "Lady BreakBuild", R.raw.track9));
-
- mCurrentlyActiveTrackData = new LiveData<>();
- mCurrentlyActiveTrackData.setValue(-1);
-
- mStateData = new LiveData<>();
- mStateData.setValue(STATE_INITIAL);
- }
-
- /**
- * Returns the unmodifiable list of tracks in this repository.
- */
- public List<TrackMetadata> getTracks() {
- return Collections.unmodifiableList(mTracks);
- }
-
- /**
- * Goes to the specific track.
- */
- public void setTrack(int trackIndex) {
- mCurrentlyActiveTrackData.setValue(trackIndex);
- }
-
- /**
- * Goes to the next track.
- */
- public void goToNextTrack() {
- int nextSourceIndex = mCurrentlyActiveTrackData.getValue() + 1;
- if (nextSourceIndex == mTracks.size()) {
- nextSourceIndex = 0;
- }
- setTrack(nextSourceIndex);
- }
-
- /**
- * Goes to the previous track.
- */
- public void goToPreviousTrack() {
- int prevSourceIndex = mCurrentlyActiveTrackData.getValue() - 1;
- if (prevSourceIndex == -1) {
- prevSourceIndex = mTracks.size() - 1;
- }
- setTrack(prevSourceIndex);
- }
-
- /**
- * Sets the new value for the playback state.
- */
- public void setState(int state) {
- mStateData.setValue(state);
- }
-
- /**
- * Returns the {@link LiveData} object that wraps the currently active track index.
- */
- public LiveData<Integer> getCurrentlyActiveTrackData() {
- return this.mCurrentlyActiveTrackData;
- }
-
- /**
- * Returns the {@link LiveData} object that wraps the playback state.
- */
- public LiveData<Integer> getStateData() {
- return mStateData;
- }
-}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicService.java b/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicService.java
deleted file mode 100644
index a9d623c..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/MusicService.java
+++ /dev/null
@@ -1,442 +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 com.android.sample.musicplayer;
-
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.media.MediaPlayer;
-import android.media.MediaPlayer.OnCompletionListener;
-import android.media.MediaPlayer.OnPreparedListener;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.PowerManager;
-import android.support.annotation.Nullable;
-import android.support.annotation.RawRes;
-import android.support.v4.app.NotificationManagerCompat;
-import android.support.v4.media.MediaMetadataCompat;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.support.v7.app.NotificationCompat;
-
-import com.android.sample.musicplayer.MusicRepository.TrackMetadata;
-import com.android.support.lifecycle.LifecycleService;
-import com.android.support.lifecycle.LiveData;
-import com.android.support.lifecycle.Observer;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Music playback service.
- */
-public class MusicService extends LifecycleService implements OnCompletionListener,
- OnPreparedListener {
- // Note that only START action is an entry point "exposed" to the rest of the
- // application. The rest are actions set on the notification intents fired off
- // by this service itself.
- public static final String ACTION_START = "com.android.sample.musicplayer.action.START";
- private static final String ACTION_PLAY = "com.android.sample.musicplayer.action.PLAY";
- private static final String ACTION_PAUSE = "com.android.sample.musicplayer.action.PAUSE";
- private static final String ACTION_STOP = "com.android.sample.musicplayer.action.STOP";
- private static final String ACTION_NEXT = "com.android.sample.musicplayer.action.NEXT";
- private static final String ACTION_PREV = "com.android.sample.musicplayer.action.PREV";
-
- private static final String RESOURCE_PREFIX =
- "android.resource://com.android.sample.musicplayer/";
-
- // The ID we use for the notification (the onscreen alert that appears at the notification
- // area at the top of the screen as an icon -- and as text as well if the user expands the
- // notification area).
- private static final int NOTIFICATION_ID = 1;
-
- private MediaSessionCompat mMediaSession;
-
- private MediaPlayer mMediaPlayer = null;
- private NotificationManagerCompat mNotificationManager;
- private NotificationCompat.Builder mNotificationBuilder;
-
- private MusicRepository mMusicRepository;
- private int mCurrPlaybackState;
- private int mCurrActiveTrackIndex;
- private List<TrackMetadata> mTracks;
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- mMediaSession = new MediaSessionCompat(this, MusicService.class.getSimpleName());
- mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
- mMediaSession.setActive(true);
-
- mMusicRepository = MusicRepository.getInstance();
-
- mTracks = mMusicRepository.getTracks();
-
- // Attach Callback to receive MediaSession updates
- mMediaSession.setCallback(new MediaSessionCompat.Callback() {
- // Implement callbacks
- @Override
- public void onPlay() {
- super.onPlay();
- processPlayRequest();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- processPauseRequest();
- }
-
- @Override
- public void onSkipToNext() {
- super.onSkipToNext();
- processNextRequest();
- }
-
- @Override
- public void onSkipToPrevious() {
- super.onSkipToPrevious();
- processPreviousRequest();
- }
-
- @Override
- public void onStop() {
- super.onStop();
- processStopRequest();
- }
- });
-
- mNotificationManager = NotificationManagerCompat.from(this);
-
- // Register self as the observer on the LiveData object that wraps the currently
- // active track index.
- LiveData<Integer> currentlyActiveTrackData = mMusicRepository.getCurrentlyActiveTrackData();
- mCurrActiveTrackIndex = currentlyActiveTrackData.getValue();
- currentlyActiveTrackData.observe(this, new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer integer) {
- mCurrActiveTrackIndex = integer;
- if (mCurrActiveTrackIndex < 0) {
- return;
- }
-
- // Create the media player if necessary, set its data to the currently active track
- // and call prepare(). This will eventually result in an asynchronous call to
- // our onPrepared() method which will transition from PREPARING into PLAYING state.
- createMediaPlayerIfNeeded();
- try {
- mMusicRepository.setState(MusicRepository.STATE_PREPARING);
- @RawRes int trackRawRes = mTracks.get(mCurrActiveTrackIndex).getTrackRes();
- mMediaPlayer.setDataSource(getBaseContext(),
- Uri.parse(RESOURCE_PREFIX + trackRawRes));
- mMediaPlayer.prepare();
- } catch (IOException ioe) {
- }
- // As the media player is preparing the track, update the media session and the
- // notification with the metadata of that track.
- updateAudioMetadata();
- updateNotification();
- }
- });
-
- // Register self as the observer on the LiveData object that wraps the playback state.
- LiveData<Integer> stateData = mMusicRepository.getStateData();
- mCurrPlaybackState = stateData.getValue();
- stateData.observe(this, new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer integer) {
- mCurrPlaybackState = integer;
- switch (mCurrPlaybackState) {
- case MusicRepository.STATE_INITIAL:
- createMediaPlayerIfNeeded();
- break;
- case MusicRepository.STATE_PLAYING:
- // Start the media player and update the ongoing notification
- configAndStartMediaPlayer();
- updateNotification();
- break;
- case MusicRepository.STATE_PAUSED:
- // Pause the media player and update the ongoing notification
- mMediaPlayer.pause();
- updateNotification();
- }
- }
- });
- }
-
- private void createMediaPlayerIfNeeded() {
- if (mMediaPlayer == null) {
- mMediaPlayer = new MediaPlayer();
- // Make sure the media player will acquire a wake-lock while playing. If we don't do
- // that, the CPU might go to sleep while the song is playing, causing playback to stop.
- //
- // Remember that to use this, we have to declare the android.permission.WAKE_LOCK
- // permission in AndroidManifest.xml.
- mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
- // we want the media player to notify us when it's ready preparing, and when it's done
- // playing:
- mMediaPlayer.setOnPreparedListener(this);
- mMediaPlayer.setOnCompletionListener(this);
- } else {
- mMediaPlayer.reset();
- }
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- super.onStartCommand(intent, flags, startId);
-
- // Note that we don't do anything for the START action. The purpose of that action
- // is to start the service. As the service registers itself to observe changes to
- // playback state and current track, it will start the matching flows as a response
- // to those changes.
- // Here we handle service-internal actions that are registered on notification intents.
- if (intent.getAction().equals(ACTION_PLAY)) {
- processPlayRequest();
- } else if (intent.getAction().equals(ACTION_PAUSE)) {
- processPauseRequest();
- } else if (intent.getAction().equals(ACTION_STOP)) {
- processStopRequest();
- } else if (intent.getAction().equals(ACTION_NEXT)) {
- processNextRequest();
- } else if (intent.getAction().equals(ACTION_PREV)) {
- processPreviousRequest();
- }
-
- return START_NOT_STICKY;
- }
-
- private void processPlayRequest() {
- // The logic here is different depending on our current state
- if (mCurrPlaybackState == MusicRepository.STATE_STOPPED) {
- // If we're stopped, just go ahead to the next song and start playing.
- playNextSong();
- } else if (mCurrPlaybackState == MusicRepository.STATE_PAUSED) {
- // If we're paused, just continue playback. We are registered to listen to the changes
- // in LiveData that tracks the playback state, and that observer will update our ongoing
- // notification and resume the playback.
- mMusicRepository.setState(MusicRepository.STATE_PLAYING);
- }
- }
-
- private void processPauseRequest() {
- if (mCurrPlaybackState == MusicRepository.STATE_PLAYING) {
- // Move to the paused state. We are registered
- // to listen to the changes in LiveData that tracks the playback state,
- // and that observer will update our ongoing notification and pause the media
- // player.
- mMusicRepository.setState(MusicRepository.STATE_PAUSED);
- }
- }
-
- private void processStopRequest() {
- processStopRequest(false);
- }
-
- private void processStopRequest(boolean force) {
- if (mCurrPlaybackState != MusicRepository.STATE_STOPPED || force) {
- mMusicRepository.setState(MusicRepository.STATE_STOPPED);
- // let go of all resources...
- relaxResources(true);
- // cancel the notification
- mNotificationManager.cancel(NOTIFICATION_ID);
- // service is no longer necessary. Will be started again if needed.
- stopSelf();
- }
- }
-
- private void processNextRequest() {
- if (mCurrPlaybackState != MusicRepository.STATE_STOPPED) {
- playNextSong();
- }
- }
-
- private void processPreviousRequest() {
- if (mCurrPlaybackState != MusicRepository.STATE_STOPPED) {
- playPrevSong();
- }
- }
-
- /**
- * Releases resources used by the service for playback. This includes the "foreground service"
- * status and notification, the wake locks and possibly the MediaPlayer.
- *
- * @param releaseMediaPlayer Indicates whether the Media Player should also be released or not
- */
- private void relaxResources(boolean releaseMediaPlayer) {
- // stop being a foreground service
- //stopForeground(true);
- // stop and release the Media Player, if it's available
- if (releaseMediaPlayer && mMediaPlayer != null) {
- mMediaPlayer.reset();
- mMediaPlayer.release();
- mMediaPlayer = null;
- }
- }
-
- /**
- * Reconfigures MediaPlayer according to audio focus settings and starts/restarts it. This
- * method starts/restarts the MediaPlayer respecting the current audio focus state. So if
- * we have focus, it will play normally; if we don't have focus, it will either leave the
- * MediaPlayer paused or set it to a low volume, depending on what is allowed by the
- * current focus settings. This method assumes mPlayer != null, so if you are calling it,
- * you have to do so from a context where you are sure this is the case.
- */
- private void configAndStartMediaPlayer() {
- mMediaPlayer.setVolume(1.0f, 1.0f); // we can be loud
- if (!mMediaPlayer.isPlaying()) {
- mMediaPlayer.start();
- }
- }
-
- /**
- * Starts playing the next song in our repository.
- */
- private void playNextSong() {
- relaxResources(false); // release everything except MediaPlayer
-
- // Ask the repository to go to the next track. We are registered to listen to the
- // changes in LiveData that tracks the current track, and that observer will point the
- // media player to the right URI
- mMusicRepository.goToNextTrack();
- }
-
- /**
- * Starts playing the previous song in our repository.
- */
- private void playPrevSong() {
- relaxResources(false); // release everything except MediaPlayer
-
- // Ask the repository to go to the next track. We are registered to listen to the
- // changes in LiveData that tracks the current track, and that observer will point the
- // media player to the right URI
- mMusicRepository.goToPreviousTrack();
- }
-
- /**
- * Called when media player is done playing current song.
- */
- public void onCompletion(MediaPlayer player) {
- // The media player finished playing the current song, so we go ahead and start the next.
- playNextSong();
- }
-
- /** Called when media player is done preparing. */
- public void onPrepared(MediaPlayer player) {
- // The media player is done preparing. That means we can start playing!
- // We are registered to listen to the changes in LiveData that tracks the playback state,
- // and that observer will update our ongoing notification
- mMusicRepository.setState(MusicRepository.STATE_PLAYING);
- }
-
- /**
- * Configures service as a foreground service. A foreground service is a service that's doing
- * something the user is actively aware of (such as playing music), and must appear to the
- * user as a notification. That's why we create the notification here.
- */
- private void populateNotificationBuilderContent(String text) {
- PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),
- (int) (System.currentTimeMillis() & 0xfffffff),
- new Intent().setClass(getApplicationContext(), MainActivity.class)
- .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- boolean isPlaying = (mCurrPlaybackState == MusicRepository.STATE_PLAYING);
-
- // Build the notification object.
- mNotificationBuilder = new NotificationCompat.Builder(getApplicationContext());
- mNotificationBuilder.setSmallIcon(R.drawable.ic_play_arrow_white_24dp);
- mNotificationBuilder.setTicker(text);
- mNotificationBuilder.setWhen(System.currentTimeMillis());
- mNotificationBuilder.setContentTitle("RandomMusicPlayer");
- mNotificationBuilder.setContentText(text);
- mNotificationBuilder.setContentIntent(pi);
- mNotificationBuilder.setOngoing(isPlaying);
-
- int primaryActionDrawable = isPlaying ? android.R.drawable.ic_media_pause
- : android.R.drawable.ic_media_play;
- PendingIntent primaryActionIntent = isPlaying
- ? PendingIntent.getService(this, 12,
- new Intent(this, MusicService.class).setAction(ACTION_PAUSE), 0)
- : PendingIntent.getService(this, 13,
- new Intent(this, MusicService.class).setAction(ACTION_PLAY), 0);
- String primaryActionName = isPlaying ? "pause" : "play";
-
- mNotificationBuilder.addAction(android.R.drawable.ic_media_previous, "previous",
- PendingIntent.getService(this, 10,
- new Intent(this, MusicService.class).setAction(ACTION_PREV), 0));
- mNotificationBuilder.addAction(primaryActionDrawable, primaryActionName,
- primaryActionIntent);
- mNotificationBuilder.addAction(android.R.drawable.ic_media_next, "next",
- PendingIntent.getService(this, 11,
- new Intent(this, MusicService.class).setAction(ACTION_NEXT), 0));
-
- mNotificationBuilder.setStyle(new NotificationCompat.MediaStyle()
- .setShowActionsInCompactView(0, 1, 2)
- .setMediaSession(mMediaSession.getSessionToken()));
- }
-
- private void updateNotification() {
- if (mCurrPlaybackState == MusicRepository.STATE_INITIAL) {
- return;
- }
-
- if (mNotificationBuilder == null) {
- // This is the very first time we're creating our ongoing notification, and marking
- // the service to be in the foreground.
- populateNotificationBuilderContent("Initializing...");
- startForeground(NOTIFICATION_ID, mNotificationBuilder.build());
- return;
- }
-
- TrackMetadata currTrack = mTracks.get(mCurrActiveTrackIndex);
- populateNotificationBuilderContent(currTrack.getTitle()
- + " by " + currTrack.getArtist());
- mNotificationManager.notify(NOTIFICATION_ID, mNotificationBuilder.build());
- }
-
- private void updateAudioMetadata() {
- if (mCurrPlaybackState == MusicRepository.STATE_INITIAL) {
- return;
- }
- Bitmap albumArt = BitmapFactory.decodeResource(getResources(), R.drawable.nougat_bg_2x);
- // Update the current metadata
- TrackMetadata current = mTracks.get(mCurrActiveTrackIndex);
- mMediaSession.setMetadata(new MediaMetadataCompat.Builder()
- .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt)
- .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, current.getArtist())
- .putString(MediaMetadataCompat.METADATA_KEY_TITLE, "Track #" + current.getTitle())
- .build());
- }
-
- @Nullable
- @Override
- public IBinder onBind(Intent intent) {
- super.onBind(intent);
- return null;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (mMediaPlayer != null) {
- mMediaPlayer.release();
- mNotificationManager.cancel(NOTIFICATION_ID);
- stopForeground(true);
- }
- }
-}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/adapter/MusicTrackListAdapter.java b/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/adapter/MusicTrackListAdapter.java
deleted file mode 100644
index dd03302..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/java/com/android/sample/musicplayer/adapter/MusicTrackListAdapter.java
+++ /dev/null
@@ -1,96 +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 com.android.sample.musicplayer.adapter;
-
-import android.databinding.DataBindingUtil;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.Adapter;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.sample.musicplayer.MusicRepository;
-import com.android.sample.musicplayer.MusicRepository.TrackMetadata;
-import com.android.sample.musicplayer.R;
-import com.android.sample.musicplayer.databinding.MainRowBinding;
-
-import java.util.List;
-
-/**
- * Adapter for the list of music tracks.
- */
-public class MusicTrackListAdapter extends Adapter<MusicTrackListAdapter.TrackBindingHolder> {
- private List<TrackMetadata> mTracks;
- private int mActiveTrackIndex;
-
- /**
- * Holder for the track row.
- */
- public static class TrackBindingHolder extends RecyclerView.ViewHolder {
- private MainRowBinding mViewDataBinding;
-
- public TrackBindingHolder(MainRowBinding viewDataBinding) {
- super(viewDataBinding.getRoot());
- mViewDataBinding = viewDataBinding;
- }
-
- public MainRowBinding getBinding() {
- return mViewDataBinding;
- }
- }
-
- public MusicTrackListAdapter(List<TrackMetadata> tracks) {
- mTracks = tracks;
- }
-
- @Override
- public TrackBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- MainRowBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
- R.layout.main_row, parent, false);
- return new TrackBindingHolder(binding);
- }
-
- @Override
- public void onBindViewHolder(TrackBindingHolder holder, final int position) {
- MainRowBinding binding = holder.getBinding();
- binding.setTrack(mTracks.get(position));
- binding.setHandler(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Update the LiveData-wrapped current track index directly on the repository.
- // Our service observes those changes and will start the flow of preparing and
- // playing back this track.
- MusicRepository.getInstance().setTrack(position);
- }
- });
- binding.getRoot().setSelected(position == mActiveTrackIndex);
- binding.executePendingBindings();
- }
-
- @Override
- public int getItemCount() {
- return mTracks.size();
- }
-
- public void setActiveTrackIndex(int activeTrackIndex) {
- if (mActiveTrackIndex != activeTrackIndex) {
- int previousActiveTrackIndex = mActiveTrackIndex;
- mActiveTrackIndex = activeTrackIndex;
- notifyItemChanged(previousActiveTrackIndex);
- notifyItemChanged(mActiveTrackIndex);
- }
- }
-}
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
deleted file mode 100644
index 4d2ea05..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_36dp.png
deleted file mode 100644
index 1d02439..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_pause_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
deleted file mode 100644
index 57c9fa5..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png
deleted file mode 100644
index 29adeed..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_24dp.png
deleted file mode 100644
index 2272d47..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_36dp.png
deleted file mode 100644
index 4d2ea05..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_pause_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
deleted file mode 100644
index c61e948..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png
deleted file mode 100644
index 57c9fa5..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
deleted file mode 100644
index f49aed7..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png
deleted file mode 100644
index 7192ad4..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
deleted file mode 100644
index a3c80e7..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png
deleted file mode 100644
index 547ef30..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
deleted file mode 100644
index 7192ad4..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png
deleted file mode 100644
index a03bad2..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
deleted file mode 100644
index 547ef30..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png
deleted file mode 100644
index 23bb1ba..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png
deleted file mode 100644
index 660ac65..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_36dp.png
deleted file mode 100644
index 3ea7e03..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_pause_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png
deleted file mode 100644
index be5c062..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_36dp.png b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_36dp.png
deleted file mode 100644
index 2745c3a..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/nougat_bg_2x.jpg b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/nougat_bg_2x.jpg
deleted file mode 100644
index 5c7295e..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/nougat_bg_2x.jpg
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/row_selector.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/row_selector.xml
deleted file mode 100644
index f2736f4a..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/drawable/row_selector.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@color/currentTrack" android:state_selected="true"/>
- <item android:drawable="@android:color/transparent" android:state_selected="false"/>
-</selector>
\ No newline at end of file
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/activity_main.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 961b1da..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout
- 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:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fitsSystemWindows="true"
- tools:context="com.android.sample.musicplayer.MainActivity">
-
- <android.support.design.widget.AppBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:theme="@style/AppTheme.AppBarOverlay">
-
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:background="?attr/colorPrimary"
- app:popupTheme="@style/AppTheme.PopupOverlay"/>
-
- </android.support.design.widget.AppBarLayout>
-
- <include layout="@layout/content_main"/>
-
- <android.support.design.widget.FloatingActionButton
- android:id="@+id/fab"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|end"
- android:layout_margin="@dimen/fab_margin"
- app:srcCompat="@drawable/ic_play_arrow_white_36dp"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/content_main.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/layout/content_main.xml
deleted file mode 100644
index 7da0c97..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/content_main.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.RecyclerView
- android:id="@+id/recycler"
- 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:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"
- tools:context="com.android.sample.musicplayer.MainActivity"
- tools:showIn="@layout/activity_main" />
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/main_row.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/layout/main_row.xml
deleted file mode 100644
index 7d38dd6..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/layout/main_row.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
- <data>
- <import type="java.lang.Integer"/>
- <variable name="track" type="com.android.sample.musicplayer.MusicRepository.TrackMetadata"/>
- <variable name="handler" type="android.view.View.OnClickListener"/>
- </data>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/row_selector"
- android:clickable="true"
- android:focusable="true"
- android:onClick="@{handler}"
- android:padding="8dp">
- <TextView
- android:id="@+id/index"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:paddingLeft="8dp"
- android:paddingRight="16dp"
- android:text="@{Integer.toString(track.index)}"
- android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
- <TextView
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/index"
- android:text="@{track.title}"
- android:textAppearance="@style/TextAppearance.AppCompat.Small"
- android:textColor="#222"/>
- <TextView
- android:id="@+id/artist"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/title"
- android:layout_toRightOf="@id/index"
- android:text="@{track.artist}"
- android:textAppearance="@style/TextAppearance.AppCompat.Small"
- android:textColor="#666"/>
- </RelativeLayout>
-</layout>
-
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track1.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track1.mp3
deleted file mode 100644
index ec6668b..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track1.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track2.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track2.mp3
deleted file mode 100644
index b91854b..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track2.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track3.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track3.mp3
deleted file mode 100644
index 4d765e1..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track3.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track4.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track4.mp3
deleted file mode 100644
index e4e0320..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track4.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track5.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track5.mp3
deleted file mode 100644
index 412e21a..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track5.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track6.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track6.mp3
deleted file mode 100644
index b82bb02..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track6.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track7.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track7.mp3
deleted file mode 100644
index cb42ec0..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track7.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track8.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track8.mp3
deleted file mode 100644
index 37dd232..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track8.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track9.mp3 b/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track9.mp3
deleted file mode 100644
index 3c99c3a..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/raw/track9.mp3
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values-v21/styles.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values-v21/styles.xml
deleted file mode 100644
index 6b23c86..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values-v21/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<resources>
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="windowNoTitle">true</item>
- <item name="android:windowDrawsSystemBarBackgrounds">true</item>
- <item name="android:statusBarColor">@android:color/transparent</item>
- </style>
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values-w820dp/dimens.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
- <!-- Example customization of dimensions originally defined in res/values/dimens.xml
- (such as screen margins) for screens with more than 820dp of available width. This
- would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
- <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values/colors.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values/colors.xml
deleted file mode 100644
index de13610..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FFAB00</color>
-
- <color name="currentTrack">#64FFDA</color>
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values/dimens.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 812cb7b..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="fab_margin">16dp</dimen>
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values/strings.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values/strings.xml
deleted file mode 100644
index 4ca3fbf..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<resources>
- <string name="app_name">MusicPlayer</string>
- <string name="action_settings">Settings</string>
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/app/src/main/res/values/styles.xml b/samples-flatfoot/MusicPlayer/app/src/main/res/values/styles.xml
deleted file mode 100644
index 16dbab3..0000000
--- a/samples-flatfoot/MusicPlayer/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<resources>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
- <style name="AppTheme.NoActionBar">
- <item name="windowActionBar">false</item>
- <item name="windowNoTitle">true</item>
- </style>
- <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
- <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
-
-</resources>
diff --git a/samples-flatfoot/MusicPlayer/build.gradle b/samples-flatfoot/MusicPlayer/build.gradle
deleted file mode 100644
index 5d6aefc..0000000
--- a/samples-flatfoot/MusicPlayer/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.2.3'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-ext.flatfootVersion = "1.0-SNAPSHOT"
-ext.supportLibVersion = "26.0.0-SNAPSHOT"
-
-allprojects {
- repositories {
- jcenter()
- maven {
- url "file://Volumes/android/appToolkitRepository/"
- }
- maven {
- url "file://Volumes/android/m2repository/"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/samples-flatfoot/MusicPlayer/gradle.properties b/samples-flatfoot/MusicPlayer/gradle.properties
deleted file mode 100644
index aac7c9b..0000000
--- a/samples-flatfoot/MusicPlayer/gradle.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 04e285f..0000000
--- a/samples-flatfoot/MusicPlayer/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Mon Dec 28 10:00:20 PST 2015
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/samples-flatfoot/MusicPlayer/gradlew b/samples-flatfoot/MusicPlayer/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/MusicPlayer/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/MusicPlayer/gradlew.bat b/samples-flatfoot/MusicPlayer/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/MusicPlayer/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/MusicPlayer/settings.gradle b/samples-flatfoot/MusicPlayer/settings.gradle
deleted file mode 100644
index e7b4def..0000000
--- a/samples-flatfoot/MusicPlayer/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include ':app'
diff --git a/samples-flatfoot/PersistenceSample/.gitignore b/samples-flatfoot/PersistenceSample/.gitignore
deleted file mode 100644
index c33eb5b..0000000
--- a/samples-flatfoot/PersistenceSample/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-build/
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/PersistenceSample/CONTRIBUTING.md b/samples-flatfoot/PersistenceSample/CONTRIBUTING.md
deleted file mode 100644
index 7b86f95..0000000
--- a/samples-flatfoot/PersistenceSample/CONTRIBUTING.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# How to become a contributor and submit your own code
-
-## Contributor License Agreements
-
-We'd love to accept your sample apps and patches! Before we can take them, we
-have to jump a couple of legal hurdles.
-
-Please fill out either the individual or corporate Contributor License Agreement (CLA).
-
- * If you are an individual writing original source code and you're sure you
- own the intellectual property, then you'll need to sign an [individual CLA]
- (https://cla.developers.google.com).
- * If you work for a company that wants to allow you to contribute your work,
- then you'll need to sign a [corporate CLA]
- (https://cla.developers.google.com).
- * Please make sure you sign both, Android and Google CLA
-
-Follow either of the two links above to access the appropriate CLA and
-instructions for how to sign and return it. Once we receive it, we'll be able to
-accept your pull requests.
-
-## Contributing A Patch
-
-1. Submit an issue describing your proposed change to the repo in question.
-1. The repo owner will respond to your issue promptly.
-1. If your proposed change is accepted, and you haven't already done so, sign a
- Contributor License Agreement (see details above).
-1. Fork the desired repo, develop and test your code changes.
-1. Ensure that your code adheres to the existing style in the sample to which
- you are contributing. Refer to the
- [Android Code Style Guide]
- (https://source.android.com/source/code-style.html) for the
- recommended coding standards for this organization.
-1. Ensure that your code has an appropriate set of unit tests which all pass.
-1. Submit a pull request.
diff --git a/samples-flatfoot/PersistenceSample/LICENSE b/samples-flatfoot/PersistenceSample/LICENSE
deleted file mode 100644
index 1af981f..0000000
--- a/samples-flatfoot/PersistenceSample/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 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.
diff --git a/samples-flatfoot/PersistenceSample/app/build.gradle b/samples-flatfoot/PersistenceSample/app/build.gradle
deleted file mode 100644
index 41b73e6..0000000
--- a/samples-flatfoot/PersistenceSample/app/build.gradle
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion rootProject.buildToolsVersion
- defaultConfig {
- applicationId 'com.example.android.persistence'
- minSdkVersion 21
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- dataBinding {
- enabled = true
- }
- productFlavors {
- }
-
- lintOptions {
- abortOnError false
- }
-
-}
-
-dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- compile 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:cardview-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion;
- compile 'android.arch.lifecycle:extensions:1.0-SNAPSHOT'
- compile 'android.arch.persistence.room:runtime:1.0-SNAPSHOT'
- annotationProcessor "android.arch.lifecycle:compiler:1.0-SNAPSHOT"
- annotationProcessor "android.arch.persistence.room:compiler:1.0-SNAPSHOT"
-
- testCompile 'junit:junit:4.12'
-
- // Testing-only dependencies
- androidTestCompile 'com.android.support.test:runner:' + rootProject.runnerVersion;
- androidTestCompile 'com.android.support.test:rules:' + rootProject.rulesVersion;
- androidTestCompile 'com.android.support.test.espresso:espresso-core:' + rootProject.espressoVersion;
-
- androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2'){
- exclude group: 'com.android.support', module: 'appcompat-v7'
- exclude group: 'com.android.support', module: 'support-v4'
- exclude module: 'recyclerview-v7'
- }
-
- // Force usage of dependencies in the test app, since it is internally used by the runner module.
- androidTestCompile 'com.android.support:support-annotations:' + rootProject.supportLibVersion;
- androidTestCompile 'com.android.support:support-v4:' + rootProject.supportLibVersion;
- androidTestCompile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion;
-}
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/proguard-rules.pro b/samples-flatfoot/PersistenceSample/app/proguard-rules.pro
deleted file mode 100644
index 4cb7103..0000000
--- a/samples-flatfoot/PersistenceSample/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /usr/local/google/home/jalc/sw/android-sdks/android-sdk-linux/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/samples-flatfoot/PersistenceSample/app/src/androidTest/java/com/example/android/persistence/MainActivityTest.java b/samples-flatfoot/PersistenceSample/app/src/androidTest/java/com/example/android/persistence/MainActivityTest.java
deleted file mode 100644
index b9b899c..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/androidTest/java/com/example/android/persistence/MainActivityTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 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.persistence;
-
-
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.support.annotation.Nullable;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.IdlingResource;
-import android.support.test.espresso.contrib.RecyclerViewActions;
-import android.support.test.rule.ActivityTestRule;
-import android.support.v4.app.Fragment;
-
-import com.example.android.persistence.db.entity.ProductEntity;
-import com.example.android.persistence.viewmodel.ProductListViewModel;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static org.hamcrest.core.IsNot.not;
-
-public class MainActivityTest {
-
- @Rule
- public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
- MainActivity.class);
-
- private SimpleIdlingResource idlingRes = new SimpleIdlingResource();
-
- @Before
- public void idlingResourceSetup() {
-
- Espresso.registerIdlingResources(idlingRes);
- // There's always
- idlingRes.setIdleNow(false);
-
- ProductListViewModel productListViewModel = getProductListViewModel();
-
- // Subscribe to ProductListViewModel's products list observable to figure out when the
- // app is idle.
- productListViewModel.getProducts().observeForever(new Observer<List<ProductEntity>>() {
- @Override
- public void onChanged(@Nullable List<ProductEntity> productEntities) {
- if (productEntities != null) {
- idlingRes.setIdleNow(true);
- }
- }
- });
- }
-
- @Test
- public void clickOnFirstItem_opensComments() {
- // When clicking on the first product
- onView(withContentDescription(R.string.cd_products_list))
- .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
-
- // Then the second screen with the comments should appear.
- onView(withContentDescription(R.string.cd_comments_list))
- .check(matches(isDisplayed()));
-
- // Then the second screen with the comments should appear.
- onView(withContentDescription(R.string.cd_product_name))
- .check(matches(not(withText(""))));
-
- }
-
- /** Gets the ViewModel for the current fragment */
- private ProductListViewModel getProductListViewModel() {
- MainActivity activity = mActivityRule.getActivity();
-
- Fragment productListFragment = activity.getSupportFragmentManager()
- .findFragmentByTag(ProductListFragment.TAG);
-
- return ViewModelProviders.of(productListFragment)
- .get(ProductListViewModel.class);
- }
-
- private static class SimpleIdlingResource implements IdlingResource {
-
- // written from main thread, read from any thread.
- private volatile ResourceCallback mResourceCallback;
-
- private AtomicBoolean mIsIdleNow = new AtomicBoolean(true);
-
- public void setIdleNow(boolean idleNow) {
- mIsIdleNow.set(idleNow);
- if (idleNow) {
- mResourceCallback.onTransitionToIdle();
- }
- }
-
- @Override
- public String getName() {
- return "Simple idling resource";
- }
-
- @Override
- public boolean isIdleNow() {
- return mIsIdleNow.get();
- }
-
- @Override
- public void registerIdleTransitionCallback(ResourceCallback callback) {
- mResourceCallback = callback;
- }
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/AndroidManifest.xml b/samples-flatfoot/PersistenceSample/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 322d957..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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="com.example.android.persistence">
-
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
- <uses-feature android:name="android.hardware.location.gps" />
-
- <application
- android:allowBackup="false"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name="com.example.android.persistence.MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/MainActivity.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/MainActivity.java
deleted file mode 100644
index aee8255..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/MainActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 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.persistence;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.persistence.model.Product;
-
-public class MainActivity extends LifecycleActivity {
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main_activity);
-
- // Add product list fragment if this is first creation
- if (savedInstanceState == null) {
- ProductListFragment fragment = new ProductListFragment();
-
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, fragment, ProductListFragment.TAG).commit();
- }
- }
-
- /** Shows the product detail fragment */
- public void show(Product product) {
-
- ProductFragment productFragment = ProductFragment.forProduct(product.getId());
-
- getSupportFragmentManager()
- .beginTransaction()
- .addToBackStack("product")
- .replace(R.id.fragment_container,
- productFragment, null).commit();
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductFragment.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductFragment.java
deleted file mode 100644
index 53dbcbb..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductFragment.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 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.persistence;
-
-import android.arch.lifecycle.LifecycleFragment;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.example.android.persistence.databinding.ProductFragmentBinding;
-import com.example.android.persistence.db.entity.CommentEntity;
-import com.example.android.persistence.db.entity.ProductEntity;
-import com.example.android.persistence.model.Comment;
-import com.example.android.persistence.ui.CommentAdapter;
-import com.example.android.persistence.ui.CommentClickCallback;
-import com.example.android.persistence.viewmodel.ProductViewModel;
-
-import java.util.List;
-
-public class ProductFragment extends LifecycleFragment {
-
- private static final String KEY_PRODUCT_ID = "product_id";
-
- private ProductFragmentBinding mBinding;
-
- private CommentAdapter mCommentAdapter;
-
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- // Inflate this data binding layout
- mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false);
-
- // Create and set the adapter for the RecyclerView.
- mCommentAdapter = new CommentAdapter(mCommentClickCallback);
- mBinding.commentList.setAdapter(mCommentAdapter);
- return mBinding.getRoot();
- }
-
- private final CommentClickCallback mCommentClickCallback = new CommentClickCallback() {
- @Override
- public void onClick(Comment comment) {
- // no-op
-
- }
- };
-
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- ProductViewModel.Factory factory = new ProductViewModel.Factory(
- getActivity().getApplication(), getArguments().getInt(KEY_PRODUCT_ID));
-
- final ProductViewModel model = ViewModelProviders.of(this, factory)
- .get(ProductViewModel.class);
-
- mBinding.setProductViewModel(model);
-
- subscribeToModel(model);
- }
-
- private void subscribeToModel(final ProductViewModel model) {
-
- model.getComments().observe(this, new Observer<List<CommentEntity>>() {
- @Override
- public void onChanged(@Nullable List<CommentEntity> commentEntities) {
- if (commentEntities != null) {
- mBinding.setIsLoading(false);
- mCommentAdapter.setCommentList(commentEntities);
- } else {
- mBinding.setIsLoading(true);
- }
- }
- });
-
- model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
- @Override
- public void onChanged(@Nullable ProductEntity productEntity) {
- model.setProduct(productEntity);
- }
- });
- }
-
- /** Creates product fragment for specific product ID */
- public static ProductFragment forProduct(int productId) {
- ProductFragment fragment = new ProductFragment();
- Bundle args = new Bundle();
- args.putInt(KEY_PRODUCT_ID, productId);
- fragment.setArguments(args);
- return fragment;
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductListFragment.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductListFragment.java
deleted file mode 100644
index 772bc9c..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ProductListFragment.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 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.persistence;
-
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleFragment;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.databinding.DataBindingUtil;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.example.android.persistence.databinding.ListFragmentBinding;
-import com.example.android.persistence.db.entity.ProductEntity;
-import com.example.android.persistence.model.Product;
-import com.example.android.persistence.ui.ProductAdapter;
-import com.example.android.persistence.ui.ProductClickCallback;
-import com.example.android.persistence.viewmodel.ProductListViewModel;
-
-import java.util.List;
-
-public class ProductListFragment extends LifecycleFragment {
-
- public static final String TAG = "ProductListViewModel";
-
- private ProductAdapter mProductAdapter;
-
- private ListFragmentBinding mBinding;
-
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- mBinding = DataBindingUtil.inflate(inflater, R.layout.list_fragment, container, false);
-
- mProductAdapter = new ProductAdapter(mProductClickCallback);
- mBinding.productsList.setAdapter(mProductAdapter);
-
- return mBinding.getRoot();
- }
-
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final ProductListViewModel viewModel =
- ViewModelProviders.of(this).get(ProductListViewModel.class);
-
- subscribeUi(viewModel);
- }
-
- private void subscribeUi(ProductListViewModel viewModel) {
- // Update the list when the data changes
- viewModel.getProducts().observe(this, new Observer<List<ProductEntity>>() {
- @Override
- public void onChanged(@Nullable List<ProductEntity> myProducts) {
- if (myProducts != null) {
- mBinding.setIsLoading(false);
- mProductAdapter.setProductList(myProducts);
- } else {
- mBinding.setIsLoading(true);
- }
- }
- });
- }
-
- private final ProductClickCallback mProductClickCallback = new ProductClickCallback() {
- @Override
- public void onClick(Product product) {
-
- if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
- ((MainActivity) getActivity()).show(product);
- }
- }
- };
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java
deleted file mode 100644
index ce0afe4..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 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.persistence.db;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.RoomDatabase;
-import android.arch.persistence.room.TypeConverters;
-
-import com.example.android.persistence.db.dao.CommentDao;
-import com.example.android.persistence.db.dao.ProductDao;
-import com.example.android.persistence.db.entity.CommentEntity;
-import com.example.android.persistence.db.entity.ProductEntity;
-import com.example.android.persistence.db.converter.DateConverter;
-
-@Database(entities = {ProductEntity.class, CommentEntity.class}, version = 1)
-@TypeConverters(DateConverter.class)
-public abstract class AppDatabase extends RoomDatabase {
-
- static final String DATABASE_NAME = "basic-sample-db";
-
- public abstract ProductDao productDao();
-
- public abstract CommentDao commentDao();
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseCreator.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseCreator.java
deleted file mode 100644
index 5ecb884..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseCreator.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 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.persistence.db;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.persistence.room.Room;
-import android.content.Context;
-import android.os.AsyncTask;
-import android.support.annotation.Nullable;
-import android.util.Log;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static com.example.android.persistence.db.AppDatabase.DATABASE_NAME;
-
-/**
- * Creates the {@link AppDatabase} asynchronously, exposing a LiveData object to notify of creation.
- */
-public class DatabaseCreator {
-
- private static DatabaseCreator sInstance;
-
- private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();
-
- private AppDatabase mDb;
-
- private final AtomicBoolean mInitializing = new AtomicBoolean(true);
-
- // For Singleton instantiation
- private static final Object LOCK = new Object();
-
- public synchronized static DatabaseCreator getInstance(Context context) {
- if (sInstance == null) {
- synchronized (LOCK) {
- if (sInstance == null) {
- sInstance = new DatabaseCreator();
- }
- }
- }
- return sInstance;
- }
-
- /** Used to observe when the database initialization is done */
- public LiveData<Boolean> isDatabaseCreated() {
- return mIsDatabaseCreated;
- }
-
- @Nullable
- public AppDatabase getDatabase() {
- return mDb;
- }
-
- /**
- * Creates or returns a previously-created database.
- * <p>
- * Although this uses an AsyncTask which currently uses a serial executor, it's thread-safe.
- */
- public void createDb(Context context) {
-
- Log.d("DatabaseCreator", "Creating DB from " + Thread.currentThread().getName());
-
- if (!mInitializing.compareAndSet(true, false)) {
- return; // Already initializing
- }
-
- mIsDatabaseCreated.setValue(false);// Trigger an update to show a loading screen.
- new AsyncTask<Context, Void, Void>() {
-
- @Override
- protected Void doInBackground(Context... params) {
- Log.d("DatabaseCreator",
- "Starting bg job " + Thread.currentThread().getName());
-
- Context context = params[0].getApplicationContext();
-
- // Reset the database to have new data on every run.
- context.deleteDatabase(DATABASE_NAME);
-
- // Build the database!
- AppDatabase db = Room.databaseBuilder(context.getApplicationContext(),
- AppDatabase.class, DATABASE_NAME).build();
-
- // Add a delay to simulate a long-running operation
- addDelay();
-
- // Add some data to the database
- DatabaseInitUtil.initializeDb(db);
- Log.d("DatabaseCreator",
- "DB was populated in thread " + Thread.currentThread().getName());
-
- mDb = db;
- return null;
- }
-
- @Override
- protected void onPostExecute(Void ignored) {
- // Now on the main thread, notify observers that the db is created and ready.
- mIsDatabaseCreated.setValue(true);
- }
- }.execute(context.getApplicationContext());
- }
-
- private void addDelay() {
- try {
- Thread.sleep(4000);
- } catch (InterruptedException ignored) {}
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseInitUtil.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseInitUtil.java
deleted file mode 100644
index c68fe8f..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/DatabaseInitUtil.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 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.persistence.db;
-
-import com.example.android.persistence.db.entity.CommentEntity;
-import com.example.android.persistence.db.entity.ProductEntity;
-import com.example.android.persistence.model.Product;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-/** Generates dummy data and inserts them into the database */
-class DatabaseInitUtil {
-
- private static final String[] FIRST = new String[]{
- "Special edition", "New", "Cheap", "Quality", "Used"};
- private static final String[] SECOND = new String[]{
- "Three-headed Monkey", "Rubber Chicken", "Pint of Grog", "Monocle"};
- private static final String[] DESCRIPTION = new String[]{
- "is finally here", "is recommended by Stan S. Stanman",
- "is the best sold product on Mêlée Island", "is \uD83D\uDCAF", "is ❤️", "is fine"};
- private static final String[] COMMENTS = new String[]{
- "Comment 1", "Comment 2", "Comment 3", "Comment 4", "Comment 5", "Comment 6",
- };
-
- static void initializeDb(AppDatabase db) {
- List<ProductEntity> products = new ArrayList<>(FIRST.length * SECOND.length);
- List<CommentEntity> comments = new ArrayList<>();
-
- generateData(products, comments);
-
- insertData(db, products, comments);
- }
-
- private static void generateData(List<ProductEntity> products, List<CommentEntity> comments) {
- Random rnd = new Random();
- for (int i = 0; i < FIRST.length; i++) {
- for (int j = 0; j < SECOND.length; j++) {
- ProductEntity product = new ProductEntity();
- product.setName(FIRST[i] + " " + SECOND[j]);
- product.setDescription(product.getName() + " " + DESCRIPTION[j]);
- product.setPrice(rnd.nextInt(240));
- product.setId(FIRST.length * i + j + 1);
- products.add(product);
- }
- }
-
- for (Product product : products) {
- int commentsNumber = rnd.nextInt(5) + 1;
- for (int i = 0; i < commentsNumber; i++) {
- CommentEntity comment = new CommentEntity();
- comment.setProductId(product.getId());
- comment.setText(COMMENTS[i] + " for " + product.getName());
- comment.setPostedAt(new Date(System.currentTimeMillis()
- - TimeUnit.DAYS.toMillis(commentsNumber - i) + TimeUnit.HOURS.toMillis(i)));
- comments.add(comment);
- }
- }
- }
-
- private static void insertData(AppDatabase db, List<ProductEntity> products, List<CommentEntity> comments) {
- db.beginTransaction();
- try {
- db.productDao().insertAll(products);
- db.commentDao().insertAll(comments);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/converter/DateConverter.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/converter/DateConverter.java
deleted file mode 100644
index da5fe22..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/converter/DateConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 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.persistence.db.converter;
-
-import android.arch.persistence.room.TypeConverter;
-
-import java.util.Date;
-
-public class DateConverter {
- @TypeConverter
- public static Date toDate(Long timestamp) {
- return timestamp == null ? null : new Date(timestamp);
- }
-
- @TypeConverter
- public static Long toTimestamp(Date date) {
- return date == null ? null : date.getTime();
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/CommentDao.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/CommentDao.java
deleted file mode 100644
index b351526..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/CommentDao.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 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.persistence.db.dao;
-
-
-import android.arch.lifecycle.LiveData;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-
-import com.example.android.persistence.db.entity.CommentEntity;
-
-import java.util.List;
-
-@Dao
-public interface CommentDao {
- @Query("SELECT * FROM comments where productId = :productId")
- LiveData<List<CommentEntity>> loadComments(int productId);
-
- @Query("SELECT * FROM comments where productId = :productId")
- List<CommentEntity> loadCommentsSync(int productId);
-
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertAll(List<CommentEntity> products);
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/ProductDao.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/ProductDao.java
deleted file mode 100644
index 39407d06..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/dao/ProductDao.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 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.persistence.db.dao;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-
-import com.example.android.persistence.db.entity.ProductEntity;
-
-import java.util.List;
-
-@Dao
-public interface ProductDao {
- @Query("SELECT * FROM products")
- LiveData<List<ProductEntity>> loadAllProducts();
-
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insertAll(List<ProductEntity> products);
-
- @Query("select * from products where id = :productId")
- LiveData<ProductEntity> loadProduct(int productId);
-
- @Query("select * from products where id = :productId")
- ProductEntity loadProductSync(int productId);
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/CommentEntity.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/CommentEntity.java
deleted file mode 100644
index e3d5702..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/CommentEntity.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 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.persistence.db.entity;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.ForeignKey;
-import android.arch.persistence.room.Index;
-import android.arch.persistence.room.PrimaryKey;
-import com.example.android.persistence.model.Comment;
-
-import java.util.Date;
-
-@Entity(tableName = "comments", foreignKeys = {
- @ForeignKey(entity = ProductEntity.class,
- parentColumns = "id",
- childColumns = "productId",
- onDelete = ForeignKey.CASCADE)}, indices = {
- @Index(value = "productId")
-})
-public class CommentEntity implements Comment {
- @PrimaryKey(autoGenerate = true)
- private int id;
- private int productId;
- private String text;
- private Date postedAt;
-
- @Override
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @Override
- public int getProductId() {
- return productId;
- }
-
- public void setProductId(int productId) {
- this.productId = productId;
- }
-
- @Override
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-
- @Override
- public Date getPostedAt() {
- return postedAt;
- }
-
- public void setPostedAt(Date postedAt) {
- this.postedAt = postedAt;
- }
-
- public CommentEntity() {
- }
-
- public CommentEntity(Comment comment) {
- id = comment.getId();
- productId = comment.getProductId();
- text = comment.getText();
- postedAt = comment.getPostedAt();
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/ProductEntity.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/ProductEntity.java
deleted file mode 100644
index af1b79a..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/db/entity/ProductEntity.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 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.persistence.db.entity;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-import com.example.android.persistence.model.Product;
-
-@Entity(tableName = "products")
-public class ProductEntity implements Product {
- @PrimaryKey
- private int id;
- private String name;
- private String description;
- private int price;
-
- @Override
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- @Override
- public int getPrice() {
- return price;
- }
-
- public void setPrice(int price) {
- this.price = price;
- }
-
- public ProductEntity() {
- }
-
- public ProductEntity(Product product) {
- this.id = product.getId();
- this.name = product.getName();
- this.description = product.getDescription();
- this.price = product.getPrice();
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Comment.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Comment.java
deleted file mode 100644
index c3483a4..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Comment.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 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.persistence.model;
-
-import java.util.Date;
-
-public interface Comment {
- int getId();
- int getProductId();
- String getText();
- Date getPostedAt();
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Product.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Product.java
deleted file mode 100644
index 72e4276..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/model/Product.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 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.persistence.model;
-
-public interface Product {
- int getId();
- String getName();
- String getDescription();
- int getPrice();
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/BindingAdapters.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/BindingAdapters.java
deleted file mode 100644
index 0b90335..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/BindingAdapters.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 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.persistence.ui;
-
-import android.databinding.BindingAdapter;
-import android.view.View;
-
-
-public class BindingAdapters {
- @BindingAdapter("visibleGone")
- public static void showHide(View view, boolean show) {
- view.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentAdapter.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentAdapter.java
deleted file mode 100644
index 24e0ecb..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentAdapter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 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.persistence.ui;
-
-import android.databinding.DataBindingUtil;
-import android.support.annotation.Nullable;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.example.android.persistence.databinding.CommentItemBinding;
-import com.example.android.persistence.model.Comment;
-import com.example.android.persistence.R;
-
-import java.util.List;
-import java.util.Objects;
-
-public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentViewHolder> {
-
- private List<? extends Comment> mCommentList;
-
- @Nullable
- private final CommentClickCallback mCommentClickCallback;
-
- public CommentAdapter(@Nullable CommentClickCallback commentClickCallback) {
- mCommentClickCallback = commentClickCallback;
- }
-
- public void setCommentList(final List<? extends Comment> comments) {
- if (mCommentList == null) {
- mCommentList = comments;
- notifyItemRangeInserted(0, comments.size());
- } else {
- DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
- @Override
- public int getOldListSize() {
- return mCommentList.size();
- }
-
- @Override
- public int getNewListSize() {
- return comments.size();
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- Comment old = mCommentList.get(oldItemPosition);
- Comment comment = comments.get(newItemPosition);
- return old.getId() == comment.getId();
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- Comment old = mCommentList.get(oldItemPosition);
- Comment comment = comments.get(newItemPosition);
- return old.getId() == comment.getId()
- && old.getPostedAt() == comment.getPostedAt()
- && old.getProductId() == comment.getProductId()
- && Objects.equals(old.getText(), comment.getText());
- }
- });
- mCommentList = comments;
- diffResult.dispatchUpdatesTo(this);
- }
- }
-
- @Override
- public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- CommentItemBinding binding = DataBindingUtil
- .inflate(LayoutInflater.from(parent.getContext()), R.layout.comment_item,
- parent, false);
- binding.setCallback(mCommentClickCallback);
- return new CommentViewHolder(binding);
- }
-
- @Override
- public void onBindViewHolder(CommentViewHolder holder, int position) {
- holder.binding.setComment(mCommentList.get(position));
- holder.binding.executePendingBindings();
- }
-
- @Override
- public int getItemCount() {
- return mCommentList == null ? 0 : mCommentList.size();
- }
-
- static class CommentViewHolder extends RecyclerView.ViewHolder {
-
- final CommentItemBinding binding;
-
- CommentViewHolder(CommentItemBinding binding) {
- super(binding.getRoot());
- this.binding = binding;
- }
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentClickCallback.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentClickCallback.java
deleted file mode 100644
index ced8065..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/CommentClickCallback.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 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.persistence.ui;
-
-import com.example.android.persistence.model.Comment;
-
-public interface CommentClickCallback {
- void onClick(Comment comment);
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductAdapter.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductAdapter.java
deleted file mode 100644
index e54c1ca..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductAdapter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 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.persistence.ui;
-
-import android.databinding.DataBindingUtil;
-import android.support.annotation.Nullable;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.example.android.persistence.databinding.ProductItemBinding;
-import com.example.android.persistence.model.Product;
-import com.example.android.persistence.R;
-
-import java.util.List;
-import java.util.Objects;
-
-public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {
-
- List<? extends Product> mProductList;
-
- @Nullable
- private final ProductClickCallback mProductClickCallback;
-
- public ProductAdapter(@Nullable ProductClickCallback clickCallback) {
- mProductClickCallback = clickCallback;
- }
-
- public void setProductList(final List<? extends Product> productList) {
- if (mProductList == null) {
- mProductList = productList;
- notifyItemRangeInserted(0, productList.size());
- } else {
- DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
- @Override
- public int getOldListSize() {
- return mProductList.size();
- }
-
- @Override
- public int getNewListSize() {
- return productList.size();
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mProductList.get(oldItemPosition).getId() ==
- productList.get(newItemPosition).getId();
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- Product product = productList.get(newItemPosition);
- Product old = productList.get(oldItemPosition);
- return product.getId() == old.getId()
- && Objects.equals(product.getDescription(), old.getDescription())
- && Objects.equals(product.getName(), old.getName())
- && product.getPrice() == old.getPrice();
- }
- });
- mProductList = productList;
- result.dispatchUpdatesTo(this);
- }
- }
-
- @Override
- public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- ProductItemBinding binding = DataBindingUtil
- .inflate(LayoutInflater.from(parent.getContext()), R.layout.product_item,
- parent, false);
- binding.setCallback(mProductClickCallback);
- return new ProductViewHolder(binding);
- }
-
- @Override
- public void onBindViewHolder(ProductViewHolder holder, int position) {
- holder.binding.setProduct(mProductList.get(position));
- holder.binding.executePendingBindings();
- }
-
- @Override
- public int getItemCount() {
- return mProductList == null ? 0 : mProductList.size();
- }
-
- static class ProductViewHolder extends RecyclerView.ViewHolder {
-
- final ProductItemBinding binding;
-
- public ProductViewHolder(ProductItemBinding binding) {
- super(binding.getRoot());
- this.binding = binding;
- }
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductClickCallback.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductClickCallback.java
deleted file mode 100644
index b8f4c6b..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/ui/ProductClickCallback.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 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.persistence.ui;
-
-import com.example.android.persistence.model.Product;
-
-public interface ProductClickCallback {
- void onClick(Product product);
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductListViewModel.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductListViewModel.java
deleted file mode 100644
index 8905b14..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductListViewModel.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 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.persistence.viewmodel;
-
-import android.app.Application;
-import android.arch.core.util.Function;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.Transformations;
-
-import com.example.android.persistence.db.DatabaseCreator;
-import com.example.android.persistence.db.entity.ProductEntity;
-
-import java.util.List;
-
-public class ProductListViewModel extends AndroidViewModel {
-
- private static final MutableLiveData ABSENT = new MutableLiveData();
- {
- //noinspection unchecked
- ABSENT.setValue(null);
- }
-
- private final LiveData<List<ProductEntity>> mObservableProducts;
-
- public ProductListViewModel(Application application) {
- super(application);
-
- final DatabaseCreator databaseCreator = DatabaseCreator.getInstance(this.getApplication());
-
- LiveData<Boolean> databaseCreated = databaseCreator.isDatabaseCreated();
- mObservableProducts = Transformations.switchMap(databaseCreated,
- new Function<Boolean, LiveData<List<ProductEntity>>>() {
- @Override
- public LiveData<List<ProductEntity>> apply(Boolean isDbCreated) {
- if (!Boolean.TRUE.equals(isDbCreated)) { // Not needed here, but watch out for null
- //noinspection unchecked
- return ABSENT;
- } else {
- //noinspection ConstantConditions
- return databaseCreator.getDatabase().productDao().loadAllProducts();
- }
- }
- });
-
- databaseCreator.createDb(this.getApplication());
- }
-
- /**
- * Expose the LiveData Products query so the UI can observe it.
- */
- public LiveData<List<ProductEntity>> getProducts() {
- return mObservableProducts;
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductViewModel.java b/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductViewModel.java
deleted file mode 100644
index be524d5..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductViewModel.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 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.persistence.viewmodel;
-
-import android.app.Application;
-import android.arch.core.util.Function;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.Transformations;
-import android.arch.lifecycle.ViewModel;
-import android.arch.lifecycle.ViewModelProvider;
-import android.databinding.ObservableField;
-import android.support.annotation.NonNull;
-
-import com.example.android.persistence.db.DatabaseCreator;
-import com.example.android.persistence.db.entity.CommentEntity;
-import com.example.android.persistence.db.entity.ProductEntity;
-
-import java.util.List;
-
-public class ProductViewModel extends AndroidViewModel {
-
- private static final MutableLiveData ABSENT = new MutableLiveData();
-
- private final LiveData<ProductEntity> mObservableProduct;
-
- private Observer<ProductEntity> mProductObserver;
-
- public ObservableField<ProductEntity> product = new ObservableField<>();
-
- {
- //noinspection unchecked
- ABSENT.setValue(null);
- }
-
- // Product exposed for data binding
- //public final ObservableField<ProductEntity> product = new ObservableField<>();
-
- private final int mProductId;
-
- private final LiveData<List<CommentEntity>> mObservableComments;
-
- public ProductViewModel(@NonNull Application application,
- final int productId) {
- super(application);
- mProductId = productId;
-
- final DatabaseCreator databaseCreator = DatabaseCreator.getInstance(this.getApplication());
-
- mObservableComments = Transformations.switchMap(databaseCreator.isDatabaseCreated(), new Function<Boolean, LiveData<List<CommentEntity>>>() {
- @Override
- public LiveData<List<CommentEntity>> apply(Boolean isDbCreated) {
- if (!isDbCreated) {
- //noinspection unchecked
- return ABSENT;
- } else {
- //noinspection ConstantConditions
- return databaseCreator.getDatabase().commentDao().loadComments(mProductId);
- }
- }
- });
-
- mObservableProduct = Transformations.switchMap(databaseCreator.isDatabaseCreated(), new Function<Boolean, LiveData<ProductEntity>>() {
- @Override
- public LiveData<ProductEntity> apply(Boolean isDbCreated) {
- if (!isDbCreated) {
- //noinspection unchecked
- return ABSENT;
- } else {
- //noinspection ConstantConditions
- return databaseCreator.getDatabase().productDao().loadProduct(mProductId);
- }
- }
- });
-
- databaseCreator.createDb(this.getApplication());
-
- }
- /**
- * Expose the LiveData Comments query so the UI can observe it.
- */
- public LiveData<List<CommentEntity>> getComments() {
- return mObservableComments;
- }
-
- public LiveData<ProductEntity> getObservableProduct() {
- return mObservableProduct;
- }
-
- public void setProduct(ProductEntity product) {
- this.product.set(product);
- }
-
- /**
- * A creator is used to inject the product ID into the ViewModel
- * <p>
- * This creator is to showcase how to inject dependencies into ViewModels. It's not
- * actually necessary in this case, as the product ID can be passed in a public method.
- */
- public static class Factory extends ViewModelProvider.NewInstanceFactory {
-
- @NonNull
- private final Application mApplication;
-
- private final int mProductId;
-
- public Factory(@NonNull Application application, int productId) {
- mApplication = application;
- mProductId = productId;
- }
-
- @Override
- public <T extends ViewModel> T create(Class<T> modelClass) {
- //noinspection unchecked
- return (T) new ProductViewModel(mApplication, mProductId);
- }
- }
-}
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/comment_item.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/layout/comment_item.xml
deleted file mode 100644
index e1bf7f4..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/comment_item.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <variable name="comment"
- type="com.example.android.persistence.model.Comment"/>
- <variable name="callback"
- type="com.example.android.persistence.ui.CommentClickCallback"/>
- </data>
- <android.support.v7.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:cardBackgroundColor="@color/comment_light_background"
- android:layout_marginStart="@dimen/comment_horizontal_margin"
- android:layout_marginEnd="@dimen/comment_horizontal_margin"
-
- android:minHeight="@dimen/comment_minHeight"
- android:onClick="@{() -> callback.onClick(comment)}"
- android:orientation="horizontal"
- android:padding="8dp"
- app:cardUseCompatPadding="true">
- <RelativeLayout android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/comment_padding"
- android:text="@{comment.text}"/>
- </RelativeLayout>
- </android.support.v7.widget.CardView>
-</layout>
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/list_fragment.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/layout/list_fragment.xml
deleted file mode 100644
index 4f1d382..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/list_fragment.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
-
- <data>
- <variable
- name="isLoading"
- type="boolean" />
- </data>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/cardview_light_background"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/loading_tv"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center_vertical|center_horizontal"
- android:text="@string/loading_products"
- android:textAlignment="center"
- app:visibleGone="@{isLoading}"/>
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/products_list"
- android:contentDescription="@string/cd_products_list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layoutManager="LinearLayoutManager"
- app:visibleGone="@{!isLoading}"/>
-
- </LinearLayout>
-</layout>
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/main_activity.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/layout/main_activity.xml
deleted file mode 100644
index 29ee166..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/main_activity.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-</FrameLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_fragment.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_fragment.xml
deleted file mode 100644
index f80d69f..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_fragment.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
-
- <data>
-
- <import type="android.view.View"/>
-
- <variable
- name="isLoading"
- type="boolean" />
-
- <variable
- name="productViewModel"
- type="com.example.android.persistence.viewmodel.ProductViewModel"/>
- </data>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/cardview_light_background"
- android:orientation="vertical">
-
- <include
- layout="@layout/product_item"
- app:product="@{productViewModel.product}"/>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:id="@+id/loading_comments_tv"
- android:text="@string/loading_comments"
- app:visibleGone="@{isLoading}"/>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:id="@+id/comments_list_wrapper">
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/comment_list"
- android:contentDescription="@string/cd_comments_list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layoutManager="LinearLayoutManager"
- app:visibleGone="@{!isLoading}"/>
- </FrameLayout>
- </FrameLayout>
-
-
- </LinearLayout>
-</layout>
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_item.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_item.xml
deleted file mode 100644
index aa85489..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/layout/product_item.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <data>
- <variable name="product"
- type="com.example.android.persistence.model.Product"/>
- <variable name="callback"
- type="com.example.android.persistence.ui.ProductClickCallback"/>
- </data>
-
- <android.support.v7.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/product_item_min_height"
- android:onClick="@{() -> callback.onClick(product)}"
- android:orientation="horizontal"
- android:layout_marginStart="@dimen/item_horizontal_margin"
- android:layout_marginEnd="@dimen/item_horizontal_margin"
- app:cardUseCompatPadding="true">
-
- <RelativeLayout
- android:layout_marginStart="@dimen/item_horizontal_margin"
- android:layout_marginEnd="@dimen/item_horizontal_margin"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <TextView
- android:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/cd_product_name"
- android:text="@{product.name}"/>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_marginEnd="5dp"
- android:text="@{@string/product_price(product.price)}"/>
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/name"
- android:text="@{product.description}"/>
- </RelativeLayout>
-
- </android.support.v7.widget.CardView>
-</layout>
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index e19d44f..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 7876250..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 9ae3725..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6a6c3aa..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 43ca523..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/values/colors.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/values/colors.xml
deleted file mode 100644
index c481ea4..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
-
- <color name="comment_light_background">#d6d6d6</color>
-</resources>
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/values/dimens.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 265e367..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- ~ Copyright 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>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="item_horizontal_margin">8dp</dimen>
- <dimen name="comment_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="comment_padding">8dp</dimen>
- <dimen name="comment_minHeight">64dp</dimen>
-</resources>
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/values/product_app.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/values/product_app.xml
deleted file mode 100644
index d1fe819..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/values/product_app.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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>
- <string name="product_price">Price: $%d</string>
- <dimen name="product_item_min_height">100dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/values/strings.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/values/strings.xml
deleted file mode 100644
index 04a5057..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- ~ Copyright 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>
- <string name="app_name">Persistence sample</string>
- <string name="no_comments">No comments</string>
- <string name="loading_comments">Loading comments...</string>
- <string name="loading_products">Loading products...</string>
- <string name="cd_products_list">Products list</string>
- <string name="cd_comments_list">Comments list</string>
- <string name="cd_product_name">Name of the product</string>
-</resources>
diff --git a/samples-flatfoot/PersistenceSample/app/src/main/res/values/styles.xml b/samples-flatfoot/PersistenceSample/app/src/main/res/values/styles.xml
deleted file mode 100644
index 7aa7228..0000000
--- a/samples-flatfoot/PersistenceSample/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- ~ Copyright 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>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
-
-</resources>
diff --git a/samples-flatfoot/PersistenceSample/build.gradle b/samples-flatfoot/PersistenceSample/build.gradle
deleted file mode 100644
index f8c0790..0000000
--- a/samples-flatfoot/PersistenceSample/build.gradle
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 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.
- */
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.3.1'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- maven {
- url "../../prebuilts0905"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
-
-ext {
- buildToolsVersion = "25.0.2"
- supportLibVersion = "25.3.1"
- runnerVersion = "0.5"
- rulesVersion = "0.5"
- espressoVersion = "2.2.2"
-}
\ No newline at end of file
diff --git a/samples-flatfoot/PersistenceSample/gradle.properties b/samples-flatfoot/PersistenceSample/gradle.properties
deleted file mode 100644
index 684bee6..0000000
--- a/samples-flatfoot/PersistenceSample/gradle.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 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.
-#
-
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 37b4e8c..0000000
--- a/samples-flatfoot/PersistenceSample/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright 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.
-#
-
-#Mon Apr 24 18:19:01 CEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/samples-flatfoot/PersistenceSample/gradlew b/samples-flatfoot/PersistenceSample/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/PersistenceSample/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/PersistenceSample/gradlew.bat b/samples-flatfoot/PersistenceSample/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/PersistenceSample/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/PersistenceSample/settings.gradle b/samples-flatfoot/PersistenceSample/settings.gradle
deleted file mode 100644
index a266f7d..0000000
--- a/samples-flatfoot/PersistenceSample/settings.gradle
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 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.
- */
-
-include ':app'
diff --git a/samples-flatfoot/codelabs/CONTRIBUTING.md b/samples-flatfoot/codelabs/CONTRIBUTING.md
deleted file mode 100644
index 7b86f95..0000000
--- a/samples-flatfoot/codelabs/CONTRIBUTING.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# How to become a contributor and submit your own code
-
-## Contributor License Agreements
-
-We'd love to accept your sample apps and patches! Before we can take them, we
-have to jump a couple of legal hurdles.
-
-Please fill out either the individual or corporate Contributor License Agreement (CLA).
-
- * If you are an individual writing original source code and you're sure you
- own the intellectual property, then you'll need to sign an [individual CLA]
- (https://cla.developers.google.com).
- * If you work for a company that wants to allow you to contribute your work,
- then you'll need to sign a [corporate CLA]
- (https://cla.developers.google.com).
- * Please make sure you sign both, Android and Google CLA
-
-Follow either of the two links above to access the appropriate CLA and
-instructions for how to sign and return it. Once we receive it, we'll be able to
-accept your pull requests.
-
-## Contributing A Patch
-
-1. Submit an issue describing your proposed change to the repo in question.
-1. The repo owner will respond to your issue promptly.
-1. If your proposed change is accepted, and you haven't already done so, sign a
- Contributor License Agreement (see details above).
-1. Fork the desired repo, develop and test your code changes.
-1. Ensure that your code adheres to the existing style in the sample to which
- you are contributing. Refer to the
- [Android Code Style Guide]
- (https://source.android.com/source/code-style.html) for the
- recommended coding standards for this organization.
-1. Ensure that your code has an appropriate set of unit tests which all pass.
-1. Submit a pull request.
diff --git a/samples-flatfoot/codelabs/LICENSE b/samples-flatfoot/codelabs/LICENSE
deleted file mode 100644
index 1af981f..0000000
--- a/samples-flatfoot/codelabs/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 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.
diff --git a/samples-flatfoot/codelabs/lifecycle/.gitignore b/samples-flatfoot/codelabs/lifecycle/.gitignore
deleted file mode 100644
index c33eb5b..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-build/
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_1.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_1.xml
deleted file mode 100644
index 0dfbdcb..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_1.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 1" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step1.ChronoActivity1" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_2___ViewModel.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_2___ViewModel.xml
deleted file mode 100644
index 7d2f95d..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_2___ViewModel.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 2 - ViewModel" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step2.ChronoActivity2" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData.xml
deleted file mode 100644
index c924446..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 3 - LiveData" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step3.ChronoActivity3" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData_solution.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData_solution.xml
deleted file mode 100644
index 546a8ad..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_3___LiveData_solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 3 - LiveData solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step3_solution.ChronoActivity3" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider.xml
deleted file mode 100644
index c23cba6..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 4 - Lifecycle provider" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step4.LocationActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider_solution.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider_solution.xml
deleted file mode 100644
index 01c21e4..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_4___Lifecycle_provider_solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 4 - Lifecycle provider solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step4_solution.LocationActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs.xml
deleted file mode 100644
index 55b1e43..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 5 - Sharing VMs" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step5.Activity_step5" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs_solution.xml b/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs_solution.xml
deleted file mode 100644
index a060505..0000000
--- a/samples-flatfoot/codelabs/lifecycle/.idea/runConfigurations/Step_5___Sharing_VMs_solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 5 - Sharing VMs solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.lifecycles.step5_solution.Activity_step5" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/CONTRIBUTING.md b/samples-flatfoot/codelabs/lifecycle/CONTRIBUTING.md
deleted file mode 100644
index 7b86f95..0000000
--- a/samples-flatfoot/codelabs/lifecycle/CONTRIBUTING.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# How to become a contributor and submit your own code
-
-## Contributor License Agreements
-
-We'd love to accept your sample apps and patches! Before we can take them, we
-have to jump a couple of legal hurdles.
-
-Please fill out either the individual or corporate Contributor License Agreement (CLA).
-
- * If you are an individual writing original source code and you're sure you
- own the intellectual property, then you'll need to sign an [individual CLA]
- (https://cla.developers.google.com).
- * If you work for a company that wants to allow you to contribute your work,
- then you'll need to sign a [corporate CLA]
- (https://cla.developers.google.com).
- * Please make sure you sign both, Android and Google CLA
-
-Follow either of the two links above to access the appropriate CLA and
-instructions for how to sign and return it. Once we receive it, we'll be able to
-accept your pull requests.
-
-## Contributing A Patch
-
-1. Submit an issue describing your proposed change to the repo in question.
-1. The repo owner will respond to your issue promptly.
-1. If your proposed change is accepted, and you haven't already done so, sign a
- Contributor License Agreement (see details above).
-1. Fork the desired repo, develop and test your code changes.
-1. Ensure that your code adheres to the existing style in the sample to which
- you are contributing. Refer to the
- [Android Code Style Guide]
- (https://source.android.com/source/code-style.html) for the
- recommended coding standards for this organization.
-1. Ensure that your code has an appropriate set of unit tests which all pass.
-1. Submit a pull request.
diff --git a/samples-flatfoot/codelabs/lifecycle/LICENSE b/samples-flatfoot/codelabs/lifecycle/LICENSE
deleted file mode 100644
index 1af981f..0000000
--- a/samples-flatfoot/codelabs/lifecycle/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 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.
diff --git a/samples-flatfoot/codelabs/lifecycle/app/build.gradle b/samples-flatfoot/codelabs/lifecycle/app/build.gradle
deleted file mode 100644
index 7a9e955..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/build.gradle
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId 'com.example.android.codelabs.lifecycle'
- minSdkVersion 21
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- dataBinding {
- enabled = true
- }
- productFlavors {
- }
-}
-
-dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- androidTestCompile('com.android.support.test.espresso:espresso-core:' + rootProject.espressoVersion, {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:cardview-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion;
- testCompile 'junit:junit:4.12'
- compile 'android.arch.lifecycle:extensions:' + rootProject.archLifecycleVersion;
- compile 'android.arch.persistence.room:runtime:' + rootProject.archRoomVersion;
- annotationProcessor 'android.arch.lifecycle:compiler:' + rootProject.archLifecycleVersion;
- annotationProcessor 'android.arch.persistence.room:compiler:' + rootProject.archRoomVersion;
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/proguard-rules.pro b/samples-flatfoot/codelabs/lifecycle/app/proguard-rules.pro
deleted file mode 100644
index 4cb7103..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /usr/local/google/home/jalc/sw/android-sdks/android-sdk-linux/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/AndroidManifest.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 1327ac7..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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="com.example.android.codelabs.lifecycle">
-
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
- <uses-feature android:name="android.hardware.location.gps" />
-
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name="com.example.android.lifecycles.step1.ChronoActivity1">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step2.ChronoActivity2">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step3.ChronoActivity3">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step3_solution.ChronoActivity3">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step4_solution.LocationActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step4.LocationActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step5.Activity_step5">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.lifecycles.step5_solution.Activity_step5">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step1/ChronoActivity1.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step1/ChronoActivity1.java
deleted file mode 100644
index d7dcf59..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step1/ChronoActivity1.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 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.lifecycles.step1;
-
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.widget.Chronometer;
-
-import com.example.android.codelabs.lifecycle.R;
-
-
-public class ChronoActivity1 extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
-
- chronometer.start();
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronoActivity2.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronoActivity2.java
deleted file mode 100644
index 4ef5e23..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronoActivity2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 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.lifecycles.step2;
-
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.widget.Chronometer;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.lifecycle.R;
-
-public class ChronoActivity2 extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- // The ViewModelStore provides a new ViewModel or one previously created.
- ChronometerViewModel chronometerViewModel
- = ViewModelProviders.of(this).get(ChronometerViewModel.class);
-
- // Get the chronometer reference
- Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
-
- if (chronometerViewModel.getStartDate() == null) {
- // If the start date is not defined, it's a new ViewModel so set it.
- long startTime = SystemClock.elapsedRealtime();
- chronometerViewModel.setStartDate(startTime);
- chronometer.setBase(startTime);
- } else {
- // Otherwise the ViewModel has been retained, set the chronometer's base to the original
- // starting time.
- chronometer.setBase(chronometerViewModel.getStartDate());
- }
-
- chronometer.start();
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronometerViewModel.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronometerViewModel.java
deleted file mode 100644
index 136ed50..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step2/ChronometerViewModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 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.lifecycles.step2;
-
-import android.support.annotation.Nullable;
-
-import android.arch.lifecycle.ViewModel;
-
-/**
- * A ViewModel used for the {@link ChronoActivity2}.
- */
-public class ChronometerViewModel extends ViewModel {
-
- @Nullable
- private Long startDate;
-
- @Nullable
- public Long getStartDate() {
- return startDate;
- }
-
- public void setStartDate(final long startDate) {
- this.startDate = startDate;
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/ChronoActivity3.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/ChronoActivity3.java
deleted file mode 100644
index 4ff1a87..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/ChronoActivity3.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 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.lifecycles.step3;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.util.Log;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.lifecycle.R;
-
-
-public class ChronoActivity3 extends LifecycleActivity {
-
- private LiveDataTimerViewModel chronometerViewModel;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.chrono_activity_3);
-
- chronometerViewModel = ViewModelProviders.of(this).get(LiveDataTimerViewModel.class);
-
- subscribe();
- }
-
- private void subscribe() {
- final Observer<Long> elapsedTimeObserver = new Observer<Long>() {
- @Override
- public void onChanged(@Nullable final Long aLong) {
- String newText = ChronoActivity3.this.getResources().getString(R.string.seconds, aLong);
- ((TextView) findViewById(R.id.timer_textview)).setText(newText);
- Log.d("ChronoActivity3", "Updating timer");
- }
- };
-
- //TODO: observe the ViewModel's elapsed time
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/LiveDataTimerViewModel.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/LiveDataTimerViewModel.java
deleted file mode 100644
index cc88d7c..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3/LiveDataTimerViewModel.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 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.lifecycles.step3;
-
-import android.arch.lifecycle.MutableLiveData;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.ViewModel;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * A ViewModel used for the {@link ChronoActivity3}.
- */
-public class LiveDataTimerViewModel extends ViewModel {
-
- private static final int ONE_SECOND = 1000;
-
- private MutableLiveData<Long> elapsedTime = new MutableLiveData<>();
-
- private long mInitialTime;
-
- public LiveDataTimerViewModel() {
- mInitialTime = SystemClock.elapsedRealtime();
- Timer timer = new Timer();
-
- // Update the elapsed time every second.
- timer.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- final long newValue = (SystemClock.elapsedRealtime() - mInitialTime) / 1000;
-
- // setValue() cannot be called from a background thread so post to main thread.
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
-
- //TODO set the new value
-
- }
- });
- }
- }, ONE_SECOND, ONE_SECOND);
-
- }
-
- @SuppressWarnings("unused") // Will be used when step is completed
- public LiveData<Long> getElapsedTime() {
- return elapsedTime;
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/ChronoActivity3.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/ChronoActivity3.java
deleted file mode 100644
index 2caf5fb..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/ChronoActivity3.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 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.lifecycles.step3_solution;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.util.Log;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.lifecycle.R;
-
-public class ChronoActivity3 extends LifecycleActivity {
-
- private LiveDataTimerViewModel chronometerViewModel;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.chrono_activity_3);
-
- chronometerViewModel = ViewModelProviders.of(this).get(LiveDataTimerViewModel.class);
-
- subscribe();
- }
-
- private void subscribe() {
- final Observer<Long> elapsedTimeObserver = new Observer<Long>() {
- @Override
- public void onChanged(@Nullable final Long aLong) {
- String newText = ChronoActivity3.this.getResources().getString(R.string.seconds, aLong);
- ((TextView) findViewById(R.id.timer_textview)).setText(newText);
- Log.d("ChronoActivity3", "Updating timer");
- }
- };
-
- chronometerViewModel.getElapsedTime().observe(this, elapsedTimeObserver);
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/LiveDataTimerViewModel.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/LiveDataTimerViewModel.java
deleted file mode 100644
index 2644415..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step3_solution/LiveDataTimerViewModel.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 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.lifecycles.step3_solution;
-
-import android.arch.lifecycle.MutableLiveData;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.ViewModel;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * A ViewModel used for the {@link ChronoActivity3}.
- */
-public class LiveDataTimerViewModel extends ViewModel {
-
- private static final int ONE_SECOND = 1000;
-
- private MutableLiveData<Long> elapsedTime = new MutableLiveData<>();
-
- private long mInitialTime;
-
- public LiveDataTimerViewModel() {
- mInitialTime = SystemClock.elapsedRealtime();
- Timer timer = new Timer();
-
- // Update the elapsed time every second.
- timer.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- final long newValue = (SystemClock.elapsedRealtime() - mInitialTime) / 1000;
- // setValue() cannot be called from a background thread so post to main thread.
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- elapsedTime.setValue(newValue);
-
- }
- });
- }
- }, ONE_SECOND, ONE_SECOND);
-
- }
-
- public LiveData<Long> getElapsedTime() {
- return elapsedTime;
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/BoundLocationManager.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/BoundLocationManager.java
deleted file mode 100644
index ad38c4a..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/BoundLocationManager.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 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.lifecycles.step4;
-
-import android.content.Context;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.util.Log;
-
-import android.arch.lifecycle.LifecycleObserver;
-import android.arch.lifecycle.LifecycleRegistryOwner;
-
-
-public class BoundLocationManager {
- public static void bindLocationListenerIn(LifecycleRegistryOwner lifecycleOwner,
- LocationListener listener, Context context) {
- new BoundLocationListener(lifecycleOwner, listener, context);
- }
-
- @SuppressWarnings("MissingPermission")
- static class BoundLocationListener implements LifecycleObserver {
- private final Context mContext;
- private LocationManager mLocationManager;
- private final LocationListener mListener;
-
- public BoundLocationListener(LifecycleRegistryOwner lifecycleOwner,
- LocationListener listener, Context context) {
- mContext = context;
- mListener = listener;
- //TODO: Add lifecycle observer
- }
-
- //TODO: Call this on resume
- void addLocationListener() {
- // Note: Use the Fused Location Provider from Google Play Services instead.
- // https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
-
- mLocationManager =
- (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListener);
- Log.d("BoundLocationMgr", "Listener added");
-
- // Force an update with the last location, if available.
- Location lastLocation = mLocationManager.getLastKnownLocation(
- LocationManager.GPS_PROVIDER);
- if (lastLocation != null) {
- mListener.onLocationChanged(lastLocation);
- }
- }
-
- //TODO: Call this on pause
- void removeLocationListener() {
- if (mLocationManager == null) {
- return;
- }
- mLocationManager.removeUpdates(mListener);
- mLocationManager = null;
- Log.d("BoundLocationMgr", "Listener removed");
- }
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/LocationActivity.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/LocationActivity.java
deleted file mode 100644
index 4712267..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4/LocationActivity.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 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.lifecycles.step4;
-
-import android.Manifest;
-import android.content.pm.PackageManager;
-import android.location.Location;
-import android.location.LocationListener;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.lifecycle.R;
-
-public class LocationActivity extends LifecycleActivity {
-
- private static final int REQUEST_LOCATION_PERMISSION_CODE = 1;
-
- private LocationListener mGpsListener = new MyLocationListener();
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED
- && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
- bindLocationListener();
- } else {
- Toast.makeText(this, "This sample requires Location access", Toast.LENGTH_LONG).show();
- }
- }
-
- private void bindLocationListener() {
- BoundLocationManager.bindLocationListenerIn(this, mGpsListener, getApplicationContext());
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.location_activity);
-
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
- Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.ACCESS_COARSE_LOCATION},
- REQUEST_LOCATION_PERMISSION_CODE);
- } else {
- bindLocationListener();
- }
- }
-
- private class MyLocationListener implements LocationListener {
- @Override
- public void onLocationChanged(Location location) {
- TextView textView = (TextView) findViewById(R.id.location);
- textView.setText(location.getLatitude() + ", " + location.getLongitude());
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- Toast.makeText(LocationActivity.this,
- "Provider enabled: " + provider, Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/BoundLocationManager.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/BoundLocationManager.java
deleted file mode 100644
index 4360c2a..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/BoundLocationManager.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 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.lifecycles.step4_solution;
-
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleObserver;
-import android.arch.lifecycle.LifecycleOwner;
-import android.arch.lifecycle.OnLifecycleEvent;
-import android.content.Context;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.util.Log;
-
-public class BoundLocationManager {
- public static void bindLocationListenerIn(LifecycleOwner lifecycleOwner,
- LocationListener listener, Context context) {
- new BoundLocationListener(lifecycleOwner, listener, context);
- }
-
- @SuppressWarnings("MissingPermission")
- static class BoundLocationListener implements LifecycleObserver {
- private final Context mContext;
- private LocationManager mLocationManager;
- private final LocationListener mListener;
-
- public BoundLocationListener(LifecycleOwner lifecycleOwner,
- LocationListener listener, Context context) {
- mContext = context;
- mListener = listener;
- lifecycleOwner.getLifecycle().addObserver(this);
- }
-
- @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
- void addLocationListener() {
- // Note: Use the Fused Location Provider from Google Play Services instead.
- // https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
-
- mLocationManager =
- (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListener);
- Log.d("BoundLocationMgr", "Listener added");
-
- // Force an update with the last location, if available.
- Location lastLocation = mLocationManager.getLastKnownLocation(
- LocationManager.GPS_PROVIDER);
- if (lastLocation != null) {
- mListener.onLocationChanged(lastLocation);
- }
- }
-
-
- @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
- void removeLocationListener() {
- if (mLocationManager == null) {
- return;
- }
- mLocationManager.removeUpdates(mListener);
- mLocationManager = null;
- Log.d("BoundLocationMgr", "Listener removed");
- }
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/LocationActivity.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/LocationActivity.java
deleted file mode 100644
index 79ff562..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step4_solution/LocationActivity.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 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.lifecycles.step4_solution;
-
-import android.Manifest;
-import android.content.pm.PackageManager;
-import android.location.Location;
-import android.location.LocationListener;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.lifecycle.R;
-
-public class LocationActivity extends LifecycleActivity {
-
- private static final int REQUEST_LOCATION_PERMISSION_CODE = 1;
-
- private LocationListener mGpsListener = new MyLocationListener();
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED
- && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
- bindLocationListener();
- } else {
- Toast.makeText(this, "This sample requires Location access", Toast.LENGTH_LONG).show();
- }
- }
-
- private void bindLocationListener() {
- BoundLocationManager.bindLocationListenerIn(this, mGpsListener, getApplicationContext());
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.location_activity);
-
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
- Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.ACCESS_COARSE_LOCATION},
- REQUEST_LOCATION_PERMISSION_CODE);
- } else {
- bindLocationListener();
- }
- }
-
- private class MyLocationListener implements LocationListener {
- @Override
- public void onLocationChanged(Location location) {
- TextView textView = (TextView) findViewById(R.id.location);
- textView.setText(location.getLatitude() + ", " + location.getLongitude());
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- Toast.makeText(LocationActivity.this,
- "Provider enabled: " + provider, Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Activity_step5.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Activity_step5.java
deleted file mode 100644
index ec6df9a..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Activity_step5.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 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.lifecycles.step5;
-
-import android.os.Bundle;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.lifecycle.R;
-
-/**
- * Shows two {@link Fragment_step5} fragments.
- */
-public class Activity_step5 extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.activity_step5);
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Fragment_step5.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Fragment_step5.java
deleted file mode 100644
index 1b580ea..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/Fragment_step5.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 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.lifecycles.step5;
-
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.SeekBar;
-
-import com.example.android.codelabs.lifecycle.R;
-
-/**
- * Shows a SeekBar that should be synced with a value in a ViewModel.
- */
-public class Fragment_step5 extends Fragment {
-
- private SeekBar mSeekBar;
-
- private SeekBarViewModel mSeekBarViewModel;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View root = inflater.inflate(R.layout.fragment_step5, container, false);
- mSeekBar = (SeekBar) root.findViewById(R.id.seekBar);
-
- // TODO: get ViewModel
- subscribeSeekBar();
-
- return root;
- }
-
- private void subscribeSeekBar() {
-
- // Update the ViewModel when the SeekBar is changed.
-
- mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- // TODO: Set the ViewModel's value when the change comes from the user.
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) { }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) { }
- });
-
- // TODO: Update the SeekBar when the ViewModel is changed.
- // mSeekBarViewModel.seekbarValue.observe(...
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/SeekBarViewModel.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/SeekBarViewModel.java
deleted file mode 100644
index 5811a19..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5/SeekBarViewModel.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 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.lifecycles.step5;
-
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.ViewModel;
-
-/**
- * A ViewModel used in step 5.
- */
-public class SeekBarViewModel extends ViewModel {
-
- public MutableLiveData<Integer> seekbarValue = new MutableLiveData<>();
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Activity_step5.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Activity_step5.java
deleted file mode 100644
index 89fe54b..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Activity_step5.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 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.lifecycles.step5_solution;
-
-import android.os.Bundle;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.lifecycle.R;
-
-/**
- * Shows two {@link Fragment_step5} fragments.
- */
-public class Activity_step5 extends LifecycleActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.activity_step5_solution);
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Fragment_step5.java b/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Fragment_step5.java
deleted file mode 100644
index f82eb87..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/java/com/example/android/lifecycles/step5_solution/Fragment_step5.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 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.lifecycles.step5_solution;
-
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.SeekBar;
-
-import com.example.android.codelabs.lifecycle.R;
-import com.example.android.lifecycles.step5.SeekBarViewModel;
-
-/**
- * Shows a SeekBar that is synced with a value in a ViewModel.
- */
-public class Fragment_step5 extends Fragment {
-
- private SeekBar mSeekBar;
-
- private SeekBarViewModel mSeekBarViewModel;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View root = inflater.inflate(R.layout.fragment_step5, container, false);
- mSeekBar = (SeekBar) root.findViewById(R.id.seekBar);
-
- mSeekBarViewModel = ViewModelProviders.of(getActivity()).get(SeekBarViewModel.class);
-
- subscribeSeekBar();
-
- return root;
- }
-
- private void subscribeSeekBar() {
-
- // Update the ViewModel when the SeekBar is changed.
- mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) {
- Log.d("Step5", "Progress changed!");
- mSeekBarViewModel.seekbarValue.setValue(progress);
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) { }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) { }
- });
-
- // Update the SeekBar when the ViewModel is changed.
- mSeekBarViewModel.seekbarValue.observe(
- (LifecycleOwner) getActivity(),
- new Observer<Integer>() {
- @Override
- public void onChanged(@Nullable Integer value) {
- if (value != null) {
- mSeekBar.setProgress(value);
- }
- }
- });
- }
-}
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_main.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index b48e95e..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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.
- -->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.lifecycles.step1.ChronoActivity1">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!"
- android:layout_centerVertical="true"
- android:layout_centerHorizontal="true"
- android:id="@+id/hello_textview"/>
-
- <Chronometer
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_above="@+id/hello_textview"
- android:layout_centerHorizontal="true"
- android:id="@+id/chronometer"/>
-</RelativeLayout>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5.xml
deleted file mode 100644
index 479cffd..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.lifecycles.step5.Activity_step5">
-
- <fragment
- android:id="@+id/fragment1"
- android:name="com.example.android.lifecycles.step5.Fragment_step5"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <fragment
- android:id="@+id/fragment2"
- android:name="com.example.android.lifecycles.step5.Fragment_step5"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-</LinearLayout>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5_solution.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5_solution.xml
deleted file mode 100644
index a307499..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/activity_step5_solution.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.lifecycles.step5_solution.Activity_step5">
-
- <fragment
- android:id="@+id/fragment1"
- android:name="com.example.android.lifecycles.step5_solution.Fragment_step5"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <fragment
- android:id="@+id/fragment2"
- android:name="com.example.android.lifecycles.step5_solution.Fragment_step5"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-</LinearLayout>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_3.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_3.xml
deleted file mode 100644
index cdbaa6f..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_3.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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.
- -->
-
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.persistence.codelab.step_databinding.ChronoDataBindingActivity">
-
- <TextView
- android:id="@+id/hello_textview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="Hello World!" />
-
- <TextView
- android:id="@+id/timer_textview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/hello_textview"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true" />
-
-</RelativeLayout>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_databinding.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_databinding.xml
deleted file mode 100644
index 6d2698e..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/chrono_activity_databinding.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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.
- -->
-
-<layout>
-
- <data>
-
- <import type="android.databinding.ObservableField" />
-
- <variable
- name="elapsedTime"
- type="ObservableField<Long>">
-
- </variable>
- </data>
-
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.persistence.codelab.step_databinding.ChronoDataBindingActivity">
-
- <TextView
- android:id="@+id/hello_textview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="Hello World!" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/hello_textview"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="@{String.format(@string/seconds, elapsedTime)}" />
-
- </RelativeLayout>
-
-</layout>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/fragment_step5.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/fragment_step5.xml
deleted file mode 100644
index 3821796..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/fragment_step5.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- ~ Copyright 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.
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.android.lifecycles.step5_solution.Fragment_step5">
-
- <SeekBar
- android:id="@+id/seekBar"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
-</FrameLayout>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/location_activity.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/location_activity.xml
deleted file mode 100644
index f1bc410..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/layout/location_activity.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/location"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="12dp"
- android:text="@string/location" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index e19d44f..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 7876250..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 9ae3725..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6a6c3aa..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 43ca523..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/colors.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/colors.xml
deleted file mode 100644
index 255f15d..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
-</resources>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/dimens.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 9a3477e..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- ~ Copyright 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>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/strings.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/strings.xml
deleted file mode 100644
index 198dac9..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- ~ Copyright 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>
- <string name="app_name">Lifecycle codelab</string>
- <string name="seconds">%d seconds elapsed</string>
- <string name="location">Location</string>
-</resources>
diff --git a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/styles.xml b/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/styles.xml
deleted file mode 100644
index 7aa7228..0000000
--- a/samples-flatfoot/codelabs/lifecycle/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- ~ Copyright 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>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
-
-</resources>
diff --git a/samples-flatfoot/codelabs/lifecycle/build.gradle b/samples-flatfoot/codelabs/lifecycle/build.gradle
deleted file mode 100644
index c68afa8..0000000
--- a/samples-flatfoot/codelabs/lifecycle/build.gradle
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 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.
- */
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- maven {
- url "../../../prebuilts0905"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
-
-ext {
- buildToolsVersion = "25.0.2"
- supportLibVersion = "25.3.1"
- runnerVersion = "0.5"
- rulesVersion = "0.5"
- espressoVersion = "2.2.2"
- archLifecycleVersion = "1.0-SNAPSHOT"
- archRoomVersion = "1.0-SNAPSHOT"
-}
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/lifecycle/gradle.properties b/samples-flatfoot/codelabs/lifecycle/gradle.properties
deleted file mode 100644
index 684bee6..0000000
--- a/samples-flatfoot/codelabs/lifecycle/gradle.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 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.
-#
-
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 1af3d91..0000000
--- a/samples-flatfoot/codelabs/lifecycle/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright 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.
-#
-
-#Mon Feb 20 17:11:12 GMT 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
diff --git a/samples-flatfoot/codelabs/lifecycle/gradlew b/samples-flatfoot/codelabs/lifecycle/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/codelabs/lifecycle/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/codelabs/lifecycle/gradlew.bat b/samples-flatfoot/codelabs/lifecycle/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/codelabs/lifecycle/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/codelabs/lifecycle/settings.gradle b/samples-flatfoot/codelabs/lifecycle/settings.gradle
deleted file mode 100644
index a266f7d..0000000
--- a/samples-flatfoot/codelabs/lifecycle/settings.gradle
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 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.
- */
-
-include ':app'
diff --git a/samples-flatfoot/codelabs/persistence/.gitignore b/samples-flatfoot/codelabs/persistence/.gitignore
deleted file mode 100644
index c33eb5b..0000000
--- a/samples-flatfoot/codelabs/persistence/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-build/
-/captures
-.externalNativeBuild
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Dao.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Dao.xml
deleted file mode 100644
index c4fb918..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Dao.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 1 - Dao" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="false" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step1.UsersActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Solution.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Solution.xml
deleted file mode 100644
index b047801..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_1___Solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 1 - Solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step1_solution.UsersActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_2___Relationships.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_2___Relationships.xml
deleted file mode 100644
index 17fe2f9..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_2___Relationships.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 2 - Relationships" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step2.JankShowUserActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Async_calls.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Async_calls.xml
deleted file mode 100644
index 28ddac1..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Async_calls.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 3 - Async calls" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step3.BooksBorrowedByUserActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Solution.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Solution.xml
deleted file mode 100644
index 38fcfb3..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_3___Solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 3 - Solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step3_solution.BooksBorrowedByUserActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Solution.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Solution.xml
deleted file mode 100644
index 094bac9..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 4 - Solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step4_solution.TypeConvertersActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Type_converters.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Type_converters.xml
deleted file mode 100644
index d75817c..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_4___Type_converters.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 4 - Type converters" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step4.TypeConvertersActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Custom_Results.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Custom_Results.xml
deleted file mode 100644
index 3dcf7f5..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Custom_Results.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 5 - Custom Results" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="true" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step5.CustomResultActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Solution.xml b/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Solution.xml
deleted file mode 100644
index 790b28c..0000000
--- a/samples-flatfoot/codelabs/persistence/.idea/runConfigurations/Step_5___Solution.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="Step 5 - Solution" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
- <module name="app" />
- <option name="DEPLOY" value="true" />
- <option name="ARTIFACT_NAME" value="" />
- <option name="PM_INSTALL_OPTIONS" value="" />
- <option name="ACTIVITY_EXTRA_FLAGS" value="" />
- <option name="MODE" value="specific_activity" />
- <option name="PREFERRED_AVD" value="" />
- <option name="CLEAR_LOGCAT" value="false" />
- <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
- <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
- <option name="FORCE_STOP_RUNNING_APP" value="true" />
- <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
- <option name="USE_LAST_SELECTED_DEVICE" value="true" />
- <option name="PREFERRED_AVD" value="" />
- <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
- <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
- <option name="DEBUGGER_TYPE" value="Auto" />
- <Auto>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Auto>
- <Hybrid>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Hybrid>
- <Java />
- <Native>
- <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
- <option name="SHOW_STATIC_VARS" value="true" />
- <option name="WORKING_DIR" value="" />
- <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
- <option name="SHOW_OPTIMIZED_WARNING" value="true" />
- </Native>
- <Profilers>
- <option name="ENABLE_ADVANCED_PROFILING" value="false" />
- <option name="SUPPORT_LIB_ENABLED" value="true" />
- <option name="INSTRUMENTATION_ENABLED" value="true" />
- </Profilers>
- <option name="DEEP_LINK" value="" />
- <option name="ACTIVITY_CLASS" value="com.example.android.persistence.codelab.step5_solution.CustomResultUserActivity" />
- <method />
- </configuration>
-</component>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/CONTRIBUTING.md b/samples-flatfoot/codelabs/persistence/CONTRIBUTING.md
deleted file mode 100644
index 7b86f95..0000000
--- a/samples-flatfoot/codelabs/persistence/CONTRIBUTING.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# How to become a contributor and submit your own code
-
-## Contributor License Agreements
-
-We'd love to accept your sample apps and patches! Before we can take them, we
-have to jump a couple of legal hurdles.
-
-Please fill out either the individual or corporate Contributor License Agreement (CLA).
-
- * If you are an individual writing original source code and you're sure you
- own the intellectual property, then you'll need to sign an [individual CLA]
- (https://cla.developers.google.com).
- * If you work for a company that wants to allow you to contribute your work,
- then you'll need to sign a [corporate CLA]
- (https://cla.developers.google.com).
- * Please make sure you sign both, Android and Google CLA
-
-Follow either of the two links above to access the appropriate CLA and
-instructions for how to sign and return it. Once we receive it, we'll be able to
-accept your pull requests.
-
-## Contributing A Patch
-
-1. Submit an issue describing your proposed change to the repo in question.
-1. The repo owner will respond to your issue promptly.
-1. If your proposed change is accepted, and you haven't already done so, sign a
- Contributor License Agreement (see details above).
-1. Fork the desired repo, develop and test your code changes.
-1. Ensure that your code adheres to the existing style in the sample to which
- you are contributing. Refer to the
- [Android Code Style Guide]
- (https://source.android.com/source/code-style.html) for the
- recommended coding standards for this organization.
-1. Ensure that your code has an appropriate set of unit tests which all pass.
-1. Submit a pull request.
diff --git a/samples-flatfoot/codelabs/persistence/LICENSE b/samples-flatfoot/codelabs/persistence/LICENSE
deleted file mode 100644
index 1af981f..0000000
--- a/samples-flatfoot/codelabs/persistence/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 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.
diff --git a/samples-flatfoot/codelabs/persistence/app/build.gradle b/samples-flatfoot/codelabs/persistence/app/build.gradle
deleted file mode 100644
index 0a382b4..0000000
--- a/samples-flatfoot/codelabs/persistence/app/build.gradle
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 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.
- */
-
-apply plugin: 'com.android.application'
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
- defaultConfig {
- applicationId 'com.example.android.codelabs.persistence'
- minSdkVersion 21
- targetSdkVersion 25
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- dataBinding {
- enabled = true
- }
- productFlavors {
- }
- // To avoid lint errors on generated sources, we temporarily disable abortOnError
- // until the fix is released.
- lintOptions {
- abortOnError false
- }
-}
-
-dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- androidTestCompile('com.android.support.test.espresso:espresso-core:' + rootProject.espressoVersion, {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:cardview-v7:' + rootProject.supportLibVersion;
- compile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion;
- testCompile 'junit:junit:4.12'
- compile 'android.arch.lifecycle:extensions:' + rootProject.archLifecycleVersion;
- compile 'android.arch.persistence.room:runtime:' + rootProject.archRoomVersion;
- annotationProcessor 'android.arch.lifecycle:compiler:' + rootProject.archLifecycleVersion;
- annotationProcessor 'android.arch.persistence.room:compiler:' + rootProject.archRoomVersion;
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/proguard-rules.pro b/samples-flatfoot/codelabs/persistence/app/proguard-rules.pro
deleted file mode 100644
index 4cb7103..0000000
--- a/samples-flatfoot/codelabs/persistence/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /usr/local/google/home/jalc/sw/android-sdks/android-sdk-linux/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/AndroidManifest.xml b/samples-flatfoot/codelabs/persistence/app/src/main/AndroidManifest.xml
deleted file mode 100644
index ade902e..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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="com.example.android.codelabs.persistence">
-
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
- <uses-feature android:name="android.hardware.location.gps" />
-
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name="com.example.android.persistence.codelab.step1_solution.UsersActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step1.UsersActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step2.JankShowUserActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step3.BooksBorrowedByUserActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step3_solution.BooksBorrowedByUserActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step4.TypeConvertersActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step4_solution.TypeConvertersActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step5_solution.CustomResultUserActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- <activity android:name="com.example.android.persistence.codelab.step5.CustomResultActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/AppDatabase.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/AppDatabase.java
deleted file mode 100644
index 4399a84..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/AppDatabase.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.content.Context;
-
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.Room;
-import android.arch.persistence.room.RoomDatabase;
-
-@Database(entities = {User.class, Book.class, Loan.class}, version = 1)
-public abstract class AppDatabase extends RoomDatabase {
-
- private static AppDatabase INSTANCE;
-
- public abstract UserDao userModel();
- public abstract BookDao bookModel();
- public abstract LoanDao loanModel();
-
- public static AppDatabase getInMemoryDatabase(Context context) {
- if (INSTANCE == null) {
- INSTANCE = Room.inMemoryDatabaseBuilder(
- context.getApplicationContext(), AppDatabase.class).build();
- }
- return INSTANCE;
- }
-
- public static void destroyInstance() {
- INSTANCE = null;
- }
-}
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Book.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Book.java
deleted file mode 100644
index 5b3cd39..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Book.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-@Entity
-public class Book {
- public @PrimaryKey String id;
- public String title;
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/BookDao.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/BookDao.java
deleted file mode 100644
index 07a419a..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/BookDao.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.lifecycle.LiveData;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.Query;
-import android.arch.persistence.room.TypeConverters;
-import android.arch.persistence.room.Update;
-
-import java.util.Date;
-import java.util.List;
-
-import static android.arch.persistence.room.OnConflictStrategy.IGNORE;
-import static android.arch.persistence.room.OnConflictStrategy.REPLACE;
-
-
-@Dao
-@TypeConverters(DateConverter.class)
-public interface BookDao {
-
- @Query("select * from Book where id = :id")
- User loadUserById(int id);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id = Book.id " +
- "INNER JOIN User on User.id = Loan.user_id " +
- "WHERE User.name LIKE :userName"
- )
- public LiveData<List<Book>> findBooksBorrowedByName(String userName);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id = Book.id " +
- "INNER JOIN User on User.id = Loan.user_id " +
- "WHERE User.name LIKE :userName " +
- "AND Loan.endTime > :after "
- )
- public LiveData<List<Book>> findBooksBorrowedByNameAfter(String userName, Date after);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id = Book.id " +
- "INNER JOIN User on User.id = Loan.user_id " +
- "WHERE User.name LIKE :userName"
- )
- public List<Book> findBooksBorrowedByNameSync(String userName);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id LIKE Book.id " +
- "WHERE Loan.user_id LIKE :userId "
- )
- public LiveData<List<Book>> findBooksBorrowedByUser(String userId);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id LIKE Book.id " +
- "WHERE Loan.user_id LIKE :userId " +
- "AND Loan.endTime > :after "
- )
- public LiveData<List<Book>> findBooksBorrowedByUserAfter(String userId, Date after);
-
- @Query("SELECT * FROM Book " +
- "INNER JOIN Loan ON Loan.book_id LIKE Book.id " +
- "WHERE Loan.user_id LIKE :userId "
- )
- public List<Book> findBooksBorrowedByUserSync(String userId);
-
- @Query("SELECT * FROM Book")
- public LiveData<List<Book>> findAllBooks();
-
-
- @Query("SELECT * FROM Book")
- public List<Book> findAllBooksSync();
-
- @Insert(onConflict = IGNORE)
- void insertBook(Book book);
-
- @Update(onConflict = REPLACE)
- void updateBook(Book book);
-
- @Query("DELETE FROM Book")
- void deleteAll();
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/DateConverter.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/DateConverter.java
deleted file mode 100644
index f7ad1d6..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/DateConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.TypeConverter;
-
-import java.util.Date;
-
-public class DateConverter {
- @TypeConverter
- public static Date toDate(Long timestamp) {
- return timestamp == null ? null : new Date(timestamp);
- }
-
- @TypeConverter
- public static Long toTimestamp(Date date) {
- return date == null ? null : date.getTime();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Loan.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Loan.java
deleted file mode 100644
index 39e8a89..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/Loan.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.ColumnInfo;
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.ForeignKey;
-import android.arch.persistence.room.PrimaryKey;
-import android.arch.persistence.room.TypeConverters;
-
-import java.util.Date;
-
-@Entity(foreignKeys = {
- @ForeignKey(entity = Book.class,
- parentColumns = "id",
- childColumns = "book_id"),
-
- @ForeignKey(entity = User.class,
- parentColumns = "id",
- childColumns = "user_id")})
-@TypeConverters(DateConverter.class)
-public class Loan {
- // Fields can be public or private with getters and setters.
- public @PrimaryKey String id;
- public Date startTime;
- public Date endTime;
- @ColumnInfo(name="book_id")
- public String bookId;
- @ColumnInfo(name="user_id")
- public String userId;
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanDao.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanDao.java
deleted file mode 100644
index 5a8f9ed..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanDao.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-
-import android.arch.lifecycle.LiveData;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.Query;
-import android.arch.persistence.room.TypeConverters;
-
-import java.util.Date;
-import java.util.List;
-
-import static android.arch.persistence.room.OnConflictStrategy.ABORT;
-
-@Dao
-@TypeConverters(DateConverter.class)
-public interface LoanDao {
-
- @Query("SELECT * From Loan")
- LiveData<List<Loan>> findAll();
-
- @Query("SELECT Loan.id, Book.title, User.name, Loan.startTime, Loan.endTime From Loan " +
- "INNER JOIN Book ON Loan.book_id = Book.id " +
- "INNER JOIN User ON Loan.user_id = User.id ")
- LiveData<List<LoanWithUserAndBook>> findAllWithUserAndBook();
-
- @Query("SELECT Loan.id, Book.title as title, User.name as name, Loan.startTime, Loan.endTime " +
- "FROM Book " +
- "INNER JOIN Loan ON Loan.book_id = Book.id " +
- "INNER JOIN User on User.id = Loan.user_id " +
- "WHERE User.name LIKE :userName " +
- "AND Loan.endTime > :after "
- )
- public LiveData<List<LoanWithUserAndBook>> findLoansByNameAfter(String userName, Date after);
-
- @Insert(onConflict = ABORT)
- void insertLoan(Loan loan);
-
- @Query("DELETE FROM Loan")
- void deleteAll();
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanWithUserAndBook.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanWithUserAndBook.java
deleted file mode 100644
index 9df2dda..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/LoanWithUserAndBook.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.ColumnInfo;
-import android.arch.persistence.room.TypeConverters;
-
-import java.util.Date;
-
-public class LoanWithUserAndBook {
- public String id;
- @ColumnInfo(name="title")
- public String bookTitle;
- @ColumnInfo(name="name")
- public String userName;
- @TypeConverters(DateConverter.class)
- public Date startTime;
- @TypeConverters(DateConverter.class)
- public Date endTime;
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/User.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/User.java
deleted file mode 100644
index 75dc4b3..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/User.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
-
-
-@Entity
-public class User {
- public @PrimaryKey String id;
- public String name;
- public String lastName;
- public int age;
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/UserDao.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/UserDao.java
deleted file mode 100644
index 3dd836d..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/UserDao.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db;
-
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Delete;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.Query;
-
-import java.util.List;
-
-import static android.arch.persistence.room.OnConflictStrategy.IGNORE;
-
-@Dao
-public interface UserDao {
- @Query("select * from user")
- List<User> loadAllUsers();
-
- @Query("select * from user where id = :id")
- User loadUserById(int id);
-
- @Query("select * from user where name = :firstName and lastName = :lastName")
- List<User> findByNameAndLastName(String firstName, String lastName);
-
- @Insert(onConflict = IGNORE)
- void insertUser(User user);
-
- @Delete
- void deleteUser(User user);
-
- @Query("delete from user where name like :badName OR lastName like :badName")
- int deleteUsersByName(String badName);
-
- @Insert(onConflict = IGNORE)
- void insertOrReplaceUsers(User... users);
-
- @Delete
- void deleteUsers(User user1, User user2);
-
- @Query("SELECT * FROM User WHERE :age == :age") // TODO: Fix this!
- List<User> findYoungerThan(int age);
-
- @Query("SELECT * FROM User WHERE age < :age")
- List<User> findYoungerThanSolution(int age);
-
- @Query("DELETE FROM User")
- void deleteAll();
-}
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/utils/DatabaseInitializer.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/utils/DatabaseInitializer.java
deleted file mode 100644
index 7ced200..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/db/utils/DatabaseInitializer.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.db.utils;
-
-import android.os.AsyncTask;
-import android.support.annotation.NonNull;
-import android.util.Log;
-
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.Loan;
-import com.example.android.persistence.codelab.db.User;
-
-import java.util.Calendar;
-import java.util.Date;
-
-public class DatabaseInitializer {
-
- // Simulate a blocking operation delaying each Loan insertion with a delay:
- private static final int DELAY_MILLIS = 500;
-
- public static void populateAsync(final AppDatabase db) {
-
- PopulateDbAsync task = new PopulateDbAsync(db);
- task.execute();
- }
-
- public static void populateSync(@NonNull final AppDatabase db) {
- populateWithTestData(db);
- }
-
- private static void addLoan(final AppDatabase db, final String id,
- final User user, final Book book, Date from, Date to) {
- Loan loan = new Loan();
- loan.id = id;
- loan.bookId = book.id;
- loan.userId = user.id;
- loan.startTime = from;
- loan.endTime = to;
- db.loanModel().insertLoan(loan);
- }
-
- private static Book addBook(final AppDatabase db, final String id, final String title) {
- Book book = new Book();
- book.id = id;
- book.title = title;
- db.bookModel().insertBook(book);
- return book;
- }
-
- private static User addUser(final AppDatabase db, final String id, final String name,
- final String lastName, final int age) {
- User user = new User();
- user.id = id;
- user.age = age;
- user.name = name;
- user.lastName = lastName;
- db.userModel().insertUser(user);
- return user;
- }
-
- private static void populateWithTestData(AppDatabase db) {
- db.loanModel().deleteAll();
- db.userModel().deleteAll();
- db.bookModel().deleteAll();
-
- User user1 = addUser(db, "1", "Jason", "Seaver", 40);
- User user2 = addUser(db, "2", "Mike", "Seaver", 12);
- addUser(db, "3", "Carol", "Seaver", 15);
-
- Book book1 = addBook(db, "1", "Dune");
- Book book2 = addBook(db, "2", "1984");
- Book book3 = addBook(db, "3", "The War of the Worlds");
- Book book4 = addBook(db, "4", "Brave New World");
- addBook(db, "5", "Foundation");
- try {
- // Loans are added with a delay, to have time for the UI to react to changes.
-
- Date today = getTodayPlusDays(0);
- Date yesterday = getTodayPlusDays(-1);
- Date twoDaysAgo = getTodayPlusDays(-2);
- Date lastWeek = getTodayPlusDays(-7);
- Date twoWeeksAgo = getTodayPlusDays(-14);
-
- addLoan(db, "1", user1, book1, twoWeeksAgo, lastWeek);
- Thread.sleep(DELAY_MILLIS);
- addLoan(db, "2", user2, book1, lastWeek, yesterday);
- Thread.sleep(DELAY_MILLIS);
- addLoan(db, "3", user2, book2, lastWeek, today);
- Thread.sleep(DELAY_MILLIS);
- addLoan(db, "4", user2, book3, lastWeek, twoDaysAgo);
- Thread.sleep(DELAY_MILLIS);
- addLoan(db, "5", user2, book4, lastWeek, today);
- Log.d("DB", "Added loans");
-
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- private static Date getTodayPlusDays(int daysAgo) {
- Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.DATE, daysAgo);
- return calendar.getTime();
- }
-
- private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {
-
- private final AppDatabase mDb;
-
- PopulateDbAsync(AppDatabase db) {
- mDb = db;
- }
-
- @Override
- protected Void doInBackground(final Void... params) {
- populateWithTestData(mDb);
- return null;
- }
-
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1/UsersActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1/UsersActivity.java
deleted file mode 100644
index 3a7f118..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1/UsersActivity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step1;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.User;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-import java.util.Locale;
-
-public class UsersActivity extends LifecycleActivity {
-
- private AppDatabase mDb;
-
- private TextView mYoungUsersTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity1);
-
- mYoungUsersTextView = (TextView) findViewById(R.id.young_users_tv);
-
- // Note: Db references should not be in an activity.
- mDb = AppDatabase.getInMemoryDatabase(getApplicationContext());
-
- populateDb();
-
- fetchData();
- }
-
- @Override
- protected void onDestroy() {
- AppDatabase.destroyInstance();
- super.onDestroy();
- }
-
- private void populateDb() {
- DatabaseInitializer.populateSync(mDb);
- }
-
- private void fetchData() {
- // Note: this kind of logic should not be in an activity.
- StringBuilder sb = new StringBuilder();
- List<User> youngUsers = mDb.userModel().findYoungerThan(35);
- for (User youngUser : youngUsers) {
- sb.append(String.format(Locale.US,
- "%s, %s (%d)\n", youngUser.lastName, youngUser.name, youngUser.age));
- }
- mYoungUsersTextView.setText(sb);
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1_solution/UsersActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1_solution/UsersActivity.java
deleted file mode 100644
index 1399f0e..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step1_solution/UsersActivity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step1_solution;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.User;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-import java.util.Locale;
-
-public class UsersActivity extends LifecycleActivity {
-
- private AppDatabase mDb;
-
- private TextView mYoungUsersTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity1);
-
- mYoungUsersTextView = (TextView) findViewById(R.id.young_users_tv);
-
- // Note: Db references should not be in an activity.
- mDb = AppDatabase.getInMemoryDatabase(getApplicationContext());
-
- populateDb();
-
- fetchData();
- }
-
- @Override
- protected void onDestroy() {
- AppDatabase.destroyInstance();
- super.onDestroy();
- }
-
- private void populateDb() {
- DatabaseInitializer.populateSync(mDb);
- }
-
- private void fetchData() {
- // Note: this kind of logic should not be in an activity.
- StringBuilder sb = new StringBuilder();
- List<User> youngUsers = mDb.userModel().findYoungerThanSolution(35);
- for (User youngUser : youngUsers) {
- sb.append(String.format(Locale.US,
- "%s, %s (%d)\n", youngUser.lastName, youngUser.name, youngUser.age));
- }
- mYoungUsersTextView.setText(sb);
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step2/JankShowUserActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step2/JankShowUserActivity.java
deleted file mode 100644
index 7ff52cc..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step2/JankShowUserActivity.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step2;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-
-public class JankShowUserActivity extends LifecycleActivity {
-
- private AppDatabase mDb;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
-
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- // Note: Db references should not be in an activity.
- mDb = AppDatabase.getInMemoryDatabase(getApplicationContext());
-
- populateDb();
-
- fetchData();
- }
-
- @Override
- protected void onDestroy() {
- AppDatabase.destroyInstance();
- super.onDestroy();
- }
-
- private void populateDb() {
- DatabaseInitializer.populateSync(mDb);
- }
-
- private void fetchData() {
- // This activity is executing a query on the main thread, making the UI perform badly.
- List<Book> books = mDb.bookModel().findBooksBorrowedByNameSync("Mike");
- showListInUI(books, mBooksTextView);
- }
-
- private static void showListInUI(final @NonNull List<Book> books,
- final TextView booksTextView) {
- StringBuilder sb = new StringBuilder();
- for (Book book : books) {
- sb.append(book.title);
- sb.append("\n");
- }
- booksTextView.setText(sb.toString());
- }
-
- public void onRefreshBtClicked(View view) {
- mBooksTextView.setText("");
- fetchData();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserActivity.java
deleted file mode 100644
index 0e11268..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserActivity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step3;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.Book;
-
-import java.util.List;
-
-public class BooksBorrowedByUserActivity extends LifecycleActivity {
-
- private BooksBorrowedByUserViewModel mViewModel;
-
- @SuppressWarnings("unused")
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- // Get a reference to the ViewModel for this screen.
- mViewModel = ViewModelProviders.of(this).get(BooksBorrowedByUserViewModel.class);
-
- // Update the UI whenever there's a change in the ViewModel's data.
- subscribeUiBooks();
- }
-
- public void onRefreshBtClicked(View view) {
- mViewModel.createDb();
- }
-
- private void subscribeUiBooks() {
- // TODO: refresh the list of books when there's new data
- // mViewModel.books.observe(...
- }
-
- @SuppressWarnings("unused")
- private static void showBooksInUi(final @NonNull List<Book> books,
- final TextView booksTextView) {
- StringBuilder sb = new StringBuilder();
-
- for (Book book : books) {
- sb.append(book.title);
- sb.append("\n");
-
- }
- booksTextView.setText(sb.toString());
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserViewModel.java
deleted file mode 100644
index badead3..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3/BooksBorrowedByUserViewModel.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step3;
-
-import android.app.Application;
-
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-
-
-public class BooksBorrowedByUserViewModel extends AndroidViewModel {
-
- public final LiveData<List<Book>> books;
-
- private AppDatabase mDb;
-
- public BooksBorrowedByUserViewModel(Application application) {
- super(application);
- createDb();
-
- // TODO: Assign books to the 'findBooksBorrowedByName' query.
- books = null;
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(this.getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserActivity.java
deleted file mode 100644
index d488333..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserActivity.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step3_solution;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.Book;
-
-import java.util.List;
-
-public class BooksBorrowedByUserActivity extends LifecycleActivity {
-
- private BooksBorrowedByUserViewModel mViewModel;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- // Get a reference to the ViewModel for this screen.
- mViewModel = ViewModelProviders.of(this).get(BooksBorrowedByUserViewModel.class);
-
- // Update the UI whenever there's a change in the ViewModel's data.
- subscribeUiBooks();
- }
-
- public void onRefreshBtClicked(View view) {
- mViewModel.createDb();
- }
-
- private void subscribeUiBooks() {
- mViewModel.books.observe(this, new Observer<List<Book>>() {
- @Override
- public void onChanged(@NonNull final List<Book> books) {
- showBooksInUi(books, mBooksTextView);
- }
- });
- }
-
- private static void showBooksInUi(final @NonNull List<Book> books,
- final TextView booksTextView) {
- StringBuilder sb = new StringBuilder();
-
- for (Book book : books) {
- sb.append(book.title);
- sb.append("\n");
-
- }
- booksTextView.setText(sb.toString());
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserViewModel.java
deleted file mode 100644
index 4599b68..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step3_solution/BooksBorrowedByUserViewModel.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step3_solution;
-
-import android.app.Application;
-
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-
-
-public class BooksBorrowedByUserViewModel extends AndroidViewModel {
-
- public final LiveData<List<Book>> books;
-
- private AppDatabase mDb;
-
- public BooksBorrowedByUserViewModel(Application application) {
- super(application);
- createDb();
-
- // Books is a LiveData object so updates are observed.
- books = mDb.bookModel().findBooksBorrowedByName("Mike");
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(this.getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersActivity.java
deleted file mode 100644
index 2af252b..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersActivity.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step4;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.Book;
-
-import java.util.List;
-
-public class TypeConvertersActivity extends LifecycleActivity {
-
- private TypeConvertersViewModel mViewModel;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- // Get a reference to the ViewModel for this screen.
- mViewModel = ViewModelProviders.of(this).get(TypeConvertersViewModel.class);
-
- // Update the UI whenever there's a change in the ViewModel's data.
- subscribeUiBooks();
- }
-
- public void onRefreshBtClicked(View view) {
- mViewModel.createDb();
- }
-
- private void subscribeUiBooks() {
- mViewModel.getBooks().observe(this, new Observer<List<Book>>() {
- @Override
- public void onChanged(@NonNull final List<Book> books) {
- showBooksInUi(books, mBooksTextView);
- }
- });
- }
-
- private static void showBooksInUi(final @NonNull List<Book> books,
- final TextView booksTextView) {
- StringBuilder sb = new StringBuilder();
-
- for (Book book : books) {
- sb.append(book.title);
- sb.append("\n");
-
- }
- booksTextView.setText(sb.toString());
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersViewModel.java
deleted file mode 100644
index 08b7edf..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4/TypeConvertersViewModel.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step4;
-
-import android.app.Application;
-
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.List;
-
-
-public class TypeConvertersViewModel extends AndroidViewModel {
-
- private LiveData<List<Book>> mBooks;
-
- private AppDatabase mDb;
-
- public TypeConvertersViewModel(Application application) {
- super(application);
- createDb();
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(this.getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
-
- // Receive changes
- subscribeToDbChanges();
- }
-
- public LiveData<List<Book>> getBooks() {
- return mBooks;
- }
-
- private void subscribeToDbChanges() {
- // Books is a LiveData object so updates are observed.
- // TODO: replace this with a query that finds books borrowed by Mike in the last 24h
- mBooks = mDb.bookModel().findBooksBorrowedByName("Mike");
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersActivity.java
deleted file mode 100644
index 2d309ac..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersActivity.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step4_solution;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-import com.example.android.persistence.codelab.db.Book;
-
-import java.util.List;
-
-public class TypeConvertersActivity extends LifecycleActivity {
-
- private TypeConvertersViewModel mViewModel;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- // Get a reference to the ViewModel for this screen.
- mViewModel = ViewModelProviders.of(this).get(TypeConvertersViewModel.class);
-
- // Update the UI whenever there's a change in the ViewModel's data.
- subscribeUiBooks();
- }
-
- public void onRefreshBtClicked(View view) {
- mViewModel.createDb();
- }
-
- private void subscribeUiBooks() {
- mViewModel.getBooks().observe(this, new Observer<List<Book>>() {
- @Override
- public void onChanged(@NonNull final List<Book> books) {
- showBooksInUi(books, mBooksTextView);
- }
- });
- }
-
- private static void showBooksInUi(final @NonNull List<Book> books,
- final TextView booksTextView) {
- StringBuilder sb = new StringBuilder();
-
- for (Book book : books) {
- sb.append(book.title);
- sb.append("\n");
-
- }
- booksTextView.setText(sb.toString());
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersViewModel.java
deleted file mode 100644
index 5add97c..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step4_solution/TypeConvertersViewModel.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step4_solution;
-
-import android.app.Application;
-
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.Book;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-
-public class TypeConvertersViewModel extends AndroidViewModel {
-
- private LiveData<List<Book>> mBooks;
-
- private AppDatabase mDb;
-
- public TypeConvertersViewModel(Application application) {
- super(application);
- createDb();
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(this.getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
-
- // Receive changes
- subscribeToDbChanges();
- }
-
- public LiveData<List<Book>> getBooks() {
- return mBooks;
- }
-
- private void subscribeToDbChanges() {
- // Books is a LiveData object so updates are observed.
- Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.DATE, -1);
- Date yesterday = calendar.getTime();
- mBooks = mDb.bookModel().findBooksBorrowedByNameAfter("Mike", yesterday);
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultActivity.java
deleted file mode 100644
index 2e07e97..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultActivity.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step5;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-
-
-public class CustomResultActivity extends LifecycleActivity {
-
- private CustomResultViewModel mShowUserViewModel;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- mShowUserViewModel = ViewModelProviders.of(this).get(CustomResultViewModel.class);
-
- populateDb();
-
- subscribeUiLoans();
- }
-
- private void populateDb() {
- mShowUserViewModel.createDb();
- }
-
- private void subscribeUiLoans() {
- mShowUserViewModel.getLoansResult().observe(this, new Observer<String>() {
- @Override
- public void onChanged(@Nullable final String result) {
- mBooksTextView.setText(result);
- }
- });
- }
-
- public void onRefreshBtClicked(View view) {
- populateDb();
- subscribeUiLoans();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultViewModel.java
deleted file mode 100644
index 157c4db..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5/CustomResultViewModel.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step5;
-
-import android.app.Application;
-import android.arch.core.util.Function;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Transformations;
-
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.LoanWithUserAndBook;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-
-public class CustomResultViewModel extends AndroidViewModel {
-
- private LiveData<String> mLoansResult;
-
- private AppDatabase mDb;
-
- public CustomResultViewModel(Application application) {
- super(application);
- }
-
- public LiveData<String> getLoansResult() {
- return mLoansResult;
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
-
- // Receive changes
- subscribeToDbChanges();
- }
-
- private void subscribeToDbChanges() {
- // TODO: Modify this query to show only recent loans from specific user
- LiveData<List<LoanWithUserAndBook>> loans
- = mDb.loanModel().findAllWithUserAndBook();
-
- // Instead of exposing the list of Loans, we can apply a transformation and expose Strings.
- mLoansResult = Transformations.map(loans,
- new Function<List<LoanWithUserAndBook>, String>() {
- @Override
- public String apply(List<LoanWithUserAndBook> loansWithUserAndBook) {
- StringBuilder sb = new StringBuilder();
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm",
- Locale.US);
-
- for (LoanWithUserAndBook loan : loansWithUserAndBook) {
- sb.append(String.format("%s\n (Returned: %s)\n",
- loan.bookTitle,
- simpleDateFormat.format(loan.endTime)));
- }
- return sb.toString();
- }
- });
- }
-
- @SuppressWarnings("unused")
- private Date getYesterdayDate() {
- Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.DATE, -1);
- return calendar.getTime();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultUserActivity.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultUserActivity.java
deleted file mode 100644
index e17a809..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultUserActivity.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step5_solution;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
-import com.example.android.codelabs.persistence.R;
-
-
-public class CustomResultUserActivity extends LifecycleActivity {
-
- private CustomResultViewModel mShowUserViewModel;
-
- private TextView mBooksTextView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.db_activity);
- mBooksTextView = (TextView) findViewById(R.id.books_tv);
-
- mShowUserViewModel = ViewModelProviders.of(this).get(CustomResultViewModel.class);
-
- populateDb();
-
- subscribeUiLoans();
- }
-
- private void populateDb() {
- mShowUserViewModel.createDb();
- }
-
- private void subscribeUiLoans() {
- mShowUserViewModel.getLoansResult().observe(this, new Observer<String>() {
- @Override
- public void onChanged(@Nullable final String result) {
- mBooksTextView.setText(result);
- }
- });
- }
-
- public void onRefreshBtClicked(View view) {
- populateDb();
- subscribeUiLoans();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultViewModel.java b/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultViewModel.java
deleted file mode 100644
index f6f4c20..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/java/com/example/android/persistence/codelab/step5_solution/CustomResultViewModel.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 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.persistence.codelab.step5_solution;
-
-import android.app.Application;
-import android.arch.core.util.Function;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Transformations;
-
-import com.example.android.persistence.codelab.db.AppDatabase;
-import com.example.android.persistence.codelab.db.LoanWithUserAndBook;
-import com.example.android.persistence.codelab.db.utils.DatabaseInitializer;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-
-public class CustomResultViewModel extends AndroidViewModel {
-
- private LiveData<String> mLoansResult;
-
- private AppDatabase mDb;
-
- public CustomResultViewModel(Application application) {
- super(application);
- }
-
- public LiveData<String> getLoansResult() {
- return mLoansResult;
- }
-
- public void createDb() {
- mDb = AppDatabase.getInMemoryDatabase(getApplication());
-
- // Populate it with initial data
- DatabaseInitializer.populateAsync(mDb);
-
- // Receive changes
- subscribeToDbChanges();
- }
-
- private void subscribeToDbChanges() {
- LiveData<List<LoanWithUserAndBook>> loans
- = mDb.loanModel().findLoansByNameAfter("Mike", getYesterdayDate());
-
- // Instead of exposing the list of Loans, we can apply a transformation and expose Strings.
- mLoansResult = Transformations.map(loans,
- new Function<List<LoanWithUserAndBook>, String>() {
- @Override
- public String apply(List<LoanWithUserAndBook> loansWithUserAndBook) {
- StringBuilder sb = new StringBuilder();
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm",
- Locale.US);
-
- for (LoanWithUserAndBook loan : loansWithUserAndBook) {
- sb.append(String.format("%s\n (Returned: %s)\n",
- loan.bookTitle,
- simpleDateFormat.format(loan.endTime)));
- }
- return sb.toString();
- }
- });
- }
-
- private Date getYesterdayDate() {
- Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.DATE, -1);
- return calendar.getTime();
- }
-}
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity.xml
deleted file mode 100644
index d4b7bfb..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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.
- -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin">
-
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/books_borrowed_by_user"
- android:textSize="24sp" />
-
- <TextView
- android:id="@+id/books_tv"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="8dp" />
-
- <Button
- android:id="@+id/button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:onClick="onRefreshBtClicked"
- android:text="@string/refresh" />
-
- </LinearLayout>
-
- </ScrollView>
-
-</RelativeLayout>
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity1.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity1.xml
deleted file mode 100644
index d603b9d..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/layout/db_activity1.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright 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.
- -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin">
-
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/young_users"
- android:textSize="24sp" />
-
- <TextView
- android:id="@+id/young_users_tv"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="8dp" />
-
- </LinearLayout>
- </ScrollView>
-</RelativeLayout>
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index e19d44f..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 7876250..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 9ae3725..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6a6c3aa..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 43ca523..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/colors.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/values/colors.xml
deleted file mode 100644
index 255f15d..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 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>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
-</resources>
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/dimens.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 9a3477e..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- ~ Copyright 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>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/strings.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/values/strings.xml
deleted file mode 100644
index 8d4f357..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
- ~ Copyright 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>
- <string name="app_name">Persistence codelab</string>
- <string name="books_borrowed_by_user">Books borrowed by Mike:</string>
- <string name="refresh">Refresh</string>
- <string name="young_users">Young users:</string>
-</resources>
diff --git a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/styles.xml b/samples-flatfoot/codelabs/persistence/app/src/main/res/values/styles.xml
deleted file mode 100644
index 7aa7228..0000000
--- a/samples-flatfoot/codelabs/persistence/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- ~ Copyright 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>
-
- <!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- </style>
-
-</resources>
diff --git a/samples-flatfoot/codelabs/persistence/build.gradle b/samples-flatfoot/codelabs/persistence/build.gradle
deleted file mode 100644
index c68afa8..0000000
--- a/samples-flatfoot/codelabs/persistence/build.gradle
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 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.
- */
-
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- maven {
- url "../../../prebuilts0905"
- }
- }
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
-
-ext {
- buildToolsVersion = "25.0.2"
- supportLibVersion = "25.3.1"
- runnerVersion = "0.5"
- rulesVersion = "0.5"
- espressoVersion = "2.2.2"
- archLifecycleVersion = "1.0-SNAPSHOT"
- archRoomVersion = "1.0-SNAPSHOT"
-}
\ No newline at end of file
diff --git a/samples-flatfoot/codelabs/persistence/gradle.properties b/samples-flatfoot/codelabs/persistence/gradle.properties
deleted file mode 100644
index 684bee6..0000000
--- a/samples-flatfoot/codelabs/persistence/gradle.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 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.
-#
-
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
diff --git a/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.jar b/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
--- a/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.properties b/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 1af3d91..0000000
--- a/samples-flatfoot/codelabs/persistence/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright 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.
-#
-
-#Mon Feb 20 17:11:12 GMT 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
diff --git a/samples-flatfoot/codelabs/persistence/gradlew b/samples-flatfoot/codelabs/persistence/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/samples-flatfoot/codelabs/persistence/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples-flatfoot/codelabs/persistence/gradlew.bat b/samples-flatfoot/codelabs/persistence/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/samples-flatfoot/codelabs/persistence/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/samples-flatfoot/codelabs/persistence/settings.gradle b/samples-flatfoot/codelabs/persistence/settings.gradle
deleted file mode 100644
index a266f7d..0000000
--- a/samples-flatfoot/codelabs/persistence/settings.gradle
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 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.
- */
-
-include ':app'
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar
deleted file mode 100644
index 6138a05..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.md5
deleted file mode 100644
index 21687b1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-ca1aba09bd76b2d712a70b09674fa412
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.sha1
deleted file mode 100644
index c355fa9..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-786fff12d11854e99079f3e0e6b83ebd28ff760b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar
deleted file mode 100644
index 841ae62..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.md5
deleted file mode 100644
index 900ce94..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-9e86f87a007df4935a8cf0082e1320a9
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.sha1
deleted file mode 100644
index eb644c7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3b31c3725f3657796df063e274b23e6383d662db
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom
deleted file mode 100644
index bc302ff..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.core</groupId>
- <artifactId>core-testing</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <artifactId>hamcrest-core</artifactId>
- <groupId>*</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.md5
deleted file mode 100644
index 99a13b1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-9161bbbd4308131850c1620bb771413b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.sha1
deleted file mode 100644
index 8881d77..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/core-testing-1.0-20170509.055323-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-980c8177656c28f493cb217a9062edc76f3d3200
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 3f48496..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.core</groupId>
- <artifactId>core-testing</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055323</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055323</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 482731c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-16f7cf4f43258b77ea8e33338cd1f4cb
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index a01b80b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d7c7da1de4e1b50b126834001789e48c480cec9b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml
deleted file mode 100644
index bdb88ee..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.core</groupId>
- <artifactId>core-testing</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055323</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.md5
deleted file mode 100644
index 2bbeb72..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-28ca42527f6d8bec31b416b80d6ffc54
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.sha1
deleted file mode 100644
index cd44769..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core-testing/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-94753c43775c32019a4f85863e1338d7ff3638aa
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar
deleted file mode 100644
index f52dc52..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.md5
deleted file mode 100644
index 2de86ff..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-a9cb0e2a06be3862ac3eb5dd0a40bc38
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.sha1
deleted file mode 100644
index fff6c6e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-492b289a5504fa4911396b6aa30f51152f3bd63d
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar
deleted file mode 100644
index f7f1fe2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.md5
deleted file mode 100644
index 5e269c4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-85e796de2d30eb59d8efab529494aef1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.sha1
deleted file mode 100644
index 50b923f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9b8ae95c6cc663e2d878fa0eb8d5929d48e317be
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom
deleted file mode 100644
index e4f8577..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.md5
deleted file mode 100644
index f3b5050..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-50b9fc578d98dbde38da151dd8b255ab
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.sha1
deleted file mode 100644
index 91cc482..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/core-1.0-20170509.055320-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9f6fb7815cbc0182e9ec7f8265a1cdb7b61683d6
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 200b060..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055320</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055320</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index e5613e2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-3c01bf68e8d32b635a83b8253fc25d23
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index b26628c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-58c742a83ad30c448a9a761d47c294c6cc8ac7c1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml
deleted file mode 100644
index 239807f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055320</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.md5
deleted file mode 100644
index fa46ec3..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-60274a3697bb7af7269caf05465128b0
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.sha1
deleted file mode 100644
index d2982c8..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/core/core/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-519a49c6d42f3b1c626f50ac403a9d41eabec4a6
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar
deleted file mode 100644
index e40c05a..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5
deleted file mode 100644
index a0a52da..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-e8baf35acac6b25d983783be3e621cda
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1
deleted file mode 100644
index 58a271e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-89fb66a8f95627748ead98b767a49049ffde0dff
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar
deleted file mode 100644
index 4aa7230..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5
deleted file mode 100644
index 68484a7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-802e82041a07652f61f9165b153dc15d
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1
deleted file mode 100644
index f83bdc4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e3145ca81e2c53e03fd28e2055038c6dcbd685a3
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom
deleted file mode 100644
index 2a2c6a2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5
deleted file mode 100644
index f587d0d..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-a3d47b73dc2c60f4e284edccaa32a2c6
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1
deleted file mode 100644
index 4b27254..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-08b48078fcd3405b228d765b3f5330657177dcf9
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 0639952..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055319</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index de4dbeb..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-adfb440ef27599c81051adf3c6870fdd
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 2cdc1f1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-fe97e167517cf6a5dea2542bdb6dcf0a8b4fd836
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml
deleted file mode 100644
index d57f771..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.md5
deleted file mode 100644
index 0028096..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-9e7b509d54a18ba3dd9d4490c5e0fe4b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.sha1
deleted file mode 100644
index 6a4a338..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/common/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0a2cc2cde711fcfab4a2130f23a2ffc46da1c9e2
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar
deleted file mode 100644
index c4ec5ee..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.md5
deleted file mode 100644
index 5f9022d..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-283d1cef886ab31cdfa36fc4f4723522
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.sha1
deleted file mode 100644
index 057382f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bb04fae46a4f5b3437647c6b220d3f83e743a142
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom
deleted file mode 100644
index f535b27..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>compiler</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-stdlib</artifactId>
- <version>1.1.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.auto</groupId>
- <artifactId>auto-common</artifactId>
- <version>0.6</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.squareup</groupId>
- <artifactId>javapoet</artifactId>
- <version>1.8.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.testing.compile</groupId>
- <artifactId>compile-testing</artifactId>
- <version>0.9</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.md5
deleted file mode 100644
index 6133381..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-11e01c4576a32a85e2217ace258bb3ae
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.sha1
deleted file mode 100644
index 7f95c9e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055334-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0b05cdc5ef9399c719781af8eca2181e26c497eb
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 9f84bdd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>compiler</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055334</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055334</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 42056ce..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-a8acb146e14626b29f5fcadaf0024440
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 63adc5c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4f276e57a746f8db4893e08f0f27ae8ba56d7fce
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml
deleted file mode 100644
index d5436f7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>compiler</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055334</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.md5
deleted file mode 100644
index f76a96f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-c57843ea079fc099a5154241eec684cf
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.sha1
deleted file mode 100644
index f9a9353..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/compiler/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5fc8da2188394ab4e2eb58c531c9220f13db8a24
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar
deleted file mode 100644
index d73e7df..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.md5
deleted file mode 100644
index 767e164..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-e4b150782bee7fb260a2c78853477add
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.sha1
deleted file mode 100644
index bd310fa..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a5925ed0438d698a075e6414436cfdcc4c9e0ba7
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar
deleted file mode 100644
index a09f22c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.md5
deleted file mode 100644
index 89fe675..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-e418844524d5c65029aa348c53a0bf67
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.sha1
deleted file mode 100644
index d39825b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-373647ae3a3bad83e032c612649efd2ea133799e
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom
deleted file mode 100644
index 9296ff2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>extensions</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-fragment</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.md5
deleted file mode 100644
index 7978412..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-b3f086ec40beb1fcc4bdbe38c5a20991
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.sha1
deleted file mode 100644
index 0dfcc82..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/extensions-1.0-20170509.055326-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-1b0f4dacffaededdf8586e0725ee7b885a35ca78
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index af54226..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>extensions</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055326</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index efc9595..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-99b5c18f18ea47c80ece0f2491238a30
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 2898c42..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0dfc0c4ec791e73736f931cc858dedc97b3fd7f3
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml
deleted file mode 100644
index 93ce52b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>extensions</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.md5
deleted file mode 100644
index 522068b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-040c8b66d0d04d6c22a3387168a3ea55
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.sha1
deleted file mode 100644
index 60128e1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/extensions/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bb7352424e9431928663f02b3c0601594851185d
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 74ef725..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>reactivestreams</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055326</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 933c1d0..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-7fc056a05fe5d7c22a1e7272a29b3260
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index dee724e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-1a0545cbc716124ace898ea8d8591682fba09858
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar
deleted file mode 100644
index fdf77cb..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.md5
deleted file mode 100644
index 10ec5e4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-52a8b0601fcc93dbe00c6c4383a761f9
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.sha1
deleted file mode 100644
index 63a57f2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4be78d28a595a3780e81688377685fa3a8e6e762
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar
deleted file mode 100644
index d3fbc8d..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.md5
deleted file mode 100644
index ebf9646..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-7c9c2c20f41ca66ab06d29ba702717e1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.sha1
deleted file mode 100644
index 3b283bd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0ea07afc69041e728122223c405754daf3c6245b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom
deleted file mode 100644
index 1acf4de..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>reactivestreams</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>extensions</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.reactivestreams</groupId>
- <artifactId>reactive-streams</artifactId>
- <version>1.0.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.md5
deleted file mode 100644
index 281c0ec..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-d100fe77c4b95264134281078880bf7c
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.sha1
deleted file mode 100644
index 83d8797..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/1.0-SNAPSHOT/reactivestreams-1.0-20170509.055326-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0b1f6442bb8375850efc983bef2352cb17fbfb49
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml
deleted file mode 100644
index 219ace3..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>reactivestreams</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.md5
deleted file mode 100644
index 613ffc5..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-a8578e327c72aef75966f5d8e2dab594
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.sha1
deleted file mode 100644
index a02462f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/reactivestreams/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bc5e3cca5166659a77527b953600fe9d9cc14f99
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 07fcce9..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055323</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055323</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 0a6997e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-119521b96ea5b84141125701eb521df0
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 021dc3e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bb6a47101b4b0b10f21d31869325168d2282510b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar
deleted file mode 100644
index 5c5b019..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.md5
deleted file mode 100644
index 429dca5..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-ddac4b3463d2bce5169b57550caf4897
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.sha1
deleted file mode 100644
index a451feb..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-684636a06ea02c5c7c0edb05cef8b54b6904cd9a
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar
deleted file mode 100644
index 3977677..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.md5
deleted file mode 100644
index e92c468..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-9378a6ef4cfdfa8edb8782ccea95cdf7
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.sha1
deleted file mode 100644
index 6e17fc4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-df3ef640c9deb3ff016704de2730b2f8b45f9fd4
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom
deleted file mode 100644
index 7277c40..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-fragment</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.md5
deleted file mode 100644
index 8a3f144..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-cdb420b579966da6376ed24a5ae83b69
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.sha1
deleted file mode 100644
index 5cc15e7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055323-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-58d1017ee4b7026ce71d4f5d8be32615332f3875
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml
deleted file mode 100644
index f61cff8..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.lifecycle</groupId>
- <artifactId>runtime</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055323</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.md5
deleted file mode 100644
index cf3ad70..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-d8899f99ced40f4ad3bbd8fbe36841f1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.sha1
deleted file mode 100644
index d73bdaf..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/lifecycle/runtime/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a8a7e9043d27353cfe1365687757e8585a004695
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar
deleted file mode 100644
index edd10aa..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5
deleted file mode 100644
index 3924784..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-d96a6026f4f80ce4d6b89c0fc4303796
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1
deleted file mode 100644
index ed8b25e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5d525be81aafd7f9dcdf97256ebc048c9eabcb07
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar
deleted file mode 100644
index 2d13c79..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5
deleted file mode 100644
index 653ce9e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-617e423f1eb5587f924f26c92cf6fe7c
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1
deleted file mode 100644
index 0994ece..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8f2696a4d237db1a136040470d52e7d8509c5e76
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom
deleted file mode 100644
index 9e1e0a7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5
deleted file mode 100644
index 337b77b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-d2d34afe4df97e3cc011ea5767004ab1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1
deleted file mode 100644
index 7aed843..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/common-1.0-20170509.055319-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cfb361baaef3ea8286b0b20785d6e1fac68abf38
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 4f8bf1d..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055319</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 62b1eb2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-f87d8e9973f56fdafd9815f8642f3358
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 330cc7f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2110a03050a782cb1b95ec525e6039429b40d74f
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml
deleted file mode 100644
index 4cb4c36..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.md5
deleted file mode 100644
index 600e038..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-7fc679dffa8896ced94b1ba240424f1a
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.sha1
deleted file mode 100644
index d0db785..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/common/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9f66a6fcbce5453296232fbab25c009bf6ebc2d3
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar
deleted file mode 100644
index 87008fd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.md5
deleted file mode 100644
index 5dab906..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-878684478cf5fcd81aa5961c0bf8c940
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.sha1
deleted file mode 100644
index cda2f71..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-01fbebc823191731e95eb090598bddb71c770846
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom
deleted file mode 100644
index efe6593..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>compiler</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>migration</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-stdlib</artifactId>
- <version>1.1.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.auto</groupId>
- <artifactId>auto-common</artifactId>
- <version>0.6</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.squareup</groupId>
- <artifactId>javapoet</artifactId>
- <version>1.8.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr4</artifactId>
- <version>4.5.3</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.xerial</groupId>
- <artifactId>sqlite-jdbc</artifactId>
- <version>3.16.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.10</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.testing.compile</groupId>
- <artifactId>compile-testing</artifactId>
- <version>0.9</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.intellij</groupId>
- <artifactId>annotations</artifactId>
- <version>12.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.md5
deleted file mode 100644
index 488d62c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-48fb3ae050b678360a30cb666cf9a1c6
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.sha1
deleted file mode 100644
index 75933e7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/compiler-1.0-20170509.055353-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e4542a5347e599d1d47698c0d22b9896b143aea1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 8ce1efb..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>compiler</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055353</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055353</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 7b11f7b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-968ac62f039514702b626c638098a1c8
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 0f271a2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-077974f948717100560d289e57c7dfdf64ec9ffb
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml
deleted file mode 100644
index 9789469..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>compiler</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055353</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.md5
deleted file mode 100644
index 19b39d5..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-971636fd89a0d54a36cf44c563013f86
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.sha1
deleted file mode 100644
index 6ed6e2c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/compiler/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f4c75f7d9c9d2a8b435d8bf5dc3a76c9f8b208c0
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index d2b3c09..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>migration</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055319</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 48d33d0..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-d506023a946730d4c5a41001626247f1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 6660c9b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-da8833c7dcb320a7f548e52943a3486019bc16ed
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar
deleted file mode 100644
index fd9cd07..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.md5
deleted file mode 100644
index 925253c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-60b4e759c801c0352ede3896ddae748a
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.sha1
deleted file mode 100644
index 44a46ad..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9cd324c2a179d054e2211967c22b806fe8af955e
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom
deleted file mode 100644
index 9d8a6fa..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>migration</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-stdlib</artifactId>
- <version>1.1.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- <version>2.8.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.intellij</groupId>
- <artifactId>annotations</artifactId>
- <version>12.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.md5
deleted file mode 100644
index 33a93b0..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-0a669e52701c46ecadc30de6c051a639
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.sha1
deleted file mode 100644
index 0a70f31..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/1.0-SNAPSHOT/migration-1.0-20170509.055319-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a63a70d662d9323509cb6a572a796758fe9db461
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml
deleted file mode 100644
index ebb0a29..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>migration</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055319</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.md5
deleted file mode 100644
index 978b8a7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-99b3b410dc02180c9c0c10c3781fa579
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.sha1
deleted file mode 100644
index 2c8a5a7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/migration/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cd88e7b77886db1e0b132f0e9e9a53cdb03970a3
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 730bd12..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055326</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index fc02d49..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-a924de46a5dcc1837668bfa561d23711
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index b0aff48..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9104e562526a8f14c66bb9e98254b57ea80600d0
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar
deleted file mode 100644
index f6ee59f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.md5
deleted file mode 100644
index d40df09..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-eda26e1ab785dc53971d889eb9845083
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.sha1
deleted file mode 100644
index 27bb421..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e4e8c9823635c2322145356b70ef47f2cfc28ab1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar
deleted file mode 100644
index 2379814..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.md5
deleted file mode 100644
index 1ec84fd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-f0175ecb0f8d43aaaeb4d692fde7d116
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.sha1
deleted file mode 100644
index d1e8e03..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a66782337fb073ec6f5f7697238c9346bc286532
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom
deleted file mode 100644
index f36ae08..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.md5
deleted file mode 100644
index 2b67aef..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-63a5441f7d834dca6869ca055581a475
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.sha1
deleted file mode 100644
index f9dd7aa..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/1.0-SNAPSHOT/runtime-1.0-20170509.055326-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9b2b7d966e4a38c01ae60edd3f18b7cd54fba817
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml
deleted file mode 100644
index b1872b1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>runtime</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055326</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.md5
deleted file mode 100644
index 9e5d9c2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-19721121b6e77919fb393e427498d077
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.sha1
deleted file mode 100644
index 2b87a99..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/runtime/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-993d09a7892477275a4fe8e66631c4588e08b510
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 2c5971f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>rxjava2</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055327</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055327</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index e4459d4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-c0a13a54362f5390ee372be302cbcbeb
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index b2c0179..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a22e62e654b051d3747bea4b571eab0ce8a7f74c
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar
deleted file mode 100644
index 01fcbf2..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.md5
deleted file mode 100644
index 3054f51..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-35d73b25d37fcee1a93968ec26b3cff5
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.sha1
deleted file mode 100644
index 5182d8c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4019a6fb4e91c18e57c616f7757b1416cfd3dbe4
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar
deleted file mode 100644
index ff6d027..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.md5
deleted file mode 100644
index 22d1715..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-5a829c47d703301417cc6cdfb5fbd59b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.sha1
deleted file mode 100644
index 5a0f774..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c0ab291d1694054050f731b9dbff531a70e16062
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom
deleted file mode 100644
index a874342..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>rxjava2</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>io.reactivex.rxjava2</groupId>
- <artifactId>rxjava</artifactId>
- <version>2.0.6</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.md5
deleted file mode 100644
index 35a1d84..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-93d2c8e208b502d109ceb9f643cb45f9
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.sha1
deleted file mode 100644
index db0de3c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/1.0-SNAPSHOT/rxjava2-1.0-20170509.055327-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-dd0eb45799347fdb34ecc954aac657c3171aee92
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml
deleted file mode 100644
index 8715932..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>rxjava2</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055327</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.md5
deleted file mode 100644
index 5fc31ef..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-7c48385b26704ac646c7bf9cd8a5bb52
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.sha1
deleted file mode 100644
index 77f2cdd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/rxjava2/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8ba90dedbd7600671eb67ac40259103b2cac38af
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index 40eb680..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055321</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055321</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 9365695..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-3bc629486eaa6d2cae6abfcad5265a22
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index b5f569b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c6bb4877462ab4f0e61ae9d128e88f8b91d016e5
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar
deleted file mode 100644
index 7f1a590..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.md5
deleted file mode 100644
index 20e510b..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-55ed9edfb94fb93ec6472f0b8e0711b8
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.sha1
deleted file mode 100644
index 656af8d..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8c84ee3e91cce6ccf284bc94d4472714092bc98d
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar
deleted file mode 100644
index d079677..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.md5
deleted file mode 100644
index 31fee99..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-245cae9051e31d798357f66330982b5f
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.sha1
deleted file mode 100644
index 4161415..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-1fdafb1d828ce170ca0f11c3ddb293bcf5efce0f
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom
deleted file mode 100644
index 73afcf1..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.md5
deleted file mode 100644
index d5372bd..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-380065e2dc039d8d34076288bb2ea938
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.sha1
deleted file mode 100644
index 9559b0e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/1.0-SNAPSHOT/support-db-impl-1.0-20170509.055321-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c532878901a9aea9a5524ae24f14a065c5a3b87e
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml
deleted file mode 100644
index 965ab38..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db-impl</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055321</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.md5
deleted file mode 100644
index ab89ce3..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-fd51ff5d8d3680ec184c53d3b91d0ed1
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.sha1
deleted file mode 100644
index c72819f..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db-impl/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a2d5a89cb59f6fc89cba73e91b985b344afd87f4
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index bf42d23..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055321</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055321</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index 873f0bc..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-2cf9e4ddbd0f858a15e07ac3355aeb24
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 9134405..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5f2a26acd9607febe58a18cce0265f2ca4c880aa
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar
deleted file mode 100644
index 52ad39a..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.md5
deleted file mode 100644
index 16b3b27..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-4266c636eb39b348d7d91e4dcce2ddf0
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.sha1
deleted file mode 100644
index 212c5f6..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a9af60a542e8a4cb28d6983e87cb5e65c84bce33
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar
deleted file mode 100644
index ae6fd22..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.md5
deleted file mode 100644
index 9b46fb8..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-aff2c60fe9ae9879d3aba2b2d74e426b
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.sha1
deleted file mode 100644
index e43f29e..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3c485b7a86a6cccbf98b6f330bbf7a1409798f16
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom
deleted file mode 100644
index 16e3450..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-annotations</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.md5
deleted file mode 100644
index b3cc2ff..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-efe1c96944a927073adda14ff86c2135
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.sha1
deleted file mode 100644
index a180ef3..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/1.0-SNAPSHOT/support-db-1.0-20170509.055321-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-b85080854ab0c7856175b5bc235f07392df97b77
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml
deleted file mode 100644
index f2bc7f7..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055321</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.md5
deleted file mode 100644
index 0901e08..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-fa59bfa211d652dcc19b2e663c68ebc4
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.sha1
deleted file mode 100644
index 7432573..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/support-db/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2c3c2f524d551508d7adc3f99c3c0a26c08ee9d8
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml
deleted file mode 100644
index b73482a..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>testing</artifactId>
- <version>1.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <timestamp>20170509.055327</timestamp>
- <buildNumber>1</buildNumber>
- </snapshot>
- <lastUpdated>20170509055327</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.md5
deleted file mode 100644
index bdad56c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-e2d9eb39804daee0510063402d3657e6
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.sha1
deleted file mode 100644
index 56ed4cc..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0c604096877dbc6ef6c947217335895115690568
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar
deleted file mode 100644
index 190f5e4..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.md5
deleted file mode 100644
index 18f461c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.md5
+++ /dev/null
@@ -1 +0,0 @@
-4ce813e7662bb18f1a1160549c1e8aea
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.sha1
deleted file mode 100644
index dc67b23..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1-sources.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-be6096c6c0e24cdaece94a81f311d632eabf5481
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar
deleted file mode 100644
index aea6991..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar
+++ /dev/null
Binary files differ
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.md5
deleted file mode 100644
index 62ff241..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.md5
+++ /dev/null
@@ -1 +0,0 @@
-cdcceb69a05e598ea45569fcd30dec7e
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.sha1
deleted file mode 100644
index b4090a5..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.aar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9bc04de1a0494539696ad1a97d9b4eb3afe14f86
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom
deleted file mode 100644
index e05307c..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>testing</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>aar</packaging>
- <dependencies>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>runtime</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>support-db-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>migration</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>android.arch.core</groupId>
- <artifactId>core</artifactId>
- <version>1.0-SNAPSHOT</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>support-core-utils</artifactId>
- <version>25.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.md5
deleted file mode 100644
index 95dd555..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.md5
+++ /dev/null
@@ -1 +0,0 @@
-a8ff5e6331cbfbb65cfe54098c53fef7
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.sha1
deleted file mode 100644
index 972fbc3..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/1.0-SNAPSHOT/testing-1.0-20170509.055327-1.pom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0d39779bea0506af5ffa78167035cd62ad72e8b7
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml
deleted file mode 100644
index 0784805..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>android.arch.persistence.room</groupId>
- <artifactId>testing</artifactId>
- <versioning>
- <versions>
- <version>1.0-SNAPSHOT</version>
- </versions>
- <lastUpdated>20170509055327</lastUpdated>
- </versioning>
-</metadata>
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.md5 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.md5
deleted file mode 100644
index e6a97a9..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.md5
+++ /dev/null
@@ -1 +0,0 @@
-2132c0282da897b43ed3b8e50548dcc2
\ No newline at end of file
diff --git a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.sha1 b/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.sha1
deleted file mode 100644
index c167f8a..0000000
--- a/samples-flatfoot/prebuilts0905/android/arch/persistence/room/testing/maven-metadata.xml.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f8628435c4e8e8d8f8ae3bf0c4a1f16ebd40c80b
\ No newline at end of file
diff --git a/samples/Support13Demos/build.gradle b/samples/Support13Demos/build.gradle
index c63312f..4c015ae 100644
--- a/samples/Support13Demos/build.gradle
+++ b/samples/Support13Demos/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-v13')
+ implementation project(':support-v13')
}
android {
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index 836b212..e265698 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-v4')
+ implementation project(':support-v4')
}
android {
diff --git a/samples/Support7Demos/build.gradle b/samples/Support7Demos/build.gradle
index 618cfab..49b38ec 100644
--- a/samples/Support7Demos/build.gradle
+++ b/samples/Support7Demos/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-appcompat-v7')
- compile project(':support-cardview-v7')
- compile project(':support-gridlayout-v7')
- compile project(':support-mediarouter-v7')
- compile project(':support-palette-v7')
- compile project(':support-recyclerview-v7')
+ implementation project(':support-appcompat-v7')
+ implementation project(':support-cardview-v7')
+ implementation project(':support-gridlayout-v7')
+ implementation project(':support-mediarouter-v7')
+ implementation project(':support-palette-v7')
+ implementation project(':support-recyclerview-v7')
}
android {
diff --git a/samples/SupportAnimationDemos/build.gradle b/samples/SupportAnimationDemos/build.gradle
index c619f6b..d1ea614 100644
--- a/samples/SupportAnimationDemos/build.gradle
+++ b/samples/SupportAnimationDemos/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-dynamic-animation')
+ implementation project(':support-dynamic-animation')
}
android {
diff --git a/samples/SupportAppNavigation/build.gradle b/samples/SupportAppNavigation/build.gradle
index bb48f2f..c7d03b8 100644
--- a/samples/SupportAppNavigation/build.gradle
+++ b/samples/SupportAppNavigation/build.gradle
@@ -17,7 +17,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-v4')
+ implementation project(':support-v4')
}
android {
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
index 7987f52..48dfc9c 100644
--- a/samples/SupportDesignDemos/build.gradle
+++ b/samples/SupportDesignDemos/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-design')
+ implementation project(':support-design')
}
android {
diff --git a/samples/SupportEmojiDemos/build.gradle b/samples/SupportEmojiDemos/build.gradle
index 230e478..c5be42e 100644
--- a/samples/SupportEmojiDemos/build.gradle
+++ b/samples/SupportEmojiDemos/build.gradle
@@ -21,9 +21,9 @@
}
dependencies {
- compile project(':support-emoji')
- compile project(':support-emoji-bundled')
- compile project(':support-emoji-appcompat')
+ implementation project(':support-emoji')
+ implementation project(':support-emoji-bundled')
+ implementation project(':support-emoji-appcompat')
}
android {
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml
index 93bddce..010c297 100644
--- a/samples/SupportLeanbackDemos/AndroidManifest.xml
+++ b/samples/SupportLeanbackDemos/AndroidManifest.xml
@@ -189,5 +189,8 @@
<activity android:name=".VideoSupportActivity"
android:exported="true" />
+
+ <activity android:name=".VideoActivityWithDetailedCard"
+ android:exported="true" />
</application>
</manifest>
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
index ea6ed9e..4ec403e 100644
--- a/samples/SupportLeanbackDemos/build.gradle
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-leanback-v17')
- compile project(':support-preference-leanback-v17')
+ implementation project(':support-leanback-v17')
+ implementation project(':support-preference-leanback-v17')
}
android {
diff --git a/samples/SupportLeanbackDemos/res/drawable/google_map.jpg b/samples/SupportLeanbackDemos/res/drawable/google_map.jpg
new file mode 100644
index 0000000..447de09
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/google_map.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/layout/video_activity_detailed_card.xml b/samples/SupportLeanbackDemos/res/layout/video_activity_detailed_card.xml
new file mode 100644
index 0000000..ddacf0f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/video_activity_detailed_card.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.
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/videoFragment">
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/values/strings.xml b/samples/SupportLeanbackDemos/res/values/strings.xml
index 6de7d7b..4e4a398 100644
--- a/samples/SupportLeanbackDemos/res/values/strings.xml
+++ b/samples/SupportLeanbackDemos/res/values/strings.xml
@@ -79,6 +79,8 @@
<string name="onboarding">Onboarding</string>
<string name="onboarding_description">Show onboarding activity.</string>
<string name="onboarding_support">Onboarding(support version)</string>
+ <string name="video_play_with_detail_card">A video play activity with detail card</string>
+ <string name="video_play_with_detail_card_description">A video play activity with detail card</string>
<!-- Strings related to guided sequence activity -->
<string name="guidedstep_first_title">First</string>
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
index 733697c..4293dbb 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
@@ -60,43 +60,45 @@
addAction(actions, BrowseSupportActivity.class, R.string.browse_support,
R.string.browse_support_description);
addAction(actions, SearchActivity.class, R.string.search, R.string.search_description);
- addAction(actions, SearchSupportActivity.class, R.string.search_support, R.string.search_support_description);
+ addAction(actions, SearchSupportActivity.class, R.string.search_support,
+ R.string.search_support_description);
addAction(actions, DetailsActivity.class, R.string.details,
R.string.details_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, DetailsSupportActivity.class, R.string.details_support,
R.string.details_support_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, DetailsVideoActivity.class, R.string.details_video,
R.string.details_video_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, DetailsVideoSupportActivity.class, R.string.details_video_support,
R.string.details_video_support_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, DetailsCustomTitleActivity.class, R.string.details_custom_title,
R.string.details_custom_title_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, DetailsCustomTitleSupportActivity.class,
R.string.details_custom_title_support,
R.string.details_custom_title_support_description);
- actions.get(actions.size()-1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, SearchDetailsActivity.class, R.string.search_details,
R.string.search_details_description);
- actions.get(actions.size()-1).getIntent().putExtra(SearchDetailsActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(SearchDetailsActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, SearchDetailsSupportActivity.class, R.string.search_details_support,
R.string.search_details_support_description);
- actions.get(actions.size()-1).getIntent().putExtra(SearchDetailsSupportActivity.EXTRA_ITEM,
+ actions.get(actions.size() - 1).getIntent().putExtra(
+ SearchDetailsSupportActivity.EXTRA_ITEM,
new PhotoItem("Hello world", R.drawable.gallery_photo_1));
addAction(actions, VerticalGridActivity.class, R.string.vgrid,
R.string.vgrid_description);
@@ -109,8 +111,8 @@
addAction(actions, GuidedStepHalfScreenActivity.class, R.string.guidedstephalfscreen,
R.string.guidedstep_description);
addAction(actions, GuidedStepSupportHalfScreenActivity.class,
- R.string.guidedstepsupporthalfscreen,
- R.string.guidedstep_description);
+ R.string.guidedstepsupporthalfscreen,
+ R.string.guidedstep_description);
addAction(actions, BrowseErrorActivity.class, R.string.browseerror,
R.string.browseerror_description);
addAction(actions, BrowseErrorSupportActivity.class, R.string.browseerror_support,
@@ -141,6 +143,9 @@
addAction(actions, OnboardingSupportActivity.class,
R.string.onboarding_support,
R.string.onboarding_description);
+ addAction(actions, VideoActivityWithDetailedCard.class,
+ R.string.video_play_with_detail_card,
+ R.string.video_play_with_detail_card_description);
}
private void addAction(List<GuidedAction> actions, Class cls, int titleRes, int descRes) {
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivityWithDetailedCard.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivityWithDetailedCard.java
new file mode 100644
index 0000000..5acecd7
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivityWithDetailedCard.java
@@ -0,0 +1,71 @@
+/*
+ * 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.leanback;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.v4.os.BuildCompat;
+
+/**
+ * Activity that hosts VideoConsumptionExampleFragment.
+ *
+ * The main purpose to add this activity is to observe the bug b/28003943
+ */
+public class VideoActivityWithDetailedCard extends Activity {
+
+ public static final String TAG = "VideoExampleActivity";
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.video_activity_detailed_card);
+
+ if (savedInstanceState == null) {
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
+ ft.add(R.id.videoFragment, new VideoConsumptionWithDetailCardFragment(),
+ VideoConsumptionWithDetailCardFragment.TAG);
+ ft.commit();
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ // This part is necessary to ensure that getIntent returns the latest intent when
+ // VideoExampleActivity is started. By default, getIntent() returns the initial intent
+ // that was set from another activity that started VideoExampleActivity. However, we need
+ // to update this intent when for example, user clicks on another video when the currently
+ // playing video is in PIP mode, and a new video needs to be started.
+ setIntent(intent);
+ }
+
+ /**
+ * Helper function to determine if picture in picture mode is supported or not
+ * @param context current context
+ * @return if Picture in Picture mode is supported or not
+ */
+ public static boolean supportsPictureInPicture(Context context) {
+ return BuildCompat.isAtLeastN()
+ && context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_PICTURE_IN_PICTURE);
+ }
+}
+
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java
new file mode 100644
index 0000000..dd40c8f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java
@@ -0,0 +1,93 @@
+/*
+ * 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.leanback;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v17.leanback.app.VideoFragment;
+import android.support.v17.leanback.app.VideoFragmentGlueHost;
+import android.support.v17.leanback.media.MediaPlayerAdapter;
+import android.support.v17.leanback.media.PlaybackBannerControlGlue;
+import android.support.v17.leanback.media.PlaybackGlue;
+
+/**
+ * Fragment used as Control Glue's host
+ */
+public class VideoConsumptionWithDetailCardFragment extends VideoFragment {
+
+ public static final String TAG = "VideoConsumptionWithDetailCardFragment";
+ // A valid video URL to play video. So the progress bar can be seen to reproduce the bug.
+ private static final String VIDEO_URL =
+ "https://storage.googleapis.com/android-tv/Sample videos/"
+ + "April Fool's 2013/Explore Treasure Mode with Google Maps.mp4";
+ public static final String TITLE = "Diving with Sharks";
+ public static final String SUBTITLE = "A Googler";
+
+ private PlaybackBannerControlGlue<MediaPlayerAdapter> mMediaPlayerGlue;
+ final VideoFragmentGlueHost mHost = new VideoFragmentGlueHost(this);
+
+ /**
+ * helper function for playBackGlue to add/ remove callbacks
+ *
+ * @param glue The playback glue attached to this fragment
+ */
+ private static void playWhenReady(PlaybackGlue glue) {
+ if (glue.isPrepared()) {
+ glue.play();
+ } else {
+ glue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
+ @Override
+ public void onPreparedStateChanged(PlaybackGlue glue) {
+ if (glue.isPrepared()) {
+ glue.removePlayerCallback(this);
+ glue.play();
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ int[] defuatSpeed = new int[]{1};
+ mMediaPlayerGlue = new PlaybackBannerControlGlue<>(getActivity(), defuatSpeed,
+ new MediaPlayerAdapter(getActivity()));
+ // attach player glue to current host
+ mMediaPlayerGlue.setHost(mHost);
+
+ // add image resource to the PlaybackControlGlue
+ mMediaPlayerGlue.setArt(getActivity().getDrawable(R.drawable.google_map));
+
+ // meta information for video player
+ mMediaPlayerGlue.setTitle(TITLE);
+ mMediaPlayerGlue.setSubtitle(SUBTITLE);
+ mMediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(VIDEO_URL));
+ playWhenReady(mMediaPlayerGlue);
+ setBackgroundType(BG_LIGHT);
+ }
+
+ @Override
+ public void onPause() {
+ if (mMediaPlayerGlue != null) {
+ mMediaPlayerGlue.pause();
+ }
+ super.onPause();
+ }
+}
+
diff --git a/samples/SupportLeanbackJank/build.gradle b/samples/SupportLeanbackJank/build.gradle
index 44346f7..4900a65 100644
--- a/samples/SupportLeanbackJank/build.gradle
+++ b/samples/SupportLeanbackJank/build.gradle
@@ -1,9 +1,9 @@
apply plugin: 'com.android.application'
dependencies {
- compile 'com.github.bumptech.glide:glide:3.6.1'
- compile project(':support-leanback-v17')
- compile project(':support-preference-leanback-v17')
+ implementation 'com.github.bumptech.glide:glide:3.6.1'
+ implementation project(':support-leanback-v17')
+ implementation project(':support-preference-leanback-v17')
}
android {
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/google_map.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/google_map.jpg
new file mode 100644
index 0000000..447de09
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/google_map.jpg
Binary files differ
diff --git a/samples/SupportPercentDemos/build.gradle b/samples/SupportPercentDemos/build.gradle
index 7990a21..863da83 100644
--- a/samples/SupportPercentDemos/build.gradle
+++ b/samples/SupportPercentDemos/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-percent')
+ implementation project(':support-percent')
}
android {
diff --git a/samples/SupportPreferenceDemos/build.gradle b/samples/SupportPreferenceDemos/build.gradle
index 5bee5e9..d09e3db 100644
--- a/samples/SupportPreferenceDemos/build.gradle
+++ b/samples/SupportPreferenceDemos/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-appcompat-v7')
- compile project(':support-recyclerview-v7')
- compile project(':support-preference-v7')
- compile project(':support-preference-v14')
- compile project(':support-leanback-v17')
- compile project(':support-preference-leanback-v17')
+ implementation project(':support-appcompat-v7')
+ implementation project(':support-recyclerview-v7')
+ implementation project(':support-preference-v7')
+ implementation project(':support-preference-v14')
+ implementation project(':support-leanback-v17')
+ implementation project(':support-preference-leanback-v17')
}
android {
diff --git a/samples/SupportTransitionDemos/build.gradle b/samples/SupportTransitionDemos/build.gradle
index 7eda8b3..2a4fffc 100644
--- a/samples/SupportTransitionDemos/build.gradle
+++ b/samples/SupportTransitionDemos/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-transition')
- compile project(':support-appcompat-v7')
+ implementation project(':support-transition')
+ implementation project(':support-appcompat-v7')
}
android {
diff --git a/samples/SupportVectorDrawableDemos/build.gradle b/samples/SupportVectorDrawableDemos/build.gradle
index 8520eb1..79383ca 100644
--- a/samples/SupportVectorDrawableDemos/build.gradle
+++ b/samples/SupportVectorDrawableDemos/build.gradle
@@ -17,9 +17,9 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-vector-drawable')
- compile project(':support-animated-vector-drawable')
- compile project(':support-appcompat-v7')
+ implementation project(':support-vector-drawable')
+ implementation project(':support-animated-vector-drawable')
+ implementation project(':support-appcompat-v7')
}
android {
diff --git a/samples/SupportWearDemos/AndroidManifest.xml b/samples/SupportWearDemos/AndroidManifest.xml
index eb10f0a..4e4fb60 100644
--- a/samples/SupportWearDemos/AndroidManifest.xml
+++ b/samples/SupportWearDemos/AndroidManifest.xml
@@ -24,6 +24,8 @@
</activity>
<activity android:name="com.example.android.support.wear.app.WearableSwitchDemo">
</activity>
+ <activity android:name="com.example.android.support.wear.app.CircularProgressLayoutDemo">
+ </activity>
<activity android:name="com.example.android.support.wear.app.MainDemoActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/samples/SupportWearDemos/build.gradle b/samples/SupportWearDemos/build.gradle
index a4d0c61..4a22995 100644
--- a/samples/SupportWearDemos/build.gradle
+++ b/samples/SupportWearDemos/build.gradle
@@ -17,7 +17,7 @@
apply plugin: 'com.android.application'
dependencies {
- compile project(':support-wear')
+ implementation project(':support-wear')
}
android {
diff --git a/samples/SupportWearDemos/res/layout/cpl_demo.xml b/samples/SupportWearDemos/res/layout/cpl_demo.xml
new file mode 100644
index 0000000..cf29663
--- /dev/null
+++ b/samples/SupportWearDemos/res/layout/cpl_demo.xml
@@ -0,0 +1,42 @@
+<?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.
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <android.support.wear.widget.CircularProgressLayout
+ android:id="@+id/circularProgressLayout_layout"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:padding="10dp"
+ app:backgroundColor="@color/cpl_light_yellow"
+ app:colorSchemeColors="@color/cpl_light_blue"
+ app:strokeWidth="10dp">
+ <TextView
+ android:id="@+id/circularProgressLayout_child"
+ android:layout_width="60dp"
+ android:layout_height="60dp"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:textColor="@color/cpl_black"
+ android:text="@string/cpl_click_me"/>
+ </android.support.wear.widget.CircularProgressLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportWearDemos/res/values/colors.xml b/samples/SupportWearDemos/res/values/colors.xml
new file mode 100644
index 0000000..95c0119
--- /dev/null
+++ b/samples/SupportWearDemos/res/values/colors.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.
+ -->
+
+<resources>
+ <color name="cpl_light_yellow">#fff176</color>
+ <color name="cpl_light_red">#ef5350</color>
+ <color name="cpl_light_green">#66bb6a</color>
+ <color name="cpl_light_blue">#4fc3f7</color>
+ <color name="cpl_black">#000000</color>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportWearDemos/res/values/strings.xml b/samples/SupportWearDemos/res/values/strings.xml
new file mode 100644
index 0000000..7f92211
--- /dev/null
+++ b/samples/SupportWearDemos/res/values/strings.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.
+ -->
+
+<resources>
+ <string name="cpl_click_me">Click me!</string>
+ <string name="cpl_clicked">Clicked!</string>
+ <string name="cpl_finished">Finished!</string>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/CircularProgressLayoutDemo.java b/samples/SupportWearDemos/src/com/example/android/support/wear/app/CircularProgressLayoutDemo.java
new file mode 100644
index 0000000..6bd4438
--- /dev/null
+++ b/samples/SupportWearDemos/src/com/example/android/support/wear/app/CircularProgressLayoutDemo.java
@@ -0,0 +1,77 @@
+/*
+ * 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.support.wear.app;
+
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.v4.content.ContextCompat;
+import android.support.wear.widget.CircularProgressLayout;
+import android.view.View;
+import android.widget.TextView;
+
+import com.example.android.support.wear.R;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Main activity for the CircularProgressLayout demo.
+ */
+@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+public class CircularProgressLayoutDemo extends Activity implements
+ CircularProgressLayout.OnTimerFinishedListener, View.OnClickListener {
+
+ private static final long TOTAL_TIME = TimeUnit.SECONDS.toMillis(10);
+
+ CircularProgressLayout mCircularProgressLayout;
+ TextView mChildView;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.cpl_demo);
+ mCircularProgressLayout = findViewById(R.id.circularProgressLayout_layout);
+ mChildView = findViewById(R.id.circularProgressLayout_child);
+
+ mCircularProgressLayout.setOnClickListener(this);
+ mCircularProgressLayout.setOnTimerFinishedListener(this);
+
+ mCircularProgressLayout.setTotalTime(TOTAL_TIME);
+ mCircularProgressLayout.startTimer();
+ }
+
+ @Override
+ public void onTimerFinished(CircularProgressLayout layout) {
+ if (layout == mCircularProgressLayout) {
+ mChildView.setText(getString(R.string.cpl_finished));
+ mCircularProgressLayout.setBackgroundColor(
+ ContextCompat.getColor(this, R.color.cpl_light_green));
+ }
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (view == mCircularProgressLayout && mCircularProgressLayout.isTimerRunning()) {
+ mCircularProgressLayout.stopTimer();
+ mChildView.setText(getString(R.string.cpl_clicked));
+ mCircularProgressLayout.setBackgroundColor(
+ ContextCompat.getColor(this, R.color.cpl_light_red));
+ }
+ }
+}
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java b/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java
index c9512a2..313457b 100644
--- a/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java
+++ b/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java
@@ -54,12 +54,15 @@
this, SimpleWearableRecyclerViewDemo.class));
contentMap.put("Wearable Switch", new Intent(
this, WearableSwitchDemo.class));
+ contentMap.put("Circular Progress Layout", new Intent(
+ this, CircularProgressLayoutDemo.class));
return contentMap;
}
private class ViewHolder extends RecyclerView.ViewHolder {
Button mView;
+
ViewHolder(Button itemView) {
super(itemView);
mView = itemView;
diff --git a/transition/build.gradle b/transition/build.gradle
index decde29..ef23aef 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -3,17 +3,17 @@
archivesBaseName = 'transition'
dependencies {
- compile project(':support-annotations')
- compile project(':support-v4')
+ api project(':support-annotations')
+ api project(':support-v4')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/transition/lint-baseline.xml b/transition/lint-baseline.xml
index 4d3d334..e961253 100644
--- a/transition/lint-baseline.xml
+++ b/transition/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 23146c9..e16394e 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -2,9 +2,10 @@
archivesBaseName = 'support-tv-provider'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
- androidTestCompile (libs.test_runner) {
+ api project(':support-annotations')
+ api project(':support-compat')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
}
diff --git a/tv-provider/lint-baseline.xml b/tv-provider/lint-baseline.xml
index 95d2eae..4eaddc8 100644
--- a/tv-provider/lint-baseline.xml
+++ b/tv-provider/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="WrongConstant"
diff --git a/tv-provider/src/android/support/media/tv/TvContractUtils.java b/tv-provider/src/android/support/media/tv/TvContractUtils.java
index 2638e34..edcd917 100644
--- a/tv-provider/src/android/support/media/tv/TvContractUtils.java
+++ b/tv-provider/src/android/support/media/tv/TvContractUtils.java
@@ -20,6 +20,10 @@
import android.media.tv.TvContentRating;
import android.support.annotation.RestrictTo;
import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Static helper methods for working with {@link android.media.tv.TvContract}.
@@ -28,26 +32,34 @@
@RestrictTo(LIBRARY_GROUP)
public class TvContractUtils {
+ static final TvContentRating[] EMPTY = new TvContentRating[0];
+
private static final String TAG = "TvContractUtils";
private static final boolean DEBUG = false;
private static final String DELIMITER = ",";
/**
* Parses a string of comma-separated ratings into an array of {@link TvContentRating}.
+ * <p>Invalid strings are droppped. Duplicates are not removed. The order is preserved.</p>
*
* @param commaSeparatedRatings String containing various ratings, separated by commas.
* @return An array of TvContentRatings.
*/
public static TvContentRating[] stringToContentRatings(String commaSeparatedRatings) {
if (TextUtils.isEmpty(commaSeparatedRatings)) {
- return null;
+ return EMPTY;
}
String[] ratings = commaSeparatedRatings.split("\\s*,\\s*");
- TvContentRating[] contentRatings = new TvContentRating[ratings.length];
- for (int i = 0; i < contentRatings.length; ++i) {
- contentRatings[i] = TvContentRating.unflattenFromString(ratings[i]);
+ List<TvContentRating> contentRatings = new ArrayList<>(ratings.length);
+ for (String rating : ratings) {
+ try {
+ contentRatings.add(TvContentRating.unflattenFromString(rating));
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "Can't parse the content rating: '" + rating + "', skipping", e);
+ }
}
- return contentRatings;
+ return contentRatings.size() == 0 ? EMPTY
+ : contentRatings.toArray(new TvContentRating[contentRatings.size()]);
}
/**
diff --git a/tv-provider/tests/src/android/support/media/tv/TvContractUtilsTest.java b/tv-provider/tests/src/android/support/media/tv/TvContractUtilsTest.java
new file mode 100644
index 0000000..bf9ea40
--- /dev/null
+++ b/tv-provider/tests/src/android/support/media/tv/TvContractUtilsTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.tv;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import android.media.tv.TvContentRating;
+import android.os.Build;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+@SmallTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+public class TvContractUtilsTest extends TestCase {
+
+ @Test
+ public void testStringToContentRatings_nullInput() {
+ assertArrayEquals(TvContractUtils.EMPTY, TvContractUtils.stringToContentRatings(null));
+ }
+
+ @Test
+ public void testStringToContentRatings_emptyInput() {
+ assertArrayEquals(TvContractUtils.EMPTY, TvContractUtils.stringToContentRatings(""));
+ }
+
+ @Test
+ public void testStringToContentRatings_singleRating() {
+ TvContentRating[] ratings = new TvContentRating[1];
+ ratings[0] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_PG",
+ "US_TV_D",
+ "US_TV_L",
+ "US_TV_S",
+ "US_TV_V");
+ assertArrayEquals(ratings, TvContractUtils.stringToContentRatings(
+ "com.android.tv/US_TV/US_TV_PG/US_TV_D/US_TV_L/US_TV_S/US_TV_V"));
+ }
+
+ @Test
+ public void testStringToContentRatings_multipleRatings() {
+ TvContentRating[] ratings = new TvContentRating[3];
+ ratings[0] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_MV",
+ "US_MV_NC17");
+ ratings[1] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_Y7");
+ ratings[2] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_PG",
+ "US_TV_D",
+ "US_TV_L",
+ "US_TV_S",
+ "US_TV_V");
+ assertArrayEquals(ratings, TvContractUtils.stringToContentRatings(
+ "com.android.tv/US_MV/US_MV_NC17,"
+ + "com.android.tv/US_TV/US_TV_Y7,"
+ + "com.android.tv/US_TV/US_TV_PG/US_TV_D/US_TV_L/US_TV_S/US_TV_V"));
+ }
+
+ @Test
+ public void testStringToContentRatings_allRatingsInvalid() {
+ assertArrayEquals(TvContractUtils.EMPTY, TvContractUtils.stringToContentRatings(
+ "com.android.tv/US_MV," // Invalid
+ + "com.android.tv")); // Invalid
+ }
+
+ @Test
+ public void testStringToContentRatings_someRatingsInvalid() {
+ TvContentRating[] ratings = new TvContentRating[1];
+ ratings[0] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_PG",
+ "US_TV_D",
+ "US_TV_L",
+ "US_TV_S",
+ "US_TV_V");
+ assertArrayEquals(ratings, TvContractUtils.stringToContentRatings(
+ "com.android.tv/US_MV," // Invalid
+ + "com.android.tv/US_TV/US_TV_PG/US_TV_D/US_TV_L/US_TV_S/US_TV_V," // Valid
+ + "com.android.tv")); // Invalid
+ }
+
+ @Test
+ public void testContentRatingsToString_nullInput() {
+ assertEquals(null, TvContractUtils.contentRatingsToString(null));
+ }
+
+ @Test
+ public void testContentRatingsToString_emptyInput() {
+ assertEquals(null, TvContractUtils.contentRatingsToString(new TvContentRating[0]));
+ }
+
+ @Test
+ public void testContentRatingsToString_singleRating() {
+ TvContentRating[] ratings = new TvContentRating[1];
+ ratings[0] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_PG",
+ "US_TV_D",
+ "US_TV_L",
+ "US_TV_S",
+ "US_TV_V");
+ assertEquals("com.android.tv/US_TV/US_TV_PG/US_TV_D/US_TV_L/US_TV_S/US_TV_V",
+ TvContractUtils.contentRatingsToString(ratings));
+ }
+
+ @Test
+ public void testContentRatingsToString_multipleRatings() {
+ TvContentRating[] ratings = new TvContentRating[3];
+ ratings[0] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_MV",
+ "US_MV_NC17");
+ ratings[1] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_PG",
+ "US_TV_D",
+ "US_TV_L",
+ "US_TV_S",
+ "US_TV_V");
+ ratings[2] = TvContentRating.createRating(
+ "com.android.tv",
+ "US_TV",
+ "US_TV_Y7");
+ String ratingString = "com.android.tv/US_MV/US_MV_NC17,"
+ + "com.android.tv/US_TV/US_TV_PG/US_TV_D/US_TV_L/US_TV_S/US_TV_V,"
+ + "com.android.tv/US_TV/US_TV_Y7";
+ assertEquals(ratingString, TvContractUtils.contentRatingsToString(ratings));
+ }
+}
diff --git a/v13/build.gradle b/v13/build.gradle
index 9c25738..477f31d 100644
--- a/v13/build.gradle
+++ b/v13/build.gradle
@@ -2,17 +2,17 @@
archivesBaseName = 'support-v13'
dependencies {
- compile project(':support-annotations')
- compile project(':support-v4')
+ api project(':support-annotations')
+ api project(':support-v4')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/v13/lint-baseline.xml b/v13/lint-baseline.xml
index 4d3d334..e961253 100644
--- a/v13/lint-baseline.xml
+++ b/v13/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v14/preference/build.gradle b/v14/preference/build.gradle
index e36ab82..7df48af 100644
--- a/v14/preference/build.gradle
+++ b/v14/preference/build.gradle
@@ -18,10 +18,10 @@
archivesBaseName = 'preference-v14'
dependencies {
- compile project(':support-v4')
- compile project(':support-appcompat-v7')
- compile project(':support-recyclerview-v7')
- compile project(':support-preference-v7')
+ api project(':support-v4')
+ api project(':support-appcompat-v7')
+ api project(':support-recyclerview-v7')
+ api project(':support-preference-v7')
}
android {
diff --git a/v14/preference/lint-baseline.xml b/v14/preference/lint-baseline.xml
index adeb0d6..1d140cc 100644
--- a/v14/preference/lint-baseline.xml
+++ b/v14/preference/lint-baseline.xml
@@ -1,141 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/preference_dropdown.xml"
- line="29"
- column="9"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout-v11/preference_dropdown.xml"
- line="30"
- column="9"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="Suspicious0dp"
@@ -170,323 +34,4 @@
column="9"/>
</issue>
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class PreferenceImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/internal/widget/PreferenceImageView.java"
- line="33"
- column="42"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
</issues>
diff --git a/v17/leanback/build.gradle b/v17/leanback/build.gradle
index a2e7342..ea11627 100644
--- a/v17/leanback/build.gradle
+++ b/v17/leanback/build.gradle
@@ -2,27 +2,21 @@
archivesBaseName = 'leanback-v17'
dependencies {
- compile project(':support-compat')
- compile project(':support-core-ui')
- compile project(':support-media-compat')
- compile project(':support-fragment')
- compile project(':support-recyclerview-v7')
+ api project(':support-compat')
+ api project(':support-core-ui')
+ api project(':support-media-compat')
+ api project(':support-fragment')
+ api project(':support-recyclerview-v7')
- androidTestCompile (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestCompile (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile libs.multidex
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
defaultConfig {
minSdkVersion 17
- multiDexEnabled true
}
sourceSets {
diff --git a/v17/leanback/lint-baseline.xml b/v17/leanback/lint-baseline.xml
index b373b5e..e961253 100644
--- a/v17/leanback/lint-baseline.xml
+++ b/v17/leanback/lint-baseline.xml
@@ -1,15 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 3.0.0-alpha5">
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v17/leanback/res/layout/lb_playback_controls_row.xml b/v17/leanback/res/layout/lb_playback_controls_row.xml
index b449fa9..30d06bd 100644
--- a/v17/leanback/res/layout/lb_playback_controls_row.xml
+++ b/v17/leanback/res/layout/lb_playback_controls_row.xml
@@ -67,7 +67,7 @@
<Space
android:id="@+id/spacer"
android:layout_width="match_parent"
- android:layout_height="24dp" />
+ android:layout_height="16dp" />
<FrameLayout
android:id="@+id/controls_dock"
diff --git a/v17/leanback/res/layout/lb_playback_transport_controls_row.xml b/v17/leanback/res/layout/lb_playback_transport_controls_row.xml
index c8852e8..8b692f3 100644
--- a/v17/leanback/res/layout/lb_playback_transport_controls_row.xml
+++ b/v17/leanback/res/layout/lb_playback_transport_controls_row.xml
@@ -18,7 +18,7 @@
<!-- Note: clipChildren/clipToPadding false are needed to apply shadows to child
views with no padding of their own. Also to allow for negative margin on description. -->
-<android.support.v17.leanback.widget.PlaybackTransportRowView
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -68,9 +68,10 @@
android:layout_marginBottom="@dimen/lb_playback_transport_thumbs_bottom_margin" />
</FrameLayout>
- <LinearLayout
+ <android.support.v17.leanback.widget.PlaybackTransportRowView
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:id="@+id/transport_row"
android:orientation="vertical"
android:paddingStart="?attr/browsePaddingStart"
android:paddingEnd="?attr/browsePaddingEnd"
@@ -134,5 +135,5 @@
</RelativeLayout>
- </LinearLayout>
-</android.support.v17.leanback.widget.PlaybackTransportRowView>
+ </android.support.v17.leanback.widget.PlaybackTransportRowView>
+</LinearLayout>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
index fe0e26f..dd0dbed 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
@@ -141,6 +141,7 @@
boolean mViewsCreated;
private int mAlignedTop = ALIGN_TOP_NOT_SET;
boolean mAfterEntranceTransition = true;
+ boolean mFreezeRows;
BaseOnItemViewSelectedListener mOnItemViewSelectedListener;
BaseOnItemViewClickedListener mOnItemViewClickedListener;
@@ -367,6 +368,10 @@
RowPresenter rowPresenter = (RowPresenter) vh.getPresenter();
RowPresenter.ViewHolder rowVh = rowPresenter.getRowViewHolder(vh.getViewHolder());
rowPresenter.setEntranceTransitionState(rowVh, mAfterEntranceTransition);
+
+ // freeze the rows attached after RowsFragment#freezeRows() is called
+ rowPresenter.freeze(rowVh, mFreezeRows);
+
if (mExternalAdapterListener != null) {
mExternalAdapterListener.onAttachedToWindow(vh);
}
@@ -450,6 +455,7 @@
}
private void freezeRows(boolean freeze) {
+ mFreezeRows = freeze;
VerticalGridView verticalView = getVerticalGridView();
if (verticalView != null) {
final int count = verticalView.getChildCount();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
index 9f55aa2..c00f78b 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
@@ -144,6 +144,7 @@
boolean mViewsCreated;
private int mAlignedTop = ALIGN_TOP_NOT_SET;
boolean mAfterEntranceTransition = true;
+ boolean mFreezeRows;
BaseOnItemViewSelectedListener mOnItemViewSelectedListener;
BaseOnItemViewClickedListener mOnItemViewClickedListener;
@@ -370,6 +371,10 @@
RowPresenter rowPresenter = (RowPresenter) vh.getPresenter();
RowPresenter.ViewHolder rowVh = rowPresenter.getRowViewHolder(vh.getViewHolder());
rowPresenter.setEntranceTransitionState(rowVh, mAfterEntranceTransition);
+
+ // freeze the rows attached after RowsSupportFragment#freezeRows() is called
+ rowPresenter.freeze(rowVh, mFreezeRows);
+
if (mExternalAdapterListener != null) {
mExternalAdapterListener.onAttachedToWindow(vh);
}
@@ -453,6 +458,7 @@
}
private void freezeRows(boolean freeze) {
+ mFreezeRows = freeze;
VerticalGridView verticalView = getVerticalGridView();
if (verticalView != null) {
final int count = verticalView.getChildCount();
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
index 50f0da3..0d86cfd 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
@@ -177,6 +177,9 @@
mViewHolder.mActionsRow.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
mViewHolder.mActionsRow.setVisibility(View.VISIBLE);
mViewHolder.mActionsRow.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
+ // switch focusability to VISIBLE wont trigger focusableViewAvailable() on O because
+ // shared element details_frame is still INVISIBLE. b/63544781
+ mViewHolder.mActionsRow.requestFocus();
mViewHolder.mDetailsDescriptionFrame.setVisibility(View.VISIBLE);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
index ca70eda..e888f6d 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
@@ -829,6 +829,7 @@
public void freeze(RowPresenter.ViewHolder holder, boolean freeze) {
ViewHolder vh = (ViewHolder) holder;
vh.mGridView.setScrollEnabled(!freeze);
+ vh.mGridView.setAnimateChildLayout(!freeze);
}
@Override
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackTransportRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackTransportRowPresenter.java
index e6db33b..4505944 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackTransportRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackTransportRowPresenter.java
@@ -666,8 +666,8 @@
vh.mSecondaryControlsVh = (ControlBarPresenter.ViewHolder) mSecondaryControlsPresenter
.onCreateViewHolder(vh.mSecondaryControlsDock);
vh.mSecondaryControlsDock.addView(vh.mSecondaryControlsVh.view);
- ((PlaybackTransportRowView) vh.view).setOnUnhandledKeyListener(
- new PlaybackTransportRowView.OnUnhandledKeyListener() {
+ ((PlaybackTransportRowView) vh.view.findViewById(R.id.transport_row))
+ .setOnUnhandledKeyListener(new PlaybackTransportRowView.OnUnhandledKeyListener() {
@Override
public boolean onUnhandledKey(KeyEvent event) {
if (vh.getOnKeyListener() != null) {
diff --git a/v17/leanback/tests/AndroidManifest.xml b/v17/leanback/tests/AndroidManifest.xml
index d719485..b21246e 100644
--- a/v17/leanback/tests/AndroidManifest.xml
+++ b/v17/leanback/tests/AndroidManifest.xml
@@ -18,7 +18,6 @@
<uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
<application
- android:name="android.support.multidex.MultiDexApplication"
android:supportsRtl="true">
<activity android:name="android.support.v17.leanback.widget.GridActivity"
android:exported="true"/>
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 f5f7bdf..b902678 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
@@ -21,15 +21,19 @@
import static org.junit.Assert.assertTrue;
import android.graphics.Rect;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
+import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;
+import android.support.v17.leanback.R;
import android.support.v17.leanback.testutils.PollingCheck;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.HorizontalGridView;
import android.support.v17.leanback.widget.ItemBridgeAdapter;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
@@ -38,6 +42,7 @@
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SinglePresenterSelector;
import android.support.v17.leanback.widget.VerticalGridView;
import android.view.KeyEvent;
import android.view.View;
@@ -46,6 +51,7 @@
import org.junit.runner.RunWith;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
@MediumTest
@RunWith(AndroidJUnit4.class)
@@ -331,4 +337,128 @@
);
}
+ static class StableIdAdapter extends ObjectAdapter {
+ ArrayList<Integer> mList = new ArrayList();
+
+ @Override
+ public long getId(int position) {
+ return mList.get(position).longValue();
+ }
+
+ @Override
+ public Object get(int position) {
+ return mList.get(position);
+ }
+
+ @Override
+ public int size() {
+ return mList.size();
+ }
+ }
+
+ public static class F_rowNotifyItemRangeChange extends BrowseFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ListRowPresenter lrp = new ListRowPresenter();
+ final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
+ for (int i = 0; i < 2; i++) {
+ StableIdAdapter listRowAdapter = new StableIdAdapter();
+ listRowAdapter.setHasStableIds(true);
+ listRowAdapter.setPresenterSelector(
+ new SinglePresenterSelector(sCardPresenter));
+ int index = 0;
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ HeaderItem header = new HeaderItem(i, "Row " + i);
+ adapter.add(new ListRow(header, listRowAdapter));
+ }
+ setAdapter(adapter);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ StableIdAdapter rowAdapter = (StableIdAdapter)
+ ((ListRow) adapter.get(1)).getAdapter();
+ rowAdapter.notifyItemRangeChanged(0, 3);
+ }
+ }, 500);
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+ @Test
+ public void rowNotifyItemRangeChange() throws InterruptedException {
+ SingleFragmentTestActivity activity = launchAndWaitActivity(
+ RowsFragmentTest.F_rowNotifyItemRangeChange.class, 2000);
+
+ VerticalGridView verticalGridView = ((BrowseFragment) activity.getTestFragment())
+ .getRowsFragment().getVerticalGridView();
+ for (int i = 0; i < verticalGridView.getChildCount(); i++) {
+ HorizontalGridView horizontalGridView = verticalGridView.getChildAt(i)
+ .findViewById(R.id.row_content);
+ for (int j = 0; j < horizontalGridView.getChildCount(); j++) {
+ assertEquals(horizontalGridView.getPaddingTop(),
+ horizontalGridView.getChildAt(j).getTop());
+ }
+ }
+ }
+
+ public static class F_rowNotifyItemRangeChangeWithTransition extends BrowseFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ListRowPresenter lrp = new ListRowPresenter();
+ prepareEntranceTransition();
+ final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
+ for (int i = 0; i < 2; i++) {
+ StableIdAdapter listRowAdapter = new StableIdAdapter();
+ listRowAdapter.setHasStableIds(true);
+ listRowAdapter.setPresenterSelector(
+ new SinglePresenterSelector(sCardPresenter));
+ int index = 0;
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ HeaderItem header = new HeaderItem(i, "Row " + i);
+ adapter.add(new ListRow(header, listRowAdapter));
+ }
+ setAdapter(adapter);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ StableIdAdapter rowAdapter = (StableIdAdapter)
+ ((ListRow) adapter.get(1)).getAdapter();
+ rowAdapter.notifyItemRangeChanged(0, 3);
+ }
+ }, 500);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ startEntranceTransition();
+ }
+ }, 520);
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+ @Test
+ public void rowNotifyItemRangeChangeWithTransition() throws InterruptedException {
+ SingleFragmentTestActivity activity = launchAndWaitActivity(
+ RowsFragmentTest.F_rowNotifyItemRangeChangeWithTransition.class, 3000);
+
+ VerticalGridView verticalGridView = ((BrowseFragment) activity.getTestFragment())
+ .getRowsFragment().getVerticalGridView();
+ for (int i = 0; i < verticalGridView.getChildCount(); i++) {
+ HorizontalGridView horizontalGridView = verticalGridView.getChildAt(i)
+ .findViewById(R.id.row_content);
+ for (int j = 0; j < horizontalGridView.getChildCount(); j++) {
+ assertEquals(horizontalGridView.getPaddingTop(),
+ horizontalGridView.getChildAt(j).getTop());
+ assertEquals(0, horizontalGridView.getChildAt(j).getTranslationY(), 0.1f);
+ }
+ }
+ }
}
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 7d40644..a46730d 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
@@ -24,15 +24,19 @@
import static org.junit.Assert.assertTrue;
import android.graphics.Rect;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
+import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;
+import android.support.v17.leanback.R;
import android.support.v17.leanback.testutils.PollingCheck;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.HorizontalGridView;
import android.support.v17.leanback.widget.ItemBridgeAdapter;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
@@ -41,6 +45,7 @@
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SinglePresenterSelector;
import android.support.v17.leanback.widget.VerticalGridView;
import android.view.KeyEvent;
import android.view.View;
@@ -49,6 +54,7 @@
import org.junit.runner.RunWith;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
@MediumTest
@RunWith(AndroidJUnit4.class)
@@ -334,4 +340,128 @@
);
}
+ static class StableIdAdapter extends ObjectAdapter {
+ ArrayList<Integer> mList = new ArrayList();
+
+ @Override
+ public long getId(int position) {
+ return mList.get(position).longValue();
+ }
+
+ @Override
+ public Object get(int position) {
+ return mList.get(position);
+ }
+
+ @Override
+ public int size() {
+ return mList.size();
+ }
+ }
+
+ public static class F_rowNotifyItemRangeChange extends BrowseSupportFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ListRowPresenter lrp = new ListRowPresenter();
+ final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
+ for (int i = 0; i < 2; i++) {
+ StableIdAdapter listRowAdapter = new StableIdAdapter();
+ listRowAdapter.setHasStableIds(true);
+ listRowAdapter.setPresenterSelector(
+ new SinglePresenterSelector(sCardPresenter));
+ int index = 0;
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ HeaderItem header = new HeaderItem(i, "Row " + i);
+ adapter.add(new ListRow(header, listRowAdapter));
+ }
+ setAdapter(adapter);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ StableIdAdapter rowAdapter = (StableIdAdapter)
+ ((ListRow) adapter.get(1)).getAdapter();
+ rowAdapter.notifyItemRangeChanged(0, 3);
+ }
+ }, 500);
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+ @Test
+ public void rowNotifyItemRangeChange() throws InterruptedException {
+ SingleSupportFragmentTestActivity activity = launchAndWaitActivity(
+ RowsSupportFragmentTest.F_rowNotifyItemRangeChange.class, 2000);
+
+ VerticalGridView verticalGridView = ((BrowseSupportFragment) activity.getTestFragment())
+ .getRowsSupportFragment().getVerticalGridView();
+ for (int i = 0; i < verticalGridView.getChildCount(); i++) {
+ HorizontalGridView horizontalGridView = verticalGridView.getChildAt(i)
+ .findViewById(R.id.row_content);
+ for (int j = 0; j < horizontalGridView.getChildCount(); j++) {
+ assertEquals(horizontalGridView.getPaddingTop(),
+ horizontalGridView.getChildAt(j).getTop());
+ }
+ }
+ }
+
+ public static class F_rowNotifyItemRangeChangeWithTransition extends BrowseSupportFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ListRowPresenter lrp = new ListRowPresenter();
+ prepareEntranceTransition();
+ final ArrayObjectAdapter adapter = new ArrayObjectAdapter(lrp);
+ for (int i = 0; i < 2; i++) {
+ StableIdAdapter listRowAdapter = new StableIdAdapter();
+ listRowAdapter.setHasStableIds(true);
+ listRowAdapter.setPresenterSelector(
+ new SinglePresenterSelector(sCardPresenter));
+ int index = 0;
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ listRowAdapter.mList.add(index++);
+ HeaderItem header = new HeaderItem(i, "Row " + i);
+ adapter.add(new ListRow(header, listRowAdapter));
+ }
+ setAdapter(adapter);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ StableIdAdapter rowAdapter = (StableIdAdapter)
+ ((ListRow) adapter.get(1)).getAdapter();
+ rowAdapter.notifyItemRangeChanged(0, 3);
+ }
+ }, 500);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ startEntranceTransition();
+ }
+ }, 520);
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+ @Test
+ public void rowNotifyItemRangeChangeWithTransition() throws InterruptedException {
+ SingleSupportFragmentTestActivity activity = launchAndWaitActivity(
+ RowsSupportFragmentTest.F_rowNotifyItemRangeChangeWithTransition.class, 3000);
+
+ VerticalGridView verticalGridView = ((BrowseSupportFragment) activity.getTestFragment())
+ .getRowsSupportFragment().getVerticalGridView();
+ for (int i = 0; i < verticalGridView.getChildCount(); i++) {
+ HorizontalGridView horizontalGridView = verticalGridView.getChildAt(i)
+ .findViewById(R.id.row_content);
+ for (int j = 0; j < horizontalGridView.getChildCount(); j++) {
+ assertEquals(horizontalGridView.getPaddingTop(),
+ horizontalGridView.getChildAt(j).getTop());
+ assertEquals(0, horizontalGridView.getChildAt(j).getTranslationY(), 0.1f);
+ }
+ }
+ }
}
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 86fb4eb..1f6bdb2 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
@@ -3137,7 +3137,6 @@
}
-
@Test
public void testZeroFixedSecondarySize() throws Throwable {
Intent intent = new Intent();
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
index d6a1f86..2cee649 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
@@ -56,12 +56,13 @@
if (mViewHolder == null && mPlaybackRowPresenter != null && mRow != null) {
mViewHolder = (PlaybackRowPresenter.ViewHolder)
mPlaybackRowPresenter.onCreateViewHolder(mRootView = new FrameLayout(mContext));
+ // Bind ViewHolder before measure/layout so child views will get proper size
+ mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow);
mRootView.addView(mViewHolder.view, mLayoutWidth, mLayoutHeight);
mRootView.measure(
View.MeasureSpec.makeMeasureSpec(1920, View.MeasureSpec.AT_MOST),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
mRootView.layout(0, 0, mRootView.getMeasuredWidth(), mRootView.getMeasuredHeight());
- mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow);
if (mViewHolder instanceof PlaybackSeekUi) {
((PlaybackSeekUi) mViewHolder).setPlaybackSeekUiClient(mChainedClient);
}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
index 54d27a3..db55725 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
@@ -37,6 +37,8 @@
import android.support.v17.leanback.widget.PlaybackSeekDataProvider.ResultCallback;
import android.view.ContextThemeWrapper;
import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewParent;
import org.junit.Before;
import org.junit.Test;
@@ -65,7 +67,24 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- mGlue = new PlaybackTransportControlGlue(mContext, mImpl);
+ mGlue = new PlaybackTransportControlGlue(mContext, mImpl) {
+ @Override
+ protected void onCreatePrimaryActions(ArrayObjectAdapter
+ primaryActionsAdapter) {
+ super.onCreatePrimaryActions(primaryActionsAdapter);
+ primaryActionsAdapter.add(
+ new PlaybackControlsRow.ClosedCaptioningAction(mContext));
+ }
+
+ @Override
+ protected void onCreateSecondaryActions(ArrayObjectAdapter
+ secondaryActionsAdapter) {
+ secondaryActionsAdapter.add(
+ new PlaybackControlsRow.HighQualityAction(mContext));
+ secondaryActionsAdapter.add(
+ new PlaybackControlsRow.PictureInPictureAction(mContext));
+ }
+ };
mGlue.setHost(mHost);
}
@@ -195,6 +214,107 @@
assertSame(art, mViewHolder.mImageView.getDrawable());
}
+ static boolean isDescendant(View view, View descendant) {
+ while (descendant != view) {
+ ViewParent p = descendant.getParent();
+ if (!(p instanceof View)) {
+ return false;
+ }
+ descendant = (View) p;
+ }
+ return true;
+ }
+
+ @Test
+ public void navigateRightInPrimary() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mControlsVh.mControlBar.getChildAt(0).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mControlsVh.mControlBar.getChildAt(0), view));
+ assertTrue(isDescendant(mViewHolder.mControlsVh.mControlBar.getChildAt(1),
+ view.focusSearch(View.FOCUS_RIGHT)));
+ }
+
+ @Test
+ public void navigateRightInSecondary() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(0).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(0), view));
+ assertTrue(isDescendant(mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(1),
+ view.focusSearch(View.FOCUS_RIGHT)));
+ }
+
+ @Test
+ public void navigatePrimaryDownToProgress() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mControlsVh.mControlBar.getChildAt(0).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mControlsVh.mControlBar.getChildAt(0), view));
+ assertSame(mViewHolder.mProgressBar, view.focusSearch(View.FOCUS_DOWN));
+ }
+
+ @Test
+ public void navigateProgressUpToPrimary() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mProgressBar.requestFocus();
+ }
+ });
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mProgressBar.focusSearch(View.FOCUS_UP).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mControlsVh.mControlBar.getChildAt(0), view));
+ }
+
+ @Test
+ public void navigateProgressDownToSecondary() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mProgressBar.requestFocus();
+ }
+ });
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mProgressBar.focusSearch(View.FOCUS_DOWN).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(0), view));
+ }
+
+ @Test
+ public void navigateSecondaryUpToProgress() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(0).requestFocus();
+ }
+ });
+ View view = mViewHolder.view.findFocus();
+ assertTrue(isDescendant(mViewHolder.mSecondaryControlsVh.mControlBar.getChildAt(0), view));
+ assertSame(mViewHolder.mProgressBar, view.focusSearch(View.FOCUS_UP));
+ }
+
@Test
public void seekAndConfirm() {
when(mImpl.isPrepared()).thenReturn(true);
diff --git a/v17/preference-leanback/build.gradle b/v17/preference-leanback/build.gradle
index 8de4c00..23672e3 100644
--- a/v17/preference-leanback/build.gradle
+++ b/v17/preference-leanback/build.gradle
@@ -2,12 +2,12 @@
archivesBaseName = 'preference-leanback-v17'
dependencies {
- compile project(':support-v4')
- compile project(':support-appcompat-v7')
- compile project(':support-recyclerview-v7')
- compile project(':support-preference-v7')
- compile project(':support-preference-v14')
- compile project(':support-leanback-v17')
+ api project(':support-v4')
+ api project(':support-appcompat-v7')
+ api project(':support-recyclerview-v7')
+ api project(':support-preference-v7')
+ api project(':support-preference-v14')
+ api project(':support-leanback-v17')
}
android {
diff --git a/v17/preference-leanback/lint-baseline.xml b/v17/preference-leanback/lint-baseline.xml
index 923181b..22aaf9d 100644
--- a/v17/preference-leanback/lint-baseline.xml
+++ b/v17/preference-leanback/lint-baseline.xml
@@ -1,152 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type string"
- errorLine1=" ? Float.parseFloat(res.getString(R.dimen.lb_browse_header_select_scale))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/FocusHighlightHelper.java"
- line="276"
- column="58"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type string"
- errorLine1=" Integer.parseInt(res.getString(R.dimen.lb_browse_header_select_duration));"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/FocusHighlightHelper.java"
- line="279"
- column="56"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim or interpolator"
- errorLine1=" R.animator.lb_decelerator_4));"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="kitkat/android/support/v17/leanback/transition/LeanbackTransitionHelperKitKat.java"
- line="38"
- column="17"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="Suspicious0dp"
@@ -192,793 +45,4 @@
column="16"/>
</issue>
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/preference_dropdown.xml"
- line="29"
- column="9"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout-v11/preference_dropdown.xml"
- line="30"
- column="9"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout-v17/preference_dropdown_material.xml"
- line="32"
- column="9"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout-v21/preference_dropdown_material.xml"
- line="32"
- column="9"/>
- </issue>
-
- <issue
- id="Suspicious0dp"
- message="Suspicious size: this will make the view invisible, should be used with `layout_weight`"
- errorLine1=" android:layout_width="0dp""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/preference_dropdown_material.xml"
- line="32"
- column="9"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 27 (DetailsOverviewRowPresenter)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onLayoutChange " + v);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/widget/DetailsOverviewRowPresenter.java"
- line="178"
- column="34"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 27 (DetailsOverviewRowPresenter)"
- errorLine1=" Log.v(TAG, "checkFirstAndLast fromScroll " + fromScroll"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/widget/DetailsOverviewRowPresenter.java"
- line="237"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 36 (FullWidthDetailsOverviewRowPresenter)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onLayoutChange " + v);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java"
- line="236"
- column="34"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 36 (FullWidthDetailsOverviewRowPresenter)"
- errorLine1=" Log.v(TAG, "checkFirstAndLast fromScroll " + fromScroll"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java"
- line="295"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" Log.w(TAG, "Fragment is already exists, likely calling ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="642"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onCreate");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="1000"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onCreateView");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="1039"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "Found guided step theme flag? " + found);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="1239"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="1352"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (GuidedStepSupportFragment)"
- errorLine1=" Log.e(TAG, "GuidedStepSupportFragment does not have an appropriate theme set.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/GuidedStepSupportFragment.java"
- line="1364"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 25 (OnboardingSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "Found onboarding theme reference? " + found);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/OnboardingSupportFragment.java"
- line="552"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="148"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="236"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed());"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="313"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onInterceptInputEvent hidden " + controlsHidden + " " + event);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="363"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "fraction " + fraction);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="481"
- column="38"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "fade " + fadeIn);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="577"
- column="26"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "requested fade in progress");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="582"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "fade is no-op");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="586"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="770"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "setting alpha to 0");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="772"
- column="34"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (PlaybackOverlaySupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java"
- line="781"
- column="30"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 27 (VerticalGridSupportFragment)"
- errorLine1=" if (DEBUG) Log.v(TAG, "grid selected position " + position);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v17/leanback/app/VerticalGridSupportFragment.java"
- line="120"
- column="30"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CheckableImageView extends ImageView implements Checkable {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/CheckableImageView.java"
- line="24"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class GuidedActionEditText extends EditText implements ImeKeyMonitor {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/GuidedActionEditText.java"
- line="31"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class PreferenceImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/internal/widget/PreferenceImageView.java"
- line="33"
- column="42"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="class ResizingTextView extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/ResizingTextView.java"
- line="28"
- column="32"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public final class RowHeaderView extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/RowHeaderView.java"
- line="24"
- column="42"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="class StreamingTextView extends EditText {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/StreamingTextView.java"
- line="43"
- column="33"/>
- </issue>
-
- <issue
- id="Orientation"
- message="No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically."
- errorLine1=" <LinearLayout"
- errorLine2=" ^">
- <location
- file="res/layout/lb_row_media_item.xml"
- line="63"
- column="13"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: ViewCompat.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_RTL"
- errorLine1=" boolean isRtl = ViewCompat.getLayoutDirection(focused) == View.LAYOUT_DIRECTION_RTL;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/app/BrowseFragment.java"
- line="1029"
- column="71"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: ViewCompat.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_RTL"
- errorLine1=" boolean isRtl = ViewCompat.getLayoutDirection(focused) == View.LAYOUT_DIRECTION_RTL;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/app/BrowseSupportFragment.java"
- line="1032"
- column="71"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: View.VISIBLE, View.INVISIBLE, View.GONE"
- errorLine1=" v.setVisibility(mChildVisibility);"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/GridLayoutManager.java"
- line="1566"
- column="37"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: View.VISIBLE, View.INVISIBLE, View.GONE"
- errorLine1=" getChildAt(i).setVisibility(mChildVisibility);"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/GridLayoutManager.java"
- line="3476"
- column="45"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: ViewCompat.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_RTL"
- errorLine1=" boolean isRtl = ViewCompat.getLayoutDirection(view) == View.LAYOUT_DIRECTION_RTL;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/HorizontalHoverCardSwitcher.java"
- line="50"
- column="64"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: ViewCompat.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_RTL"
- errorLine1=" == View.LAYOUT_DIRECTION_RTL;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v17/leanback/widget/TitleHelper.java"
- line="49"
- column="24"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="RtlCompat"
- message="Inconsistent alignment specification between `textAlignment` and `gravity` attributes: was `center_vertical`, expected `start`"
- errorLine1=" android:textAlignment="viewStart" />"
- errorLine2=" ~~~~~~~~~">
- <location
- file="res/layout/abc_popup_menu_header_item_layout.xml"
- line="33"
- column="36"/>
- <location
- file="res/layout/abc_popup_menu_header_item_layout.xml"
- line="29"
- column="37"/>
- </issue>
-
- <issue
- id="RtlCompat"
- message="Inconsistent alignment specification between `textAlignment` and `gravity` attributes: was `center_vertical|end`, expected `start`"
- errorLine1=" android:textAlignment="viewStart""
- errorLine2=" ~~~~~~~~~">
- <location
- file="res/layout/lb_search_bar.xml"
- line="70"
- column="44"/>
- <location
- file="res/layout/lb_search_bar.xml"
- line="57"
- column="45"/>
- </issue>
-
</issues>
diff --git a/v4/build.gradle b/v4/build.gradle
index 87bc171..d363eba 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -2,11 +2,11 @@
archivesBaseName = 'support-v4'
dependencies {
- compile project(':support-compat')
- compile project(':support-media-compat')
- compile project(':support-core-utils')
- compile project(':support-core-ui')
- compile project(':support-fragment')
+ api project(':support-compat')
+ api project(':support-media-compat')
+ api project(':support-core-utils')
+ api project(':support-core-ui')
+ api project(':support-fragment')
}
android {
diff --git a/v4/lint-baseline.xml b/v4/lint-baseline.xml
index 4d3d334..e961253 100644
--- a/v4/lint-baseline.xml
+++ b/v4/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index f604aa3..20d9393 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -2,20 +2,20 @@
archivesBaseName = 'appcompat-v7'
dependencies {
- compile project(':support-annotations')
- compile project(':support-v4')
- compile project(':support-vector-drawable')
- compile project(':support-animated-vector-drawable')
+ api project(':support-annotations')
+ api project(':support-v4')
+ api project(':support-vector-drawable')
+ api project(':support-animated-vector-drawable')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
}
android {
diff --git a/v7/appcompat/lint-baseline.xml b/v7/appcompat/lint-baseline.xml
index f0d1d20..f1b0c14 100644
--- a/v7/appcompat/lint-baseline.xml
+++ b/v7/appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="MissingPermission"
@@ -14,28 +14,6 @@
<issue
id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
message="Overriding method should call `super.draw`"
errorLine1=" public void draw(Canvas canvas) {"
errorLine2=" ~~~~">
@@ -62,17 +40,6 @@
<issue
id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
message="Expected resource of type xml"
errorLine1=" final XmlPullParser parser = res.getXml(resId);"
errorLine2=" ~~~~~">
@@ -227,13 +194,68 @@
<issue
id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
+ file="src/android/support/v7/widget/AppCompatButton.java"
+ line="274"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/android/support/v7/widget/AppCompatButton.java"
+ line="275"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/android/support/v7/widget/AppCompatButton.java"
+ line="281"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/android/support/v7/widget/AppCompatTextView.java"
+ line="280"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/android/support/v7/widget/AppCompatTextView.java"
+ line="281"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
+ errorLine1=" return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/android/support/v7/widget/AppCompatTextView.java"
+ line="287"
+ column="16"/>
</issue>
<issue
diff --git a/v7/appcompat/res/drawable-v21/notification_action_background.xml b/v7/appcompat/res/drawable-v21/notification_action_background.xml
deleted file mode 100644
index 852c3f0..0000000
--- a/v7/appcompat/res/drawable-v21/notification_action_background.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/ripple_material_light">
- <item android:id="@android:id/mask"
- android:drawable="@drawable/abc_btn_default_mtrl_shape" />
-</ripple>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v11/notification_media_action.xml b/v7/appcompat/res/layout-v11/notification_media_action.xml
deleted file mode 100644
index d546792..0000000
--- a/v7/appcompat/res/layout-v11/notification_media_action.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
- style="?android:attr/borderlessButtonStyle"
- android:id="@+id/action0"
- android:layout_width="48dp"
- android:layout_height="match_parent"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_weight="1"
- android:gravity="center"/>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v11/notification_media_cancel_action.xml b/v7/appcompat/res/layout-v11/notification_media_cancel_action.xml
deleted file mode 100644
index c2bd8c2..0000000
--- a/v7/appcompat/res/layout-v11/notification_media_cancel_action.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- style="?android:attr/borderlessButtonStyle"
- android:id="@+id/cancel_action"
- android:layout_width="48dp"
- android:layout_height="match_parent"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_weight="1"
- android:src="@android:drawable/ic_menu_close_clear_cancel"
- android:gravity="center"
- android:visibility="gone"/>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v11/notification_template_big_media.xml b/v7/appcompat/res/layout-v11/notification_template_big_media.xml
deleted file mode 100644
index b72fd97..0000000
--- a/v7/appcompat/res/layout-v11/notification_template_big_media.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="128dp"
- >
- <include layout="@layout/notification_template_icon_group"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- />
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true" />
- <include layout="@layout/notification_template_lines_media"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="fill_vertical"
- android:layout_marginLeft="@dimen/notification_large_icon_width"
- android:layout_marginStart="@dimen/notification_large_icon_width"
- android:layout_toLeftOf="@id/cancel_action"
- android:layout_toStartOf="@id/cancel_action"/>
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:layout_alignParentBottom="true"
- android:layout_marginLeft="12dp"
- android:layout_marginRight="12dp"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:layout_above="@id/media_actions"
- android:id="@+id/action_divider"
- android:background="?android:attr/dividerHorizontal" />
-</RelativeLayout>
diff --git a/v7/appcompat/res/layout-v11/notification_template_big_media_custom.xml b/v7/appcompat/res/layout-v11/notification_template_big_media_custom.xml
deleted file mode 100644
index c88d799..0000000
--- a/v7/appcompat/res/layout-v11/notification_template_big_media_custom.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="128dp"
- >
- <include layout="@layout/notification_template_icon_group"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- />
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"/>
- <LinearLayout
- android:id="@+id/notification_main_column_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/notification_large_icon_height"
- android:layout_marginStart="@dimen/notification_large_icon_height"
- android:minHeight="@dimen/notification_large_icon_height"
- android:paddingTop="@dimen/notification_main_column_padding_top"
- android:orientation="horizontal"
- android:layout_toLeftOf="@id/cancel_action"
- android:layout_toStartOf="@id/cancel_action">
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"
- />
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:paddingTop="@dimen/notification_right_side_padding_top">
- <DateTimeView android:id="@+id/time"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <Chronometer android:id="@+id/chronometer"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_gravity="end|bottom"
- android:singleLine="true"
- />
- </FrameLayout>
- </LinearLayout>
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:layout_alignParentBottom="true"
- android:layout_marginLeft="12dp"
- android:layout_marginRight="12dp"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:layout_above="@id/media_actions"
- android:id="@+id/action_divider"
- android:background="?android:attr/dividerHorizontal" />
-</RelativeLayout>
diff --git a/v7/appcompat/res/layout-v11/notification_template_big_media_narrow.xml b/v7/appcompat/res/layout-v11/notification_template_big_media_narrow.xml
deleted file mode 100644
index 979c8f4..0000000
--- a/v7/appcompat/res/layout-v11/notification_template_big_media_narrow.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<!-- Layout to be used with only max 3 actions. It has a much larger picture at the left side-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="128dp"
- >
- <ImageView android:id="@+id/icon"
- android:layout_width="128dp"
- android:layout_height="128dp"
- android:scaleType="centerCrop"
- />
-
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"/>
-
- <include layout="@layout/notification_template_lines_media"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="128dp"
- android:layout_marginStart="128dp"
- android:layout_toLeftOf="@id/cancel_action"
- android:layout_toStartOf="@id/cancel_action"/>
-
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:layout_toRightOf="@id/icon"
- android:layout_toEndOf="@id/icon"
- android:layout_alignParentBottom="true"
- android:layout_marginLeft="12dp"
- android:layout_marginRight="12dp"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:layout_toRightOf="@id/icon"
- android:layout_toEndOf="@id/icon"
- android:layout_above="@id/media_actions"
- android:id="@+id/action_divider"
- android:background="?android:attr/dividerHorizontal" />
-</RelativeLayout>
diff --git a/v7/appcompat/res/layout-v11/notification_template_big_media_narrow_custom.xml b/v7/appcompat/res/layout-v11/notification_template_big_media_narrow_custom.xml
deleted file mode 100644
index b7fbff7..0000000
--- a/v7/appcompat/res/layout-v11/notification_template_big_media_narrow_custom.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<!-- Layout to be used with only max 3 actions. It has a much larger picture at the left side-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="128dp"
- >
- <ImageView android:id="@+id/icon"
- android:layout_width="128dp"
- android:layout_height="128dp"
- android:scaleType="centerCrop"
- />
-
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"/>
-
- <LinearLayout
- android:id="@+id/notification_main_column_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="128dp"
- android:layout_marginStart="128dp"
- android:minHeight="@dimen/notification_large_icon_height"
- android:paddingTop="@dimen/notification_main_column_padding_top"
- android:orientation="horizontal"
- android:layout_toLeftOf="@id/cancel_action"
- android:layout_toStartOf="@id/cancel_action">
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/notification_media_narrow_margin"
- android:layout_marginStart="@dimen/notification_media_narrow_margin"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"/>
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:paddingTop="@dimen/notification_right_side_padding_top">
- <DateTimeView android:id="@+id/time"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <Chronometer android:id="@+id/chronometer"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_gravity="end|bottom"
- android:singleLine="true"
- />
- </FrameLayout>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:layout_toRightOf="@id/icon"
- android:layout_toEndOf="@id/icon"
- android:layout_alignParentBottom="true"
- android:layout_marginLeft="12dp"
- android:layout_marginRight="12dp"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:layout_toRightOf="@id/icon"
- android:layout_toEndOf="@id/icon"
- android:layout_above="@id/media_actions"
- android:id="@+id/action_divider"
- android:background="?android:attr/dividerHorizontal" />
-</RelativeLayout>
diff --git a/v7/appcompat/res/layout-v16/notification_template_custom_big.xml b/v7/appcompat/res/layout-v16/notification_template_custom_big.xml
deleted file mode 100644
index 24c3323..0000000
--- a/v7/appcompat/res/layout-v16/notification_template_custom_big.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/notification_background"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- <ImageView android:id="@+id/icon"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- android:scaleType="center"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/notification_main_column_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/notification_large_icon_width"
- android:layout_marginStart="@dimen/notification_large_icon_width"
- android:paddingTop="@dimen/notification_main_column_padding_top"
- android:minHeight="@dimen/notification_large_icon_height"
- android:orientation="horizontal">
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:layout_marginBottom="8dp"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp" />
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:paddingTop="@dimen/notification_right_side_padding_top">
- <ViewStub android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end|top"
- android:visibility="gone"
- android:layout="@layout/notification_template_part_time" />
- <ViewStub android:id="@+id/chronometer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end|top"
- android:visibility="gone"
- android:layout="@layout/notification_template_part_chronometer" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_gravity="end|bottom"
- android:layout_marginTop="20dp">
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- />
- <ImageView android:id="@+id/right_icon"
- android:layout_width="16dp"
- android:layout_height="16dp"
- android:layout_gravity="center"
- android:layout_marginLeft="8dp"
- android:layout_marginStart="8dp"
- android:scaleType="centerInside"
- android:visibility="gone"
- android:alpha="0.6"
- />
- </LinearLayout>
- </FrameLayout>
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:id="@+id/action_divider"
- android:visibility="gone"
- android:layout_marginLeft="@dimen/notification_large_icon_width"
- android:layout_marginStart="@dimen/notification_large_icon_width"
- android:background="?android:attr/dividerHorizontal" />
- <LinearLayout
- android:id="@+id/actions"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:visibility="gone"
- android:showDividers="middle"
- android:divider="?android:attr/listDivider"
- android:dividerPadding="12dp"
- android:layout_marginLeft="@dimen/notification_large_icon_width"
- android:layout_marginStart="@dimen/notification_large_icon_width" >
- <!-- actions will be added here -->
- </LinearLayout>
- </LinearLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v21/notification_action.xml b/v7/appcompat/res/layout-v21/notification_action.xml
deleted file mode 100644
index c60bf7d..0000000
--- a/v7/appcompat/res/layout-v21/notification_action.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/Widget.AppCompat.NotificationActionContainer"
- android:id="@+id/action_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="48dp"
- android:paddingStart="4dp"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/action_image"
- android:layout_width="@dimen/notification_action_icon_size"
- android:layout_height="@dimen/notification_action_icon_size"
- android:layout_gravity="center|start"
- android:scaleType="centerInside"/>
- <TextView
- style="@style/Widget.AppCompat.NotificationActionText"
- android:id="@+id/action_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|start"
- android:paddingStart="4dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:clickable="false"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v21/notification_action_tombstone.xml b/v7/appcompat/res/layout-v21/notification_action_tombstone.xml
deleted file mode 100644
index 1637c6f..0000000
--- a/v7/appcompat/res/layout-v21/notification_action_tombstone.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/Widget.AppCompat.NotificationActionContainer"
- android:id="@+id/action_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="48dp"
- android:paddingStart="4dp"
- android:orientation="horizontal"
- android:enabled="false"
- android:background="@null">
- <ImageView
- android:id="@+id/action_image"
- android:layout_width="@dimen/notification_action_icon_size"
- android:layout_height="@dimen/notification_action_icon_size"
- android:layout_gravity="center|start"
- android:scaleType="centerInside"
- android:enabled="false"
- android:alpha="0.5"/>
- <TextView
- style="@style/Widget.AppCompat.NotificationActionText"
- android:id="@+id/action_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|start"
- android:paddingStart="4dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:clickable="false"
- android:enabled="false"
- android:alpha="0.5"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v21/notification_template_custom_big.xml b/v7/appcompat/res/layout-v21/notification_template_custom_big.xml
deleted file mode 100644
index 38332bd..0000000
--- a/v7/appcompat/res/layout-v21/notification_template_custom_big.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/notification_background"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- <include layout="@layout/notification_template_icon_group"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:layout_marginStart="@dimen/notification_large_icon_width"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/notification_main_column_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/notification_large_icon_height"
- android:orientation="horizontal">
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"/>
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="8dp"
- android:paddingTop="@dimen/notification_right_side_padding_top">
- <ViewStub android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end|top"
- android:visibility="gone"
- android:layout="@layout/notification_template_part_time" />
- <ViewStub android:id="@+id/chronometer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end|top"
- android:visibility="gone"
- android:layout="@layout/notification_template_part_chronometer" />
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_gravity="end|bottom"
- android:singleLine="true"
- />
- </FrameLayout>
- </LinearLayout>
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:id="@+id/action_divider"
- android:visibility="gone"
- android:background="#29000000" />
- <LinearLayout
- android:id="@+id/actions"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="-8dp"
- android:orientation="horizontal"
- android:visibility="gone"
- >
- <!-- actions will be added here -->
- </LinearLayout>
- </LinearLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout-v21/notification_template_icon_group.xml b/v7/appcompat/res/layout-v21/notification_template_icon_group.xml
deleted file mode 100644
index 6c19022..0000000
--- a/v7/appcompat/res/layout-v21/notification_template_icon_group.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- android:id="@+id/icon_group"
->
- <ImageView android:id="@+id/icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="@dimen/notification_big_circle_margin"
- android:layout_marginBottom="@dimen/notification_big_circle_margin"
- android:layout_marginStart="@dimen/notification_big_circle_margin"
- android:layout_marginEnd="@dimen/notification_big_circle_margin"
- android:scaleType="centerInside"
- />
- <ImageView android:id="@+id/right_icon"
- android:layout_width="@dimen/notification_right_icon_size"
- android:layout_height="@dimen/notification_right_icon_size"
- android:layout_gravity="end|bottom"
- android:scaleType="centerInside"
- android:visibility="gone"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"
- />
-</FrameLayout>
-
diff --git a/v7/appcompat/res/layout/notification_action.xml b/v7/appcompat/res/layout/notification_action.xml
deleted file mode 100644
index 82e95a5..0000000
--- a/v7/appcompat/res/layout/notification_action.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/Widget.AppCompat.NotificationActionContainer"
- android:id="@+id/action_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="48dp"
- android:paddingLeft="4dp"
- android:paddingStart="4dp"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/action_image"
- android:layout_width="@dimen/notification_action_icon_size"
- android:layout_height="@dimen/notification_action_icon_size"
- android:layout_gravity="center|start"
- android:scaleType="centerInside"/>
- <TextView
- style="@style/Widget.AppCompat.NotificationActionText"
- android:id="@+id/action_text"
- android:textColor="#ccc"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|start"
- android:paddingLeft="4dp"
- android:paddingStart="4dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:clickable="false"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout/notification_action_tombstone.xml b/v7/appcompat/res/layout/notification_action_tombstone.xml
deleted file mode 100644
index d491c78..0000000
--- a/v7/appcompat/res/layout/notification_action_tombstone.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/Widget.AppCompat.NotificationActionContainer"
- android:id="@+id/action_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="48dp"
- android:paddingLeft="4dp"
- android:paddingStart="4dp"
- android:orientation="horizontal"
- android:enabled="false"
- android:background="@null">
- <ImageView
- android:id="@+id/action_image"
- android:layout_width="@dimen/notification_action_icon_size"
- android:layout_height="@dimen/notification_action_icon_size"
- android:layout_gravity="center|start"
- android:scaleType="centerInside"
- android:enabled="false"
- android:alpha="0.5"/>
- <TextView
- style="@style/Widget.AppCompat.NotificationActionText"
- android:id="@+id/action_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|start"
- android:textColor="#ccc"
- android:paddingLeft="4dp"
- android:paddingStart="4dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:clickable="false"
- android:enabled="false"
- android:alpha="0.5"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout/notification_template_custom_big.xml b/v7/appcompat/res/layout/notification_template_custom_big.xml
deleted file mode 100644
index c922629..0000000
--- a/v7/appcompat/res/layout/notification_template_custom_big.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout android:id="@+id/notification_main_column_container"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/notification_large_icon_height"
- android:orientation="horizontal"
- android:paddingRight="12dp"
- android:paddingEnd="12dp">
- <ImageView android:id="@+id/icon"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- android:background="@drawable/notification_tile_bg"
- android:scaleType="center"
- />
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="12dp"
- android:paddingStart="12dp"
- android:paddingTop="@dimen/notification_main_column_padding_top"
- android:layout_weight="1"/>
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingTop="12dp"
- android:paddingLeft="12dp">
- <include
- layout="@layout/notification_template_part_time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end|top"
- android:visibility="gone"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="end|bottom"
- android:layout_marginTop="18dp"
- android:orientation="horizontal">
- <TextView android:id="@+id/info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info"
- />
- <ImageView android:id="@+id/right_icon"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_gravity="center"
- android:layout_marginLeft="8dp"
- android:alpha="0.7"
- android:scaleType="center"
- android:visibility="gone"
- />
- </LinearLayout>
- </FrameLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout/notification_template_icon_group.xml b/v7/appcompat/res/layout/notification_template_icon_group.xml
deleted file mode 100644
index dd564f8..0000000
--- a/v7/appcompat/res/layout/notification_template_icon_group.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<ImageView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/icon"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- android:scaleType="centerCrop"
-/>
-
diff --git a/v7/appcompat/res/layout/notification_template_lines_media.xml b/v7/appcompat/res/layout/notification_template_lines_media.xml
deleted file mode 100644
index 9a7b788..0000000
--- a/v7/appcompat/res/layout/notification_template_lines_media.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingRight="8dp"
- android:paddingEnd="8dp"
- android:paddingTop="2dp"
- android:paddingBottom="2dp"
- >
- <LinearLayout
- android:id="@+id/line1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="6dp"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:orientation="horizontal"
- >
- <TextView android:id="@+id/title"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Title.Media"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:layout_weight="1"
- />
- <DateTimeView android:id="@+id/time"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="center"
- android:layout_weight="0"
- android:visibility="gone"
- android:paddingLeft="8dp"
- android:paddingStart="8dp"
- />
- <Chronometer android:id="@+id/chronometer"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="center"
- android:layout_weight="0"
- android:visibility="gone"
- android:paddingLeft="8dp"
- android:paddingStart="8dp"
- />
- </LinearLayout>
- <TextView android:id="@+id/text2"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Line2.Media"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="-2dp"
- android:layout_marginBottom="-2dp"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:singleLine="true"
- android:fadingEdge="horizontal"
- android:ellipsize="marquee"
- android:visibility="gone"
- />
- <LinearLayout
- android:id="@+id/line3"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- >
- <TextView android:id="@+id/text"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Media"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_gravity="center"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- />
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="0"
- android:singleLine="true"
- android:gravity="center"
- android:paddingLeft="8dp"
- android:paddingStart="8dp"
- />
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/v7/appcompat/res/layout/notification_template_media.xml b/v7/appcompat/res/layout/notification_template_media.xml
deleted file mode 100644
index 6eac23b7..0000000
--- a/v7/appcompat/res/layout/notification_template_media.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="64dp"
- android:orientation="horizontal"
- >
- <include layout="@layout/notification_template_icon_group"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- />
- <include layout="@layout/notification_template_lines_media"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"/>
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical|end"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="match_parent"
- android:layout_marginRight="6dp"
- android:layout_marginEnd="6dp"/>
- <ImageView android:id="@+id/end_padder"
- android:layout_width="6dp"
- android:layout_height="match_parent"
- />
-</LinearLayout>
diff --git a/v7/appcompat/res/layout/notification_template_media_custom.xml b/v7/appcompat/res/layout/notification_template_media_custom.xml
deleted file mode 100644
index 62e07d4..0000000
--- a/v7/appcompat/res/layout/notification_template_media_custom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/status_bar_latest_event_content"
- android:layout_width="match_parent"
- android:layout_height="64dp"
- android:orientation="horizontal"
- >
- <include layout="@layout/notification_template_icon_group"
- android:layout_width="@dimen/notification_large_icon_width"
- android:layout_height="@dimen/notification_large_icon_height"
- />
- <LinearLayout
- android:id="@+id/notification_main_column_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/notification_main_column_padding_top"
- android:minHeight="@dimen/notification_large_icon_height"
- android:orientation="horizontal"
- android:layout_toLeftOf="@id/cancel_action"
- android:layout_toStartOf="@id/cancel_action">
- <FrameLayout
- android:id="@+id/notification_main_column"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/notification_content_margin_start"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"/>
- <FrameLayout
- android:id="@+id/right_side"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:layout_marginEnd="8dp"
- android:paddingTop="@dimen/notification_right_side_padding_top">
- <DateTimeView android:id="@+id/time"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <Chronometer android:id="@+id/chronometer"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:layout_gravity="end|top"
- android:visibility="gone"
- />
- <TextView android:id="@+id/info"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Info.Media"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_gravity="end|bottom"
- android:singleLine="true"
- />
- </FrameLayout>
- </LinearLayout>
- <LinearLayout
- android:id="@+id/media_actions"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical|end"
- android:orientation="horizontal"
- android:layoutDirection="ltr"
- >
- <!-- media buttons will be added here -->
- </LinearLayout>
- <include layout="@layout/notification_media_cancel_action"
- android:layout_width="48dp"
- android:layout_height="match_parent"
- android:layout_marginRight="6dp"
- android:layout_marginEnd="6dp"/>
- <ImageView android:id="@+id/end_padder"
- android:layout_width="6dp"
- android:layout_height="match_parent"
- />
-</LinearLayout>
diff --git a/v7/appcompat/res/layout/notification_template_part_chronometer.xml b/v7/appcompat/res/layout/notification_template_part_chronometer.xml
deleted file mode 100644
index 9e58a38..0000000
--- a/v7/appcompat/res/layout/notification_template_part_chronometer.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<Chronometer android:id="@+id/chronometer" xmlns:android="http://schemas.android.com/apk/res/android"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- />
diff --git a/v7/appcompat/res/layout/notification_template_part_time.xml b/v7/appcompat/res/layout/notification_template_part_time.xml
deleted file mode 100644
index 810d1e3..0000000
--- a/v7/appcompat/res/layout/notification_template_part_time.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<DateTimeView android:id="@+id/time" xmlns:android="http://schemas.android.com/apk/res/android"
- android:textAppearance="@style/TextAppearance.AppCompat.Notification.Time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- />
diff --git a/v7/appcompat/res/values-v14/styles.xml b/v7/appcompat/res/values-v14/styles.xml
deleted file mode 100644
index 39419d2..0000000
--- a/v7/appcompat/res/values-v14/styles.xml
+++ /dev/null
@@ -1,38 +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
- -->
-
-<resources>
-
- <!-- Use platform styles -->
- <style name="TextAppearance.StatusBar.EventContent"
- parent="@android:style/TextAppearance.StatusBar.EventContent"/>
-
- <style name="TextAppearance.StatusBar.EventContent.Title"
- parent="@android:style/TextAppearance.StatusBar.EventContent.Title"/>
-
- <!-- Use own styles for which platform styles are not public -->
- <style name="TextAppearance.StatusBar.EventContent.Line2">
- <item name="android:textSize">@dimen/notification_subtext_size</item>
- </style>
- <style name="TextAppearance.StatusBar.EventContent.Info"/>
- <style name="TextAppearance.StatusBar.EventContent.Time"/>
-
- <style name="TextAppearance.AppCompat.Notification.Title"
- parent="@android:style/TextAppearance.StatusBar.EventContent.Title"/>
-
- <style name="TextAppearance.AppCompat.Notification"
- parent="@android:style/TextAppearance.StatusBar.EventContent"/>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v21/dimens.xml b/v7/appcompat/res/values-v21/dimens.xml
deleted file mode 100644
index de665a6..0000000
--- a/v7/appcompat/res/values-v21/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- the margin at the beginning of the notification content -->
- <dimen name="notification_content_margin_start">0dp</dimen>
- <!-- image margin on the large icon in the narrow media template -->
- <dimen name="notification_media_narrow_margin">12dp</dimen>
- <!-- the top padding of the notification content -->
- <dimen name="notification_main_column_padding_top">0dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v21/styles.xml b/v7/appcompat/res/values-v21/styles.xml
index 1c435ae..48d0366 100644
--- a/v7/appcompat/res/values-v21/styles.xml
+++ b/v7/appcompat/res/values-v21/styles.xml
@@ -18,16 +18,16 @@
<!-- Use platform styles -->
<style name="TextAppearance.AppCompat.Notification.Info"
- parent="@android:style/TextAppearance.Material.Notification.Info"/>
+ parent="@android:style/TextAppearance.Material.Notification.Info"/>
<style name="TextAppearance.AppCompat.Notification.Time"
- parent="@android:style/TextAppearance.Material.Notification.Time"/>
+ parent="@android:style/TextAppearance.Material.Notification.Time"/>
<style name="TextAppearance.AppCompat.Notification.Title"
- parent="@android:style/TextAppearance.Material.Notification.Title"/>
+ parent="@android:style/TextAppearance.Material.Notification.Title"/>
<style name="TextAppearance.AppCompat.Notification"
- parent="@android:style/TextAppearance.Material.Notification"/>
+ parent="@android:style/TextAppearance.Material.Notification"/>
<style name="TextAppearance.AppCompat.Notification.Media" >
<item name="android:textColor">@color/secondary_text_default_material_dark</item>
@@ -44,15 +44,4 @@
<style name="TextAppearance.AppCompat.Notification.Time.Media">
<item name="android:textColor">@color/secondary_text_default_material_dark</item>
</style>
-
- <style name="Widget.AppCompat.NotificationActionText" parent="">
- <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
- <item name="android:textColor">@color/secondary_text_default_material_light</item>
- <item name="android:textSize">@dimen/notification_action_text_size</item>
- </style>
-
- <style name="Widget.AppCompat.NotificationActionContainer" parent="">
- <item name="android:background">@drawable/notification_action_background</item>
- </style>
-
</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v24/styles.xml b/v7/appcompat/res/values-v24/styles.xml
index 52bb3d4..4cd8461 100644
--- a/v7/appcompat/res/values-v24/styles.xml
+++ b/v7/appcompat/res/values-v24/styles.xml
@@ -15,7 +15,6 @@
-->
<resources>
-
<!-- Use platform styles, Media is dark again -->
<style name="TextAppearance.AppCompat.Notification.Media" />
@@ -24,5 +23,4 @@
<style name="TextAppearance.AppCompat.Notification.Time.Media" />
<style name="TextAppearance.AppCompat.Notification.Title.Media" />
-
-</resources>
\ No newline at end of file
+</resources>
diff --git a/v7/appcompat/res/values/colors.xml b/v7/appcompat/res/values/colors.xml
index e6bab86..6191fea 100644
--- a/v7/appcompat/res/values/colors.xml
+++ b/v7/appcompat/res/values/colors.xml
@@ -20,15 +20,6 @@
<color name="abc_input_method_navigation_guard">@android:color/black</color>
- <drawable name="notification_template_icon_bg">#3333B5E5</drawable>
- <drawable name="notification_template_icon_low_bg">#0cffffff</drawable>
- <color name="notification_action_color_filter">#ffffffff</color>
- <color name="notification_icon_bg_color">#ff9e9e9e</color>
-
- <!-- The color of the material notification background for media notifications when no custom
- color is specified -->
- <color name="notification_material_background_media_default_color">#ff424242</color>
-
<!-- Tooltip specific colors -->
<color name="tooltip_background_dark">#e6616161</color>
<color name="tooltip_background_light">#e6FFFFFF</color>
diff --git a/v7/appcompat/res/values/config.xml b/v7/appcompat/res/values/config.xml
index 96916a8..0f99f6d 100644
--- a/v7/appcompat/res/values/config.xml
+++ b/v7/appcompat/res/values/config.xml
@@ -33,12 +33,6 @@
<bool name="abc_config_closeDialogWhenTouchOutside">true</bool>
- <!-- Maximum numerical value that will be shown in a status bar
- notification icon or in the notification itself. Will be replaced
- with @string/status_bar_notification_info_overflow when shown in the
- UI. -->
- <integer name="status_bar_notification_info_maxnum">999</integer>
-
<integer name="cancel_button_image_alpha">127</integer>
<!-- The duration (in milliseconds) of the tooltip show/hide animations. -->
diff --git a/v7/appcompat/res/values/dimens.xml b/v7/appcompat/res/values/dimens.xml
index 284bdf1..a02b7c0 100644
--- a/v7/appcompat/res/values/dimens.xml
+++ b/v7/appcompat/res/values/dimens.xml
@@ -95,52 +95,6 @@
<!-- Minimum "smallest width" of the display for cascading menus to be enabled. -->
<dimen name="abc_cascading_menus_min_smallest_width">720dp</dimen>
- <!-- The width of the big icons in notifications. -->
- <dimen name="notification_large_icon_width">64dp</dimen>
-
- <!-- The width of the big icons in notifications. -->
- <dimen name="notification_large_icon_height">64dp</dimen>
-
- <!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info,
- Time) -->
- <dimen name="notification_subtext_size">13sp</dimen>
-
- <!-- Size of notification action text -->
- <dimen name="notification_action_text_size">13sp</dimen>
-
- <!-- Top padding for notifications in the standard layout. -->
- <dimen name="notification_top_pad">10dp</dimen>
-
- <!-- Top padding for notification when text is large -->
- <dimen name="notification_top_pad_large_text">5dp</dimen>
-
- <!-- The size of the action icons -->
- <dimen name="notification_action_icon_size">32dp</dimen>
-
- <!-- the size of the small icon on the right of the largeIcon -->
- <dimen name="notification_right_icon_size">16dp</dimen>
-
- <!-- the padding of the small icon to the circle -->
- <dimen name="notification_small_icon_background_padding">3dp</dimen>
-
- <!-- the side margin of the big notification circle -->
- <dimen name="notification_big_circle_margin">12dp</dimen>
-
- <!-- small icon size when placed as large icon -->
- <dimen name="notification_small_icon_size_as_large">24dp</dimen>
-
- <!-- the margin at the beginning of the notification content -->
- <dimen name="notification_content_margin_start">8dp</dimen>
-
- <!-- image margin on the large icon in the narrow media template -->
- <dimen name="notification_media_narrow_margin">@dimen/notification_content_margin_start</dimen>
-
- <!-- the top padding of the notification content -->
- <dimen name="notification_main_column_padding_top">10dp</dimen>
-
- <!-- the paddingtop on the right side of the notification (for time etc.) -->
- <dimen name="notification_right_side_padding_top">2dp</dimen>
-
<!-- Tooltip dimensions. -->
<!-- Vertical offset from the edge of the anchor view for a touch-triggered tooltip. -->
<dimen name="tooltip_y_offset_touch">16dp</dimen>
diff --git a/v7/appcompat/res/values/strings.xml b/v7/appcompat/res/values/strings.xml
index 3f1d959..55bf5ad 100644
--- a/v7/appcompat/res/values/strings.xml
+++ b/v7/appcompat/res/values/strings.xml
@@ -62,13 +62,6 @@
<!-- Description of the choose target button in a ShareActionProvider (share UI). [CHAR LIMIT=NONE] -->
<string name="abc_shareactionprovider_share_with">Share with</string>
- <!-- Text to use when the number in a notification info is too large
- (greater than status_bar_notification_info_maxnum, defined in
- values/config.xml) and must be truncated. May need to be localized
- for most appropriate textual indicator of "more than X".
- [CHAR LIMIT=4] -->
- <string name="status_bar_notification_info_overflow">999+</string>
-
<!-- Default text for a button that can be toggled on and off. -->
<string name="abc_capital_on">ON</string>
<!-- Default text for a button that can be toggled on and off. -->
diff --git a/v7/appcompat/res/values/styles.xml b/v7/appcompat/res/values/styles.xml
index 394b1ec..ce74a89 100644
--- a/v7/appcompat/res/values/styles.xml
+++ b/v7/appcompat/res/values/styles.xml
@@ -329,22 +329,10 @@
<style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Large" parent="TextAppearance.AppCompat.Widget.PopupMenu.Large" />
<style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Small" parent="TextAppearance.AppCompat.Widget.PopupMenu.Small" />
- <!-- These styles didn't exist on v7. Since we only use the media template in later versions
- (ICS+), just define it here and use the correct references in values/v14 -->
- <style name="TextAppearance.StatusBar.EventContent" parent=""/>
- <style name="TextAppearance.StatusBar.EventContent.Title" parent=""/>
- <style name="TextAppearance.StatusBar.EventContent.Line2" parent=""/>
- <style name="TextAppearance.StatusBar.EventContent.Info" parent=""/>
- <style name="TextAppearance.StatusBar.EventContent.Time" parent=""/>
-
- <style name="TextAppearance.AppCompat.Notification">
- <item name="android:textSize">14sp</item>
- <item name="android:textColor">?android:attr/textColorSecondary</item>
- </style>
- <style name="TextAppearance.AppCompat.Notification.Title">
- <item name="android:textSize">16sp</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- </style>
+ <!-- These styles have moved to support-compat and should be removed when
+ android.support.v7.app.NotificationCompat is removed -->
+ <style name="TextAppearance.AppCompat.Notification" parent="@android:style/TextAppearance.StatusBar.EventContent" />
+ <style name="TextAppearance.AppCompat.Notification.Title" parent="@android:style/TextAppearance.StatusBar.EventContent.Title" />
<style name="TextAppearance.AppCompat.Notification.Info">
<item name="android:textSize">12sp</item>
<item name="android:textColor">?android:attr/textColorSecondary</item>
@@ -355,16 +343,11 @@
</style>
<style name="TextAppearance.AppCompat.Notification.Line2" parent="TextAppearance.AppCompat.Notification.Info" />
+ <!-- These styles have moved to media-compat and should be removed when
+ android.support.v7.app.NotificationCompat is removed -->
<style name="TextAppearance.AppCompat.Notification.Title.Media" />
-
<style name="TextAppearance.AppCompat.Notification.Media" />
-
- <style name="TextAppearance.AppCompat.Notification.Info.Media"/>
-
- <style name="TextAppearance.AppCompat.Notification.Time.Media"/>
-
- <style name="TextAppearance.AppCompat.Notification.Line2.Media" parent="TextAppearance.AppCompat.Notification.Info.Media"/>
-
- <style name="Widget.AppCompat.NotificationActionText" parent=""/>
- <style name="Widget.AppCompat.NotificationActionContainer" parent=""/>
+ <style name="TextAppearance.AppCompat.Notification.Info.Media" />
+ <style name="TextAppearance.AppCompat.Notification.Time.Media" />
+ <style name="TextAppearance.AppCompat.Notification.Line2.Media" parent="TextAppearance.AppCompat.Notification.Info.Media" />
</resources>
diff --git a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
index 9d9cc82..b1c3e95 100644
--- a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
+++ b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
@@ -16,38 +16,42 @@
package android.support.v7.app;
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
-import android.media.session.MediaSession;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RestrictTo;
import android.support.v4.app.BundleCompat;
-import android.support.v4.app.NotificationBuilderWithBuilderAccessor;
import android.support.v4.media.session.MediaSessionCompat;
-import android.support.v7.appcompat.R;
-import android.view.View;
import android.widget.RemoteViews;
/**
* An extension of {@link android.support.v4.app.NotificationCompat} which adds additional styles.
+ * @deprecated Use {@link android.support.v4.app.NotificationCompat}.
*/
+@Deprecated
public class NotificationCompat extends android.support.v4.app.NotificationCompat {
/**
+ * @deprecated Use the static classes in {@link android.support.v4.app.NotificationCompat}.
+ */
+ @Deprecated
+ public NotificationCompat() {
+ }
+
+ /**
* Extracts a {@link MediaSessionCompat.Token} from the extra values
* in the {@link MediaStyle} {@link android.app.Notification notification}.
*
* @param notification The notification to extract a {@link MediaSessionCompat.Token} from.
* @return The {@link MediaSessionCompat.Token} in the {@code notification} if it contains,
* null otherwise.
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #getMediaSession(Notification)}.
*/
+ @Deprecated
public static MediaSessionCompat.Token getMediaSession(Notification notification) {
Bundle extras = getExtras(notification);
if (extras != null) {
@@ -130,23 +134,28 @@
* .build();
* </pre>
*
- * @see Notification#bigContentView
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle}.
*/
- public static class MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+ @Deprecated
+ public static class MediaStyle extends
+ android.support.v4.media.app.NotificationCompat.MediaStyle {
- private static final int MAX_MEDIA_BUTTONS_IN_COMPACT = 3;
- private static final int MAX_MEDIA_BUTTONS = 5;
-
- int[] mActionsToShowInCompact = null;
- MediaSessionCompat.Token mToken;
- boolean mShowCancelButton;
- PendingIntent mCancelButtonIntent;
-
+ /**
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #MediaStyle()}
+ */
+ @Deprecated
public MediaStyle() {
+ super();
}
+ /**
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #MediaStyle(android.support.v4.app.NotificationCompat.Builder)}
+ */
+ @Deprecated
public MediaStyle(android.support.v4.app.NotificationCompat.Builder builder) {
- setBuilder(builder);
+ super(builder);
}
/**
@@ -154,19 +163,27 @@
* notification view.
*
* @param actions the indices of the actions to show in the compact notification view
+ *
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #setShowActionsInCompactView(int...)}
*/
+ @Deprecated
+ @Override
public MediaStyle setShowActionsInCompactView(int...actions) {
- mActionsToShowInCompact = actions;
- return this;
+ return (MediaStyle) super.setShowActionsInCompactView(actions);
}
/**
* Attaches a {@link MediaSessionCompat.Token} to this Notification
* to provide additional playback information and control to the SystemUI.
+ *
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #setMediaSession(MediaSessionCompat.Token)}
*/
+ @Deprecated
+ @Override
public MediaStyle setMediaSession(MediaSessionCompat.Token token) {
- mToken = token;
- return this;
+ return (MediaStyle) super.setMediaSession(token);
}
/**
@@ -192,12 +209,14 @@
* <p>Also note that this method is a no-op when running on Lollipop and later.
*
* @param show whether to show a cancel button
+ *
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #setShowCancelButton(boolean)}
*/
+ @Deprecated
+ @Override
public MediaStyle setShowCancelButton(boolean show) {
- if (Build.VERSION.SDK_INT < 21) {
- mShowCancelButton = show;
- }
- return this;
+ return (MediaStyle) super.setShowCancelButton(show);
}
/**
@@ -205,146 +224,14 @@
* #setShowCancelButton}.
*
* @param pendingIntent the intent to be sent when the cancel button is pressed
+ *
+ * @deprecated Use {@link android.support.v4.media.app.NotificationCompat.MediaStyle
+ * #setCancelButtonIntent(PendingIntent)}
*/
+ @Deprecated
+ @Override
public MediaStyle setCancelButtonIntent(PendingIntent pendingIntent) {
- mCancelButtonIntent = pendingIntent;
- return this;
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public void apply(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 21) {
- builder.getBuilder().setStyle(
- fillInMediaStyle(new Notification.MediaStyle()));
- } else if (mShowCancelButton) {
- builder.getBuilder().setOngoing(true);
- }
- }
-
- @RequiresApi(21)
- Notification.MediaStyle fillInMediaStyle(Notification.MediaStyle style) {
- if (mActionsToShowInCompact != null) {
- style.setShowActionsInCompactView(mActionsToShowInCompact);
- }
- if (mToken != null) {
- style.setMediaSession((MediaSession.Token) mToken.getToken());
- }
- return style;
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 21) {
- // No custom content view required
- return null;
- }
- return generateContentView();
- }
-
- RemoteViews generateContentView() {
- RemoteViews view = NotificationCompatImplBase.applyStandardTemplate(
- mBuilder, false /* showSmallIcon */,
- getContentViewLayoutResource(), true /* fitIn1U */);
-
- final int numActions = mBuilder.mActions.size();
- final int numActionsInCompact = mActionsToShowInCompact == null
- ? 0
- : Math.min(mActionsToShowInCompact.length, MAX_MEDIA_BUTTONS_IN_COMPACT);
- view.removeAllViews(R.id.media_actions);
- if (numActionsInCompact > 0) {
- for (int i = 0; i < numActionsInCompact; i++) {
- if (i >= numActions) {
- throw new IllegalArgumentException(String.format(
- "setShowActionsInCompactView: action %d out of bounds (max %d)",
- i, numActions - 1));
- }
-
- final NotificationCompat.Action action =
- mBuilder.mActions.get(mActionsToShowInCompact[i]);
- final RemoteViews button = generateMediaActionButton(action);
- view.addView(R.id.media_actions, button);
- }
- }
- if (mShowCancelButton) {
- view.setViewVisibility(R.id.end_padder, View.GONE);
- view.setViewVisibility(R.id.cancel_action, View.VISIBLE);
- view.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
- view.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
- .getResources().getInteger(R.integer.cancel_button_image_alpha));
- } else {
- view.setViewVisibility(R.id.end_padder, View.VISIBLE);
- view.setViewVisibility(R.id.cancel_action, View.GONE);
- }
- return view;
- }
-
- private RemoteViews generateMediaActionButton(NotificationCompat.Action action) {
- final boolean tombstone = (action.getActionIntent() == null);
- RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
- R.layout.notification_media_action);
- button.setImageViewResource(R.id.action0, action.getIcon());
- if (!tombstone) {
- button.setOnClickPendingIntent(R.id.action0, action.getActionIntent());
- }
- if (Build.VERSION.SDK_INT >= 15) {
- button.setContentDescription(R.id.action0, action.getTitle());
- }
- return button;
- }
-
- int getContentViewLayoutResource() {
- return R.layout.notification_template_media;
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 21) {
- // No custom content view required
- return null;
- }
- return generateBigContentView();
- }
-
- RemoteViews generateBigContentView() {
- final int actionCount = Math.min(mBuilder.mActions.size(), MAX_MEDIA_BUTTONS);
- RemoteViews big = NotificationCompatImplBase.applyStandardTemplate(
- mBuilder, false /* showSmallIcon */,
- getBigContentViewLayoutResource(actionCount), false /* fitIn1U */);
-
- big.removeAllViews(R.id.media_actions);
- if (actionCount > 0) {
- for (int i = 0; i < actionCount; i++) {
- final RemoteViews button = generateMediaActionButton(mBuilder.mActions.get(i));
- big.addView(R.id.media_actions, button);
- }
- }
- if (mShowCancelButton) {
- big.setViewVisibility(R.id.cancel_action, View.VISIBLE);
- big.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
- .getResources().getInteger(R.integer.cancel_button_image_alpha));
- big.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
- } else {
- big.setViewVisibility(R.id.cancel_action, View.GONE);
- }
- return big;
- }
-
- int getBigContentViewLayoutResource(int actionCount) {
- return actionCount <= 3
- ? R.layout.notification_template_big_media_narrow
- : R.layout.notification_template_big_media;
+ return (MediaStyle) super.setCancelButtonIntent(pendingIntent);
}
}
@@ -376,123 +263,23 @@
* {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification} or
* {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification_Title} in
* your custom views in order to get the correct styling on each platform version.
+ *
+ * @deprecated Use {@link android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle}
+ * and {@link android.support.compat.R.style#TextAppearance_Compat_Notification} or
+ * {@link android.support.compat.R.style#TextAppearance_Compat_Notification_Title}.
*/
- public static class DecoratedCustomViewStyle extends Style {
+ @Deprecated
+ public static class DecoratedCustomViewStyle extends
+ android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle {
- private static final int MAX_ACTION_BUTTONS = 3;
-
+ /**
+ * @deprecated Use
+ * {@link android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle
+ * #DecoratedCustomViewStyle()}.
+ */
+ @Deprecated
public DecoratedCustomViewStyle() {
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public void apply(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());
- }
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom content view required
- return null;
- }
- if (mBuilder.getContentView() == null) {
- // No special content view
- return null;
- }
- return createRemoteViews(mBuilder.getContentView(), false);
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom big content view required
- return null;
- }
- RemoteViews bigContentView = mBuilder.getBigContentView();
- RemoteViews innerView = bigContentView != null
- ? bigContentView
- : mBuilder.getContentView();
- if (innerView == null) {
- // No expandable notification
- return null;
- }
- return createRemoteViews(innerView, true);
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom heads up content view required
- return null;
- }
- RemoteViews headsUp = mBuilder.getHeadsUpContentView();
- RemoteViews innerView = headsUp != null ? headsUp : mBuilder.getContentView();
- if (headsUp == null) {
- // No expandable notification
- return null;
- }
- return createRemoteViews(innerView, true);
- }
-
- private RemoteViews createRemoteViews(RemoteViews innerView, boolean showActions) {
- RemoteViews remoteViews = NotificationCompatImplBase.applyStandardTemplate(
- mBuilder, true /* showSmallIcon */,
- R.layout.notification_template_custom_big, false /* fitIn1U */);
- remoteViews.removeAllViews(R.id.actions);
- boolean actionsVisible = false;
- if (showActions && mBuilder.mActions != null) {
- int numActions = Math.min(mBuilder.mActions.size(), MAX_ACTION_BUTTONS);
- if (numActions > 0) {
- actionsVisible = true;
- for (int i = 0; i < numActions; i++) {
- final RemoteViews button = generateActionButton(mBuilder.mActions.get(i));
- remoteViews.addView(R.id.actions, button);
- }
- }
- }
- int actionVisibility = actionsVisible ? View.VISIBLE : View.GONE;
- remoteViews.setViewVisibility(R.id.actions, actionVisibility);
- remoteViews.setViewVisibility(R.id.action_divider, actionVisibility);
- NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- remoteViews, innerView);
- return remoteViews;
- }
-
- private RemoteViews generateActionButton(NotificationCompat.Action action) {
- final boolean tombstone = (action.actionIntent == null);
- RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
- tombstone ? R.layout.notification_action_tombstone
- : R.layout.notification_action);
- button.setImageViewBitmap(R.id.action_image,
- NotificationCompatImplBase.createColoredBitmap(mBuilder.mContext,
- action.getIcon(), mBuilder.mContext.getResources()
- .getColor(R.color.notification_action_color_filter)));
- button.setTextViewText(R.id.action_text, action.title);
- if (!tombstone) {
- button.setOnClickPendingIntent(R.id.action_container, action.actionIntent);
- }
- if (Build.VERSION.SDK_INT >= 15) {
- button.setContentDescription(R.id.action_container, action.title);
- }
- return button;
+ super();
}
}
@@ -526,141 +313,26 @@
* android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification_Title_Media} in
* your custom views in order to get the correct styling on each platform version.
*
- * @see DecoratedCustomViewStyle
- * @see MediaStyle
+ * @see android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle
+ * @see android.support.v4.media.app.NotificationCompat.MediaStyle
+ *
+ * @deprecated Use
+ * {@link android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle} and
+ * {@link android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Media} and
+ * {@link android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Title_Media}.
*/
- public static class DecoratedMediaCustomViewStyle extends MediaStyle {
+ @Deprecated
+ public static class DecoratedMediaCustomViewStyle extends
+ android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle {
+ /**
+ * @deprecated Use
+ * {@link android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle
+ * #DecoratedMediaCustomViewStyle()}.
+ */
+ @Deprecated
public DecoratedMediaCustomViewStyle() {
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public void apply(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- builder.getBuilder().setStyle(
- fillInMediaStyle(new Notification.DecoratedMediaCustomViewStyle()));
- } else {
- super.apply(builder);
- }
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom content view required
- return null;
- }
- boolean hasContentView = mBuilder.getContentView() != null;
- if (Build.VERSION.SDK_INT >= 21) {
- // If we are on L/M the media notification will only be colored if the expanded
- // version is of media style, so we have to create a custom view for the collapsed
- // version as well in that case.
- boolean createCustomContent = hasContentView
- || mBuilder.getBigContentView() != null;
- if (createCustomContent) {
- RemoteViews contentView = generateContentView();
- if (hasContentView) {
- NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- contentView,
- mBuilder.getContentView());
- }
- setBackgroundColor(contentView);
- return contentView;
- }
- } else {
- RemoteViews contentView = generateContentView();
- if (hasContentView) {
- NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- contentView,
- mBuilder.getContentView());
- return contentView;
- }
- }
- return null;
- }
-
- @Override
- int getContentViewLayoutResource() {
- return mBuilder.getContentView() != null
- ? R.layout.notification_template_media_custom
- : super.getContentViewLayoutResource();
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom big content view required
- return null;
- }
- RemoteViews innerView = mBuilder.getBigContentView() != null
- ? mBuilder.getBigContentView()
- : mBuilder.getContentView();
- if (innerView == null) {
- // No expandable notification
- return null;
- }
- RemoteViews bigContentView = generateBigContentView();
- NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- bigContentView,
- innerView);
- if (Build.VERSION.SDK_INT >= 21) {
- setBackgroundColor(bigContentView);
- }
- return bigContentView;
- }
-
- @Override
- int getBigContentViewLayoutResource(int actionCount) {
- return actionCount <= 3
- ? R.layout.notification_template_big_media_narrow_custom
- : R.layout.notification_template_big_media_custom;
- }
-
- /**
- * @hide
- */
- @RestrictTo(LIBRARY_GROUP)
- @Override
- public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
- if (Build.VERSION.SDK_INT >= 24) {
- // No custom heads up content view required
- return null;
- }
- RemoteViews innerView = mBuilder.getHeadsUpContentView() != null
- ? mBuilder.getHeadsUpContentView()
- : mBuilder.getContentView();
- if (innerView == null) {
- // No expandable notification
- return null;
- }
- RemoteViews headsUpContentView = generateBigContentView();
- NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- headsUpContentView,
- innerView);
- if (Build.VERSION.SDK_INT >= 21) {
- setBackgroundColor(headsUpContentView);
- }
- return headsUpContentView;
- }
-
- private void setBackgroundColor(RemoteViews views) {
- int color = mBuilder.getColor() != COLOR_DEFAULT
- ? mBuilder.getColor()
- : mBuilder.mContext.getResources().getColor(
- R.color.notification_material_background_media_default_color);
- views.setInt(R.id.status_bar_latest_event_content, "setBackgroundColor", color);
+ super();
}
}
}
diff --git a/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java b/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java
deleted file mode 100644
index b2d5eaa..0000000
--- a/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java
+++ /dev/null
@@ -1,256 +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.v7.app;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.SystemClock;
-import android.support.annotation.RequiresApi;
-import android.support.v4.app.NotificationCompat;
-import android.support.v7.appcompat.R;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.RemoteViews;
-
-import java.text.NumberFormat;
-
-/**
- * Helper class to generate MediaStyle notifications for pre-Lollipop platforms. Overrides
- * contentView and bigContentView of the notification.
- */
-@RequiresApi(9)
-class NotificationCompatImplBase {
-
- static Bitmap createColoredBitmap(Context context, int iconId, int color) {
- return createColoredBitmap(context, iconId, color, 0);
- }
-
- private static Bitmap createColoredBitmap(Context context, int iconId, int color, int size) {
- Drawable drawable = context.getResources().getDrawable(iconId);
- int width = size == 0 ? drawable.getIntrinsicWidth() : size;
- int height = size == 0 ? drawable.getIntrinsicHeight() : size;
- Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- drawable.setBounds(0, 0, width, height);
- if (color != 0) {
- drawable.mutate().setColorFilter(
- new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
- }
- Canvas canvas = new Canvas(resultBitmap);
- drawable.draw(canvas);
- return resultBitmap;
- }
-
- public static RemoteViews applyStandardTemplate(NotificationCompat.Builder builder,
- boolean showSmallIcon, int resId, boolean fitIn1U) {
- Resources res = builder.mContext.getResources();
- RemoteViews contentView = new RemoteViews(builder.mContext.getPackageName(), resId);
- boolean showLine3 = false;
- boolean showLine2 = false;
-
- boolean minPriority = builder.getPriority() < NotificationCompat.PRIORITY_LOW;
- if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 21) {
- // lets color the backgrounds
- if (minPriority) {
- contentView.setInt(R.id.notification_background,
- "setBackgroundResource", R.drawable.notification_bg_low);
- contentView.setInt(R.id.icon,
- "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
- } else {
- contentView.setInt(R.id.notification_background,
- "setBackgroundResource", R.drawable.notification_bg);
- contentView.setInt(R.id.icon,
- "setBackgroundResource", R.drawable.notification_template_icon_bg);
- }
- }
-
- if (builder.mLargeIcon != null) {
- // On versions before Jellybean, the large icon was shown by SystemUI, so we need to hide
- // it here.
- if (Build.VERSION.SDK_INT >= 16) {
- contentView.setViewVisibility(R.id.icon, View.VISIBLE);
- contentView.setImageViewBitmap(R.id.icon, builder.mLargeIcon);
- } else {
- contentView.setViewVisibility(R.id.icon, View.GONE);
- }
- if (showSmallIcon && builder.mNotification.icon != 0) {
- int backgroundSize = res.getDimensionPixelSize(
- R.dimen.notification_right_icon_size);
- int iconSize = backgroundSize - res.getDimensionPixelSize(
- R.dimen.notification_small_icon_background_padding) * 2;
- if (Build.VERSION.SDK_INT >= 21) {
- Bitmap smallBit = createIconWithBackground(builder.mContext,
- builder.mNotification.icon,
- backgroundSize,
- iconSize,
- builder.getColor());
- contentView.setImageViewBitmap(R.id.right_icon, smallBit);
- } else {
- contentView.setImageViewBitmap(R.id.right_icon, createColoredBitmap(
- builder.mContext, builder.mNotification.icon, Color.WHITE));
- }
- contentView.setViewVisibility(R.id.right_icon, View.VISIBLE);
- }
- } else if (showSmallIcon && builder.mNotification.icon != 0) { // small icon at left
- contentView.setViewVisibility(R.id.icon, View.VISIBLE);
- if (Build.VERSION.SDK_INT >= 21) {
- int backgroundSize = res.getDimensionPixelSize(
- R.dimen.notification_large_icon_width)
- - res.getDimensionPixelSize(R.dimen.notification_big_circle_margin);
- int iconSize = res.getDimensionPixelSize(
- R.dimen.notification_small_icon_size_as_large);
- Bitmap smallBit = createIconWithBackground(builder.mContext,
- builder.mNotification.icon,
- backgroundSize,
- iconSize,
- builder.getColor());
- contentView.setImageViewBitmap(R.id.icon, smallBit);
- } else {
- contentView.setImageViewBitmap(R.id.icon, createColoredBitmap(
- builder.mContext, builder.mNotification.icon, Color.WHITE));
- }
- }
- if (builder.mContentTitle != null) {
- contentView.setTextViewText(R.id.title, builder.mContentTitle);
- }
- if (builder.mContentText != null) {
- contentView.setTextViewText(R.id.text, builder.mContentText);
- showLine3 = true;
- }
- // If there is a large icon we have a right side
- boolean hasRightSide = !(Build.VERSION.SDK_INT >= 21) && builder.mLargeIcon != null;
- if (builder.mContentInfo != null) {
- contentView.setTextViewText(R.id.info, builder.mContentInfo);
- contentView.setViewVisibility(R.id.info, View.VISIBLE);
- showLine3 = true;
- hasRightSide = true;
- } else if (builder.mNumber > 0) {
- final int tooBig = res.getInteger(
- R.integer.status_bar_notification_info_maxnum);
- if (builder.mNumber > tooBig) {
- contentView.setTextViewText(R.id.info, ((Resources) res).getString(
- R.string.status_bar_notification_info_overflow));
- } else {
- NumberFormat f = NumberFormat.getIntegerInstance();
- contentView.setTextViewText(R.id.info, f.format(builder.mNumber));
- }
- contentView.setViewVisibility(R.id.info, View.VISIBLE);
- showLine3 = true;
- hasRightSide = true;
- } else {
- contentView.setViewVisibility(R.id.info, View.GONE);
- }
-
- // Need to show three lines? Only allow on Jellybean+
- if (builder.mSubText != null && Build.VERSION.SDK_INT >= 16) {
- contentView.setTextViewText(R.id.text, builder.mSubText);
- if (builder.mContentText != null) {
- contentView.setTextViewText(R.id.text2, builder.mContentText);
- contentView.setViewVisibility(R.id.text2, View.VISIBLE);
- showLine2 = true;
- } else {
- contentView.setViewVisibility(R.id.text2, View.GONE);
- }
- }
-
- // RemoteViews.setViewPadding and RemoteViews.setTextViewTextSize is not available on ICS-
- if (showLine2 && Build.VERSION.SDK_INT >= 16) {
- if (fitIn1U) {
- // need to shrink all the type to make sure everything fits
- final float subTextSize = res.getDimensionPixelSize(
- R.dimen.notification_subtext_size);
- contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX, subTextSize);
- }
- // vertical centering
- contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
- }
-
- if (builder.getWhenIfShowing() != 0) {
- if (builder.mUseChronometer && Build.VERSION.SDK_INT >= 16) {
- contentView.setViewVisibility(R.id.chronometer, View.VISIBLE);
- contentView.setLong(R.id.chronometer, "setBase",
- builder.getWhenIfShowing()
- + (SystemClock.elapsedRealtime() - System.currentTimeMillis()));
- contentView.setBoolean(R.id.chronometer, "setStarted", true);
- } else {
- contentView.setViewVisibility(R.id.time, View.VISIBLE);
- contentView.setLong(R.id.time, "setTime", builder.getWhenIfShowing());
- }
- hasRightSide = true;
- }
- contentView.setViewVisibility(R.id.right_side, hasRightSide ? View.VISIBLE : View.GONE);
- contentView.setViewVisibility(R.id.line3, showLine3 ? View.VISIBLE : View.GONE);
- return contentView;
- }
-
- public static Bitmap createIconWithBackground(Context ctx, int iconId, int size, int iconSize,
- int color) {
- Bitmap coloredBitmap = createColoredBitmap(ctx, R.drawable.notification_icon_background,
- color == NotificationCompat.COLOR_DEFAULT ? 0 : color, size);
- Canvas canvas = new Canvas(coloredBitmap);
- Drawable icon = ctx.getResources().getDrawable(iconId).mutate();
- icon.setFilterBitmap(true);
- int inset = (size - iconSize) / 2;
- icon.setBounds(inset, inset, iconSize + inset, iconSize + inset);
- icon.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP));
- icon.draw(canvas);
- return coloredBitmap;
- }
-
- public static void buildIntoRemoteViews(Context ctx, RemoteViews outerView,
- RemoteViews innerView) {
- // this needs to be done fore the other calls, since otherwise we might hide the wrong
- // things if our ids collide.
- hideNormalContent(outerView);
- outerView.removeAllViews(R.id.notification_main_column);
- outerView.addView(R.id.notification_main_column, innerView.clone());
- outerView.setViewVisibility(R.id.notification_main_column, View.VISIBLE);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- // Adjust padding depending on font size.
- outerView.setViewPadding(R.id.notification_main_column_container,
- 0, calculateTopPadding(ctx), 0, 0);
- }
- }
-
- private static void hideNormalContent(RemoteViews outerView) {
- outerView.setViewVisibility(R.id.title, View.GONE);
- outerView.setViewVisibility(R.id.text2, View.GONE);
- outerView.setViewVisibility(R.id.text, View.GONE);
- }
-
- public static int calculateTopPadding(Context ctx) {
- int padding = ctx.getResources().getDimensionPixelSize(R.dimen.notification_top_pad);
- int largePadding = ctx.getResources().getDimensionPixelSize(
- R.dimen.notification_top_pad_large_text);
- float fontScale = ctx.getResources().getConfiguration().fontScale;
- float largeFactor = (constrain(fontScale, 1.0f, 1.3f) - 1f) / (1.3f - 1f);
-
- // Linearly interpolate the padding between large and normal with the font scale ranging
- // from 1f to LARGE_TEXT_SCALE
- return Math.round((1 - largeFactor) * padding + largeFactor * largePadding);
- }
-
- public static float constrain(float amount, float low, float high) {
- return amount < low ? low : (amount > high ? high : amount);
- }
-}
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
index 8e1f534..29449f5 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
@@ -25,6 +25,7 @@
import android.graphics.RectF;
import android.os.Build;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.appcompat.R;
@@ -35,6 +36,7 @@
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;
@@ -53,6 +55,7 @@
* fill its layout based on the TextView's characteristics and boundaries.
*/
class AppCompatTextViewAutoSizeHelper {
+ private static final String TAG = "ACTVAutoSizeHelper";
private static final RectF TEMP_RECTF = new RectF();
// Default minimum size for auto-sizing text in scaled pixels.
private static final int DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP = 12;
@@ -60,6 +63,9 @@
private static final int DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP = 112;
// Default value for the step size in pixels.
private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
+ // Cache of TextView methods used via reflection; the key is the method name and the value is
+ // the method itself or null if it can not be found.
+ private static Hashtable<String, Method> sTextViewMethodByNameCache = new Hashtable<>();
// Use this to specify that any of the auto-size configuration int values have not been set.
static final float UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1f;
// Ported from TextView#VERY_WIDE. Represents a maximum width in pixels the TextView takes when
@@ -82,9 +88,7 @@
// build the steps set using mAutoSizeMinTextSizeInPx, mAutoSizeMaxTextSizeInPx and
// mAutoSizeStepGranularityInPx.
private boolean mHasPresetAutoSizeValues = false;
-
private TextPaint mTempTextPaint;
- private Hashtable<String, Method> mMethodByNameCache = new Hashtable<>();
private final TextView mTextView;
private final Context mContext;
@@ -606,23 +610,14 @@
// Do not auto-size right after setting the text size.
mNeedsAutoSizeText = false;
+ final String methodName = "nullLayouts";
try {
- final String methodName = "nullLayouts";
- Method method = mMethodByNameCache.get(methodName);
- if (method == null) {
- method = TextView.class.getDeclaredMethod(methodName);
- if (method != null) {
- method.setAccessible(true);
- // Cache update.
- mMethodByNameCache.put(methodName, method);
- }
- }
-
+ Method method = getTextViewMethod(methodName);
if (method != null) {
method.invoke(mTextView);
}
} catch (Exception ex) {
- // Nothing to do.
+ Log.w(TAG, "Failed to invoke TextView#" + methodName + "() method", ex);
}
if (!isInLayout) {
@@ -754,25 +749,18 @@
includePad);
}
- private <T> T invokeAndReturnWithDefault(@NonNull Object object, @NonNull String methodName,
- @NonNull T defaultValue) {
+ private <T> T invokeAndReturnWithDefault(@NonNull Object object,
+ @NonNull final String methodName, @NonNull final T defaultValue) {
T result = null;
boolean exceptionThrown = false;
try {
// Cache lookup.
- Method method = mMethodByNameCache.get(methodName);
- if (method == null) {
- method = TextView.class.getDeclaredMethod(methodName);
- if (method != null) {
- method.setAccessible(true);
- // Cache update.
- mMethodByNameCache.put(methodName, method);
- }
- }
+ Method method = getTextViewMethod(methodName);
result = (T) method.invoke(object);
- } catch (Exception e) {
+ } catch (Exception ex) {
exceptionThrown = true;
+ Log.w(TAG, "Failed to invoke TextView#" + methodName + "() method", ex);
} finally {
if (result == null && exceptionThrown) {
result = defaultValue;
@@ -782,6 +770,26 @@
return result;
}
+ @Nullable
+ private Method getTextViewMethod(@NonNull final String methodName) {
+ try {
+ Method method = sTextViewMethodByNameCache.get(methodName);
+ if (method == null) {
+ method = TextView.class.getDeclaredMethod(methodName);
+ if (method != null) {
+ method.setAccessible(true);
+ // Cache update.
+ sTextViewMethodByNameCache.put(methodName, method);
+ }
+ }
+
+ return method;
+ } catch (Exception ex) {
+ Log.w(TAG, "Failed to retrieve TextView#" + methodName + "() method", ex);
+ return null;
+ }
+ }
+
/**
* @return {@code true} if this widget supports auto-sizing text and has been configured to
* auto-size.
diff --git a/v7/cardview/build.gradle b/v7/cardview/build.gradle
index b5a08ef..e839aee 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -2,7 +2,7 @@
archivesBaseName = 'cardview-v7'
dependencies {
- compile project(':support-annotations')
+ api project(':support-annotations')
}
android {
diff --git a/v7/cardview/lint-baseline.xml b/v7/cardview/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/v7/cardview/lint-baseline.xml
+++ b/v7/cardview/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index 63d149f..c66848f 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -2,13 +2,13 @@
archivesBaseName = 'gridlayout-v7'
dependencies {
- compile project(':support-compat')
- compile project(':support-core-ui')
+ api project(':support-compat')
+ api project(':support-core-ui')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
}
diff --git a/v7/gridlayout/lint-baseline.xml b/v7/gridlayout/lint-baseline.xml
index 493c8c5..e961253 100644
--- a/v7/gridlayout/lint-baseline.xml
+++ b/v7/gridlayout/lint-baseline.xml
@@ -1,15 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index f971a0b..eabc5e3 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -2,16 +2,16 @@
archivesBaseName = 'mediarouter-v7'
dependencies {
- compile project(":support-appcompat-v7")
- compile project(":support-palette-v7")
+ api project(":support-appcompat-v7")
+ api project(":support-palette-v7")
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.test_rules
+ androidTestImplementation libs.test_rules
}
android {
diff --git a/v7/mediarouter/lint-baseline.xml b/v7/mediarouter/lint-baseline.xml
index fe44849..9ea4e70 100644
--- a/v7/mediarouter/lint-baseline.xml
+++ b/v7/mediarouter/lint-baseline.xml
@@ -1,38 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="MissingSuperCall"
@@ -46,186 +13,6 @@
</issue>
<issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
id="LongLogTag"
message="The logging tag can be at most 23 characters, was 24 (MediaRouteActionProvider)"
errorLine1=" Log.e(TAG, "onCreateActionView: this ActionProvider is already associated " +"
@@ -236,224 +23,4 @@
column="19"/>
</issue>
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="class MediaRouteExpandCollapseButton extends ImageButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/MediaRouteExpandCollapseButton.java"
- line="33"
- column="46"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
</issues>
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
index c04e284..f6dd214 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
index da4c296..6b7bdcd 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
index 9fd99dc..c7fe576 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
index 6be3008..0a5d6aa 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
index a5946ab..0aadfa3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
index 1c8a4e1..125fe0b 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
index 1ea1f71..05c48a7 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
index 3397f14..741e911 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
index 0c211e5..ae4218a 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
index 620ec69..8b30fab 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
index 4ac4f94..d7aa903 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
index aee1a31..f7e2f29 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
index 5e99a48..e7871e2 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
index d357a9f..8c57f63 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
index 7e23799..0041b01 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
index df0247d..6dbb694 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
index d49c09b..08e1013 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
index 924212a..5c352c3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
index 4df5079..70532e9 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
index dfaaef4..9c6ba30 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
index 8b2499e..9ba3b5f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
index 47482ab..bd4bb22 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
index 373aad0..2156127 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
index b8d035e..b417a9f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
index f813902..9bf633e 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
index 0952676..ba51811 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
index 3825e0a..756a53c 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
index c493860..4705dca 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
index 12da4da..50e4ea3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
index 5420e91..bc6724f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
index 8bb448e..9e3b410 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
index 6c7fb96..2f18abd 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
index e000188..de81133 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
index 2afcf5b..b80b191 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
index ead72cb..48aba3d 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
index 5e91f50..ca34d5b 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
index 1939ceb..e9957b3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
index 3d6105c..a5d384f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
index 4be02d4..ddc6297 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
index 1b18aad..28ab684 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
index 25afe1a..51e7f75 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
index 219ac25..4aa3ca3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
index 1ac72a3..9caecde 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
index 9b0645d..1b8d0b6 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
index 62308f2..400be3c 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
index 6bab08f..c14f1bf 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
new file mode 100644
index 0000000..4e18b46
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
new file mode 100644
index 0000000..c4c2c00
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
new file mode 100644
index 0000000..98fae44
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
new file mode 100644
index 0000000..d64c289
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
new file mode 100644
index 0000000..91f9327
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
new file mode 100644
index 0000000..f5e1f69
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
new file mode 100644
index 0000000..3e6fafd
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
new file mode 100644
index 0000000..ae2bd87
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
new file mode 100644
index 0000000..f73a1f8
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
new file mode 100644
index 0000000..78c1069
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
new file mode 100644
index 0000000..562b803
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
new file mode 100644
index 0000000..ddfba02
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
new file mode 100644
index 0000000..257f2d2
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
new file mode 100644
index 0000000..38f5478
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
new file mode 100644
index 0000000..f995af0
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
new file mode 100644
index 0000000..c50b7f0
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
index 7c8b5bc..f6dd214 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
index 85fe39c..6b7bdcd 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
index b904ed1..c7fe576 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
index 94bcad9..0a5d6aa 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
index 9c8f73d..0aadfa3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
index 70ecc18..125fe0b 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
index 9cc01b3..05c48a7 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
index 6dc67ec..741e911 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
index 8692da8..ae4218a 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
index 92061ac..8b30fab 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
index 93af29a..d7aa903 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
index 3535d6f..f7e2f29 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
index 7a17cdb..e7871e2 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
index 101207f..8c57f63 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
index 186133e..0041b01 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
index 1e3afe1..6dbb694 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
index 34cb511..08e1013 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
index 79f84ca..5c352c3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
index 736bad8..70532e9 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
index 0fe61a4..9c6ba30 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
index 22862e3..9ba3b5f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
index 6a310bd..bd4bb22 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
index 3eb3fb4..f3570f4 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
index 3bc4947..65a403e 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
index 58a6f9e..f644bfd 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
index f017cc6..c7d6048 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
index ef3f046..6e0d558 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
index cf52855..f3bc48d 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
index f701696..14d8f8e 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
index 26587e1..98b90e5 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
index 7d3342c..83234a7 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
index e6ea555..47d452f 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
index aa1f673..b81cf5a 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
index 5ad2aa3..20d08b4 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
index 4c412a8..6feb3f1 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
index b919359..e6ae8b3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
index a27e3d7..0b0fc08 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
index efe5264..c2a16ac 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
index a048045..a3598cc 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
index 8c31541..846d16d 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
index fbb59c5..2070455 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
index 0bf03e2..ae6db13 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
index 6cfa4c4..7f3828a 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
index 49f0f63..aaccc73 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
index 6fdd92f..5c8ced9 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
index 63fd45f..ad01b9e 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
new file mode 100644
index 0000000..ce31dd3
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
new file mode 100644
index 0000000..9ef78e4
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
new file mode 100644
index 0000000..a7c2cdb
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
new file mode 100644
index 0000000..e7c5bea
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
new file mode 100644
index 0000000..ecad0d4
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
new file mode 100644
index 0000000..5fa5923
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
new file mode 100644
index 0000000..f687e25
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
new file mode 100644
index 0000000..9c06db8
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
new file mode 100644
index 0000000..90225ba
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
new file mode 100644
index 0000000..19697de
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
new file mode 100644
index 0000000..d37ec21
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
new file mode 100644
index 0000000..21840bf
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
new file mode 100644
index 0000000..5445e3a
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
new file mode 100644
index 0000000..2337c65
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
new file mode 100644
index 0000000..f6dd214
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
new file mode 100644
index 0000000..6b7bdcd
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
index e3fcc5a..0db679e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
index 8915e73..51c6051 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
index 1f7c6a7..c083914 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
index e2f859a..c3c3caf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
index 5d7377d..fc444cf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
index e87e963..abd6377 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
index 5d98ca9..6dbd1da 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
index 5dd1728..d2e7108 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
index 5768bf6..d9f596b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
index 33dcad3..4f32e1a 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
index 03b6d06..c568e04 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
index 04de404..ed20dd9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
index b145e78..bbe39e7 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
index 7f6b343..1edc15f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
index f553b98..78aebaf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
index 3c6d7ec..b5a6a4f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
index bc96ec5..44b91ce 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
index 78d7707..85f66f9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
index 1fc99d3..51ea34b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
index cecbb05..952de04 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
index 85c3404..8b1aa21 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
index 9504282..534bcc0 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
index de5411f..f666b35 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
index 75ac2b5..145a8fb 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
index bc5016f..edeb132 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
index e80a01a..9da2b60 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
index d3bc15e..ab80aa9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
index 2aec231..115efe4 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
index 0dc7afa..8c0cc31 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
index f6b8124..e6ae6fc 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
index 428f2a5..b8816c9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
index 9b07aee..bd42931 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
index 92b87f3..10d5b7f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
index d3aa0ec..303a0fe 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
index c8f47f3..3c2a655 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
index 0ffd70c..90debc2 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
index bd6b74d..d3e78a7 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
index 5a5644a..3a3f991 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
index b9fcf3a..63fad9e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
index 41904df..d6dd8d4 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
index 7d765c3..890fd5f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
index 1b38bd1..6b0b5c1 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
index 1947769..9ce1ef1 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
index 6c01a5f..81710d4 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
index 5d84106..861c080 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
index c03c7f6..1c4aa21 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
new file mode 100644
index 0000000..59a6b30
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
new file mode 100644
index 0000000..c6e8fe0
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
new file mode 100644
index 0000000..57b840e
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
new file mode 100644
index 0000000..bf24050
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
new file mode 100644
index 0000000..01c18c1
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
new file mode 100644
index 0000000..be9753e
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
new file mode 100644
index 0000000..3f291b1
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
new file mode 100644
index 0000000..dc1c619
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
new file mode 100644
index 0000000..6504a70
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
new file mode 100644
index 0000000..a7e0a60
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
new file mode 100644
index 0000000..57b1f3e
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
new file mode 100644
index 0000000..5c551ec
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
new file mode 100644
index 0000000..238667e
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
new file mode 100644
index 0000000..ffb8183
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
new file mode 100644
index 0000000..4893f18
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
new file mode 100644
index 0000000..ac5e156
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
index 5e481fb..0db679e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
index c1ebe58..51c6051 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
index f3c8f71..c083914 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
index 9a16dda..c3c3caf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
index 17d29bb..fc444cf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
index 8e17432..abd6377 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
index 72aec70..6dbd1da 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
index b41b474..d2e7108 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
index 5a9aa0d..d9f596b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
index 9b7a3c7..4f32e1a 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
index b0bd59e..c568e04 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
index f9544ee..ed20dd9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
index 3543c84..bbe39e7 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
index 9ecc2e4..1edc15f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
index 63a5a16..78aebaf 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
index 8ae025a..b5a6a4f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
index 2e506e8..44b91ce 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
index 7c96cc5..85f66f9 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
index aeb7151..51ea34b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
index deb6756..952de04 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
index 4f679de..8b1aa21 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
index 54dbd70..534bcc0 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
index e971a46..1fffa01 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
index 7bb99d5..0ff7e57 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
index c7dd030..06ac4dc 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
index 1f081a0..42a86f5 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
index 9da3f8f..0301090 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
index 38b45ab..4396f0e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
index 6c05acb..e19001b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
index 0294d12..2271581 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
index 043096d..5e96208 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
index 9d9672a..0f69500 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
index 321e868..07e1bd6 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
index 7d8f491..cde8f19 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
index ecd6c23..b632e95 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
index 0eb016b..11d5d2e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
index b6d08aa..660d527 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
index 4df7118..2761ae1 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
index 653754a..0aa3f84 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
index cf62d75..27d166f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
index 4fa3be0..ebe527e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
index ca82881..aeb2a8e 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
index 86b20be..7337af5 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
index 74521d0..f3f31ef 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
index a646b60..20d9f57 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
index be0b12a..bf8eb77 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
new file mode 100644
index 0000000..56a0e14
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
new file mode 100644
index 0000000..67425e1
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
new file mode 100644
index 0000000..7c76e19
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
new file mode 100644
index 0000000..e02f1ed
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
new file mode 100644
index 0000000..f5fdcdd
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
new file mode 100644
index 0000000..8ce9b81
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
new file mode 100644
index 0000000..a29e443
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
new file mode 100644
index 0000000..349ca89
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
new file mode 100644
index 0000000..0fc75d5
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
new file mode 100644
index 0000000..5cbd27c
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
new file mode 100644
index 0000000..0ebb0ac
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
new file mode 100644
index 0000000..5b514aa
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
new file mode 100644
index 0000000..8e7fe5c
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
new file mode 100644
index 0000000..efb2c10
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
new file mode 100644
index 0000000..0db679e
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
new file mode 100644
index 0000000..51c6051
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable/mr_button_connected_dark.xml b/v7/mediarouter/res/drawable/mr_button_connected_dark.xml
index ddf8c91..c69ba33 100644
--- a/v7/mediarouter/res/drawable/mr_button_connected_dark.xml
+++ b/v7/mediarouter/res/drawable/mr_button_connected_dark.xml
@@ -40,4 +40,12 @@
<item android:drawable="@drawable/ic_mr_button_connected_20_dark" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connected_21_dark" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connected_22_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_23_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_24_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_25_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_26_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_27_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_28_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_29_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_30_dark" android:duration="42" />
</animation-list>
diff --git a/v7/mediarouter/res/drawable/mr_button_connected_light.xml b/v7/mediarouter/res/drawable/mr_button_connected_light.xml
index ba0434a..af7224b 100644
--- a/v7/mediarouter/res/drawable/mr_button_connected_light.xml
+++ b/v7/mediarouter/res/drawable/mr_button_connected_light.xml
@@ -40,4 +40,12 @@
<item android:drawable="@drawable/ic_mr_button_connected_20_light" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connected_21_light" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connected_22_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_23_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_24_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_25_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_26_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_27_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_28_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_29_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connected_30_light" android:duration="42" />
</animation-list>
diff --git a/v7/mediarouter/res/drawable/mr_button_connecting_dark.xml b/v7/mediarouter/res/drawable/mr_button_connecting_dark.xml
index ba3a673..697f17d 100644
--- a/v7/mediarouter/res/drawable/mr_button_connecting_dark.xml
+++ b/v7/mediarouter/res/drawable/mr_button_connecting_dark.xml
@@ -40,4 +40,12 @@
<item android:drawable="@drawable/ic_mr_button_connecting_20_dark" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connecting_21_dark" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connecting_22_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_23_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_24_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_25_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_26_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_27_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_28_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_29_dark" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_30_dark" android:duration="42" />
</animation-list>
diff --git a/v7/mediarouter/res/drawable/mr_button_connecting_light.xml b/v7/mediarouter/res/drawable/mr_button_connecting_light.xml
index c511782..07a135d 100644
--- a/v7/mediarouter/res/drawable/mr_button_connecting_light.xml
+++ b/v7/mediarouter/res/drawable/mr_button_connecting_light.xml
@@ -40,4 +40,12 @@
<item android:drawable="@drawable/ic_mr_button_connecting_20_light" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connecting_21_light" android:duration="42" />
<item android:drawable="@drawable/ic_mr_button_connecting_22_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_23_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_24_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_25_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_26_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_27_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_28_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_29_light" android:duration="42" />
+ <item android:drawable="@drawable/ic_mr_button_connecting_30_light" android:duration="42" />
</animation-list>
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 86f4753..4b9a17a 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -20,7 +20,6 @@
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY;
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY_PAUSE;
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_STOP;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import android.app.PendingIntent;
import android.content.ContentResolver;
@@ -40,6 +39,7 @@
import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
+import android.support.v4.util.ObjectsCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v7.app.OverlayListView.OverlayObject;
import android.support.v7.graphics.Palette;
@@ -1284,6 +1284,11 @@
}
@Override
+ public boolean isEnabled(int position) {
+ return false;
+ }
+
+ @Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
@@ -1444,8 +1449,8 @@
@Override
protected void onPostExecute(Bitmap art) {
mFetchArtTask = null;
- if (!objectEquals(mArtIconBitmap, mIconBitmap)
- || !objectEquals(mArtIconUri, mIconUri)) {
+ if (!ObjectsCompat.equals(mArtIconBitmap, mIconBitmap)
+ || !ObjectsCompat.equals(mArtIconUri, mIconUri)) {
mArtIconBitmap = mIconBitmap;
mArtIconLoadedBitmap = art;
mArtIconUri = mIconUri;
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouteProvider.java b/v7/mediarouter/src/android/support/v7/media/MediaRouteProvider.java
index 5467c40..99bcf21 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouteProvider.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouteProvider.java
@@ -17,7 +17,6 @@
package android.support.v7.media;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import android.content.ComponentName;
import android.content.Context;
@@ -27,6 +26,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
+import android.support.v4.util.ObjectsCompat;
import android.support.v7.media.MediaRouter.ControlRequestCallback;
/**
@@ -151,7 +151,7 @@
public final void setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
MediaRouter.checkCallingThread();
- if (objectEquals(mDiscoveryRequest, request)) {
+ if (ObjectsCompat.equals(mDiscoveryRequest, request)) {
return;
}
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouteProviderService.java b/v7/mediarouter/src/android/support/v7/media/MediaRouteProviderService.java
index d788a3c..faa211d 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouteProviderService.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouteProviderService.java
@@ -16,7 +16,6 @@
package android.support.v7.media;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
import static android.support.v7.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_ID;
import static android.support.v7.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_LIBRARY_GROUP;
import static android.support.v7.media.MediaRouteProviderProtocol.CLIENT_DATA_UNSELECT_REASON;
@@ -57,6 +56,7 @@
import android.os.Messenger;
import android.os.RemoteException;
import android.support.annotation.VisibleForTesting;
+import android.support.v4.util.ObjectsCompat;
import android.util.Log;
import android.util.SparseArray;
@@ -462,7 +462,7 @@
if (selectorBuilder != null) {
composite = new MediaRouteDiscoveryRequest(selectorBuilder.build(), activeScan);
}
- if (!objectEquals(mCompositeDiscoveryRequest, composite)) {
+ if (!ObjectsCompat.equals(mCompositeDiscoveryRequest, composite)) {
mCompositeDiscoveryRequest = composite;
mProvider.setDiscoveryRequest(composite);
return true;
@@ -612,7 +612,7 @@
}
public boolean setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- if (!objectEquals(mDiscoveryRequest, request)) {
+ if (!ObjectsCompat.equals(mDiscoveryRequest, request)) {
mDiscoveryRequest = request;
return updateCompositeDiscoveryRequest();
}
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
index cc5648f..5bc0bb4 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
@@ -1294,6 +1294,15 @@
&& !supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
}
+ /**
+ * Returns {@code true} if the route is selectable.
+ */
+ boolean isSelectable() {
+ // This tests whether the route is still valid and enabled.
+ // The route descriptor field is set to null when the route is removed.
+ return mDescriptor != null && mEnabled;
+ }
+
private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
@@ -2062,11 +2071,11 @@
return mRoutes;
}
- public List<ProviderInfo> getProviders() {
+ List<ProviderInfo> getProviders() {
return mProviders;
}
- public RouteInfo getDefaultRoute() {
+ @NonNull RouteInfo getDefaultRoute() {
if (mDefaultRoute == null) {
// This should never happen once the media router has been fully
// initialized but it is good to check for the error in case there
@@ -2077,11 +2086,11 @@
return mDefaultRoute;
}
- public RouteInfo getBluetoothRoute() {
+ RouteInfo getBluetoothRoute() {
return mBluetoothRoute;
}
- public RouteInfo getSelectedRoute() {
+ @NonNull RouteInfo getSelectedRoute() {
if (mSelectedRoute == null) {
// This should never happen once the media router has been fully
// initialized but it is good to check for the error in case there
@@ -2092,11 +2101,11 @@
return mSelectedRoute;
}
- public void selectRoute(RouteInfo route) {
+ void selectRoute(@NonNull RouteInfo route) {
selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
}
- public void selectRoute(RouteInfo route, int unselectReason) {
+ void selectRoute(@NonNull RouteInfo route, int unselectReason) {
if (!mRoutes.contains(route)) {
Log.w(TAG, "Ignoring attempt to select removed route: " + route);
return;
@@ -2445,14 +2454,14 @@
private void updateSelectedRouteIfNeeded(boolean selectedRouteDescriptorChanged) {
// Update default route.
- if (mDefaultRoute != null && !isRouteSelectable(mDefaultRoute)) {
+ if (mDefaultRoute != null && !mDefaultRoute.isSelectable()) {
Log.i(TAG, "Clearing the default route because it "
+ "is no longer selectable: " + mDefaultRoute);
mDefaultRoute = null;
}
if (mDefaultRoute == null && !mRoutes.isEmpty()) {
for (RouteInfo route : mRoutes) {
- if (isSystemDefaultRoute(route) && isRouteSelectable(route)) {
+ if (isSystemDefaultRoute(route) && route.isSelectable()) {
mDefaultRoute = route;
Log.i(TAG, "Found default route: " + mDefaultRoute);
break;
@@ -2461,14 +2470,14 @@
}
// Update bluetooth route.
- if (mBluetoothRoute != null && !isRouteSelectable(mBluetoothRoute)) {
+ if (mBluetoothRoute != null && !mBluetoothRoute.isSelectable()) {
Log.i(TAG, "Clearing the bluetooth route because it "
+ "is no longer selectable: " + mBluetoothRoute);
mBluetoothRoute = null;
}
if (mBluetoothRoute == null && !mRoutes.isEmpty()) {
for (RouteInfo route : mRoutes) {
- if (isSystemLiveAudioOnlyRoute(route) && isRouteSelectable(route)) {
+ if (isSystemLiveAudioOnlyRoute(route) && route.isSelectable()) {
mBluetoothRoute = route;
Log.i(TAG, "Found bluetooth route: " + mBluetoothRoute);
break;
@@ -2477,16 +2486,9 @@
}
// Update selected route.
- if (mSelectedRoute != null && !isRouteSelectable(mSelectedRoute)) {
+ if (mSelectedRoute == null || !mSelectedRoute.isSelectable()) {
Log.i(TAG, "Unselecting the current route because it "
+ "is no longer selectable: " + mSelectedRoute);
- setSelectedRouteInternal(null,
- MediaRouter.UNSELECT_REASON_UNKNOWN);
- }
- if (mSelectedRoute == null) {
- // Choose a new route.
- // This will have the side-effect of updating the playback info when
- // the new route is selected.
setSelectedRouteInternal(chooseFallbackRoute(),
MediaRouter.UNSELECT_REASON_UNKNOWN);
} else if (selectedRouteDescriptorChanged) {
@@ -2535,7 +2537,7 @@
for (RouteInfo route : mRoutes) {
if (route != mDefaultRoute
&& isSystemLiveAudioOnlyRoute(route)
- && isRouteSelectable(route)) {
+ && route.isSelectable()) {
return route;
}
}
@@ -2548,21 +2550,15 @@
&& !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
}
- private boolean isRouteSelectable(RouteInfo route) {
- // This tests whether the route is still valid and enabled.
- // The route descriptor field is set to null when the route is removed.
- return route.mDescriptor != null && route.mEnabled;
- }
-
private boolean isSystemDefaultRoute(RouteInfo route) {
return route.getProviderInstance() == mSystemProvider
&& route.mDescriptorId.equals(
SystemMediaRouteProvider.DEFAULT_ROUTE_ID);
}
- private void setSelectedRouteInternal(RouteInfo route, int unselectReason) {
+ private void setSelectedRouteInternal(@NonNull RouteInfo route, int unselectReason) {
// TODO: Remove the following logging when no longer needed.
- if (sGlobal == null || mBluetoothRoute != null && route != null && route.isDefault()) {
+ if (sGlobal == null || mBluetoothRoute != null && route.isDefault()) {
final StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
StringBuffer sb = new StringBuffer();
// callStack[3] is the caller of this method.
@@ -2603,28 +2599,25 @@
}
mSelectedRoute = route;
+ mSelectedRouteController = route.getProviderInstance().onCreateRouteController(
+ route.mDescriptorId);
+ if (mSelectedRouteController != null) {
+ mSelectedRouteController.onSelect();
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Route selected: " + mSelectedRoute);
+ }
+ mCallbackHandler.post(CallbackHandler.MSG_ROUTE_SELECTED, mSelectedRoute);
- if (mSelectedRoute != null) {
- mSelectedRouteController = route.getProviderInstance().onCreateRouteController(
- route.mDescriptorId);
- if (mSelectedRouteController != null) {
- mSelectedRouteController.onSelect();
- }
- if (DEBUG) {
- Log.d(TAG, "Route selected: " + mSelectedRoute);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_SELECTED, mSelectedRoute);
-
- if (mSelectedRoute instanceof RouteGroup) {
- List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
- mRouteControllerMap.clear();
- for (RouteInfo r : routes) {
- RouteController controller =
- r.getProviderInstance().onCreateRouteController(
- r.mDescriptorId, mSelectedRoute.mDescriptorId);
- controller.onSelect();
- mRouteControllerMap.put(r.mDescriptorId, controller);
- }
+ if (mSelectedRoute instanceof RouteGroup) {
+ List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
+ mRouteControllerMap.clear();
+ for (RouteInfo r : routes) {
+ RouteController controller =
+ r.getProviderInstance().onCreateRouteController(
+ r.mDescriptorId, mSelectedRoute.mDescriptorId);
+ controller.onSelect();
+ mRouteControllerMap.put(r.mDescriptorId, controller);
}
}
diff --git a/v7/mediarouter/src/android/support/v7/media/RemotePlaybackClient.java b/v7/mediarouter/src/android/support/v7/media/RemotePlaybackClient.java
index 045b69b..fb05ac7 100644
--- a/v7/mediarouter/src/android/support/v7/media/RemotePlaybackClient.java
+++ b/v7/mediarouter/src/android/support/v7/media/RemotePlaybackClient.java
@@ -15,8 +15,6 @@
*/
package android.support.v7.media;
-import static android.support.v4.utils.ObjectUtils.objectEquals;
-
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -24,6 +22,7 @@
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.util.ObjectsCompat;
import android.util.Log;
/**
@@ -204,7 +203,7 @@
* @param sessionId The new session id, or null if none.
*/
public void setSessionId(String sessionId) {
- if (!objectEquals(mSessionId, sessionId)) {
+ if (!ObjectsCompat.equals(mSessionId, sessionId)) {
if (DEBUG) {
Log.d(TAG, "Session id is now: " + sessionId);
}
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index 6ab7995..915ef13 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -2,10 +2,10 @@
archivesBaseName = 'palette-v7'
dependencies {
- compile project(':support-compat')
- compile project(':support-core-utils')
+ api project(':support-compat')
+ api project(':support-core-utils')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
}
diff --git a/v7/palette/lint-baseline.xml b/v7/palette/lint-baseline.xml
index 172bbf6..e961253 100644
--- a/v7/palette/lint-baseline.xml
+++ b/v7/palette/lint-baseline.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index a7ad709..3f81093 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -18,18 +18,18 @@
archivesBaseName = 'preference-v7'
dependencies {
- compile project(':support-v4')
- compile project(':support-appcompat-v7')
- compile project(':support-recyclerview-v7')
+ api project(':support-v4')
+ api project(':support-appcompat-v7')
+ api project(':support-recyclerview-v7')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/v7/preference/lint-baseline.xml b/v7/preference/lint-baseline.xml
index eee7674..22b46d6 100644
--- a/v7/preference/lint-baseline.xml
+++ b/v7/preference/lint-baseline.xml
@@ -1,119 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by LocationManager.getLastKnownLocation: android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION"
- errorLine1=" return mLocationManager.getLastKnownLocation(provider);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/TwilightManager.java"
- line="128"
- column="28"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="1604"
- column="29"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.onAnimationEnd`"
- errorLine1=" public void onAnimationEnd(Animation animation) {"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/app/FragmentManager.java"
- line="3935"
- column="21"/>
- </issue>
-
- <issue
- id="MissingSuperCall"
- message="Overriding method should call `super.draw`"
- errorLine1=" public void draw(Canvas canvas) {"
- errorLine2=" ~~~~">
- <location
- file="src/android/support/v7/widget/ViewStubCompat.java"
- line="151"
- column="17"/>
- </issue>
-
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/image`, already defined earlier in this layout"
- errorLine1=" <ImageView android:id="@+id/image""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="62"
- column="20"/>
- <location
- file="res/layout/abc_activity_chooser_view.xml"
- line="40"
- column="20"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type anim"
- errorLine1=" parser = resources.getAnimation(id);"
- errorLine2=" ~~">
- <location
- file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
- line="130"
- column="45"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type xml"
- errorLine1=" final XmlPullParser parser = res.getXml(resId);"
- errorLine2=" ~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="347"
- column="61"/>
- </issue>
-
- <issue
- id="ResourceType"
- message="Expected resource of type layout"
- errorLine1=" parser = mContext.getResources().getLayout(menuRes);"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/view/SupportMenuInflater.java"
- line="123"
- column="56"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildHeight,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="868"
- column="61"/>
- </issue>
-
- <issue
- id="Range"
- message="Value must be ≥ 0 (was -2147483648)"
- errorLine1=" MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/LinearLayoutCompat.java"
- line="1286"
- column="61"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="Suspicious0dp"
@@ -137,323 +23,4 @@
column="9"/>
</issue>
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="62"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set home-as-up indicator");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="67"
- column="19"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 30 (ActionBarDrawerToggleHoneycomb)"
- errorLine1=" Log.w(TAG, "Couldn't set content description via JB-MR2 API", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java"
- line="87"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[loadDrawableFromDelegates] Skipping drawable: ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="315"
- column="31"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Returning cached drawable: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="337"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.i(TAG, "[loadDrawableFromDelegates] Saved drawable to cache: " +"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="372"
- column="35"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.e(TAG, "Exception while inflating drawable", e);"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="377"
- column="27"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "[tintDrawableUsingColorFilter] Tinted ""
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="482"
- column="23"/>
- </issue>
-
- <issue
- id="LongLogTag"
- message="The logging tag can be at most 23 characters, was 24 (AppCompatDrawableManager)"
- errorLine1=" Log.d(TAG, "Mutated drawable is not the same instance as the input.");"
- errorLine2=" ~~~">
- <location
- file="src/android/support/v7/widget/AppCompatDrawableManager.java"
- line="698"
- column="19"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatAutoCompleteTextView` instead"
- errorLine1="public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatAutoCompleteTextView.java"
- line="49"
- column="52"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatButton` instead"
- errorLine1="public class AppCompatButton extends Button implements TintableBackgroundView {"
- errorLine2=" ~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="51"
- column="38"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckBox` instead"
- errorLine1="public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckBox.java"
- line="49"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatCheckedTextView` instead"
- errorLine1="public class AppCompatCheckedTextView extends CheckedTextView {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatCheckedTextView.java"
- line="33"
- column="47"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatEditText` instead"
- errorLine1="public class AppCompatEditText extends EditText implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatEditText.java"
- line="48"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageButton` instead"
- errorLine1="public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageButton.java"
- line="58"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class AppCompatImageView extends ImageView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatImageView.java"
- line="57"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatMultiAutoCompleteTextView` instead"
- errorLine1="public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java"
- line="49"
- column="57"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRadioButton` instead"
- errorLine1="public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRadioButton.java"
- line="49"
- column="43"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatRatingBar` instead"
- errorLine1="public class AppCompatRatingBar extends RatingBar {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatRatingBar.java"
- line="34"
- column="41"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSeekBar` instead"
- errorLine1="public class AppCompatSeekBar extends SeekBar {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSeekBar.java"
- line="34"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatSpinner` instead"
- errorLine1="public class AppCompatSpinner extends Spinner implements TintableBackgroundView {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatSpinner.java"
- line="68"
- column="39"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class AppCompatTextView extends TextView implements TintableBackgroundView,"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="60"
- column="40"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="class CircleImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/CircleImageView.java"
- line="38"
- column="31"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatTextView` instead"
- errorLine1="public class DialogTitle extends TextView {"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/android/support/v7/widget/DialogTitle.java"
- line="37"
- column="34"/>
- </issue>
-
- <issue
- id="AppCompatCustomView"
- message="This custom view should extend `android.support.v7.widget.AppCompatImageView` instead"
- errorLine1="public class PreferenceImageView extends ImageView {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/android/support/v7/internal/widget/PreferenceImageView.java"
- line="33"
- column="42"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT, PixelFormat.TRANSPARENT, PixelFormat.OPAQUE"
- errorLine1=" return 0;"
- errorLine2=" ~">
- <location
- file="src/android/support/v7/widget/ActionBarBackgroundDrawable.java"
- line="59"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
- errorLine1=" setDisplayOptions(options, 0xffffffff);"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/android/support/v7/app/ToolbarActionBar.java"
- line="254"
- column="36"/>
- </issue>
-
</issues>
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index 2c8bef3..06cdc53 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -2,24 +2,24 @@
archivesBaseName = 'recyclerview-v7'
dependencies {
- compile project(':support-annotations')
- compile project(':support-compat')
- compile project(':support-core-ui')
+ api project(':support-annotations')
+ api project(':support-compat')
+ api project(':support-core-ui')
- androidTestCompile (libs.test_runner) {
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.junit
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
- androidTestCompile project(':support-testutils')
+ androidTestImplementation libs.junit
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation project(':support-testutils')
- testCompile libs.junit
- testCompile libs.mockito_core
- testCompile ("$libs.test_runner") {
+ testImplementation libs.junit
+ testImplementation libs.mockito_core
+ testImplementation ("$libs.test_runner") {
exclude module: 'support-annotations'
}
}
diff --git a/v7/recyclerview/lint-baseline.xml b/v7/recyclerview/lint-baseline.xml
index 493c8c5..e961253 100644
--- a/v7/recyclerview/lint-baseline.xml
+++ b/v7/recyclerview/lint-baseline.xml
@@ -1,15 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
+<issues format="4" by="lint 3.0.0-alpha7">
</issues>
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 33c706f..ff8e0e6 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -1033,7 +1033,6 @@
// bail out if layout is frozen
setLayoutFrozen(false);
setAdapterInternal(adapter, true, removeAndRecycleExistingViews);
- setDataSetChangedAfterLayout();
requestLayout();
}
/**
@@ -1102,7 +1101,7 @@
}
mRecycler.onAdapterChanged(oldAdapter, mAdapter, compatibleWithPrevious);
mState.mStructureChanged = true;
- markKnownViewsInvalid();
+ setDataSetChangedAfterLayout();
}
/**
@@ -3150,7 +3149,7 @@
// adapter change, two onMeasure() calls can happen if RV is a child of LinearLayout
// with layout_width=MATCH_PARENT. RV cannot call LM.onMeasure() second time
// because getViewForPosition() will crash when LM uses a child to measure.
- defaultOnMeasure(widthSpec, heightSpec);
+ setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
return;
}
@@ -4237,8 +4236,8 @@
/**
* Call this method to signal that *all* adapter content has changed (generally, because of
- * swapAdapter, or notifyDataSetChanged), and that once layout occurs, all attached items should
- * be discarded or animated.
+ * setAdapter, swapAdapter, or notifyDataSetChanged), and that once layout occurs, all
+ * attached items should be discarded or animated.
*
* Attached items are labeled as invalid, and all cached items are discarded.
*
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
index 90e0536..2139497 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
@@ -845,7 +845,7 @@
mLayoutParams = layoutParams;
}
- private void addItems(int pos, int count, String prefix) {
+ void addItems(int pos, int count, String prefix) {
for (int i = 0; i < count; i++, pos++) {
mItems.add(pos, new Item(pos, prefix));
}
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
index 1547049..42fde85 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
@@ -252,7 +252,53 @@
}
@Test
- public void preditiveMeasuredCrashTest() throws Throwable {
+ public void setAdapterNotifyItemRangeInsertedCrashTest() throws Throwable {
+ final RecyclerView rv = new RecyclerView(getActivity());
+ final TestLayoutManager lm = new LayoutAllLayoutManager(true);
+ lm.setSupportsPredictive(true);
+ rv.setLayoutManager(lm);
+ setRecyclerView(rv);
+ lm.expectLayouts(1);
+ setAdapter(new TestAdapter(1));
+ lm.waitForLayout(2);
+ lm.expectLayouts(1);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final TestAdapter adapter2 = new TestAdapter(0);
+ rv.setAdapter(adapter2);
+ adapter2.addItems(0, 1, "1");
+ adapter2.notifyItemRangeInserted(0, 1);
+ }
+ });
+ lm.waitForLayout(2);
+ }
+
+ @Test
+ public void swapAdapterNotifyItemRangeInsertedCrashTest() throws Throwable {
+ final RecyclerView rv = new RecyclerView(getActivity());
+ final TestLayoutManager lm = new LayoutAllLayoutManager(true);
+ lm.setSupportsPredictive(true);
+ rv.setLayoutManager(lm);
+ setRecyclerView(rv);
+ lm.expectLayouts(1);
+ setAdapter(new TestAdapter(1));
+ lm.waitForLayout(2);
+ lm.expectLayouts(1);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final TestAdapter adapter2 = new TestAdapter(0);
+ rv.swapAdapter(adapter2, true);
+ adapter2.addItems(0, 1, "1");
+ adapter2.notifyItemRangeInserted(0, 1);
+ }
+ });
+ lm.waitForLayout(2);
+ }
+
+ @Test
+ public void predictiveMeasuredCrashTest() throws Throwable {
final RecyclerView rv = new RecyclerView(getActivity());
final LayoutAllLayoutManager lm = new LayoutAllLayoutManager(true) {
@Override
diff --git a/wear/build.gradle b/wear/build.gradle
index d81f84e..1e39dfc 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -2,18 +2,19 @@
archivesBaseName = 'wear'
dependencies {
- compile project(':support-annotations')
- compile project(':support-core-ui')
- compile project(':support-percent')
- compile project(':support-recyclerview-v7')
- androidTestCompile (libs.test_runner) {
+ api project(':support-annotations')
+ api project(':support-core-ui')
+ api project(':support-percent')
+ api project(':support-recyclerview-v7')
+
+ androidTestImplementation (libs.test_runner) {
exclude module: 'support-annotations'
}
- androidTestCompile (libs.espresso_core) {
+ androidTestImplementation (libs.espresso_core) {
exclude module: 'support-annotations'
}
- androidTestCompile libs.mockito_core
- androidTestCompile libs.dexmaker_mockito
+ androidTestImplementation libs.mockito_core
+ androidTestImplementation libs.dexmaker_mockito
}
android {
diff --git a/wear/lint-baseline.xml b/wear/lint-baseline.xml
index 962399c..81531cf 100644
--- a/wear/lint-baseline.xml
+++ b/wear/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 2.4.0-alpha6">
+<issues format="4" by="lint 3.0.0-alpha7">
<issue
id="DuplicateIds"
@@ -27,15 +27,4 @@
column="51"/>
</issue>
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
</issues>