Merge "Update core-ui to remove unneeded code."
diff --git a/annotations/src/android/support/annotation/ColorLong.java b/annotations/src/android/support/annotation/ColorLong.java
new file mode 100644
index 0000000..bb78138
--- /dev/null
+++ b/annotations/src/android/support/annotation/ColorLong.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * <p>Denotes that the annotated element represents a packed color
+ * long. If applied to a long array, every element in the array
+ * represents a color long. For more information on how colors
+ * are packed in a long, please refer to the documentation of
+ * the {@link android.graphics.Color} class.</p>
+ *
+ * <p>Example:</p>
+ *
+ * <pre>{@code
+ * public void setFillColor(@ColorLong long color);
+ * }</pre>
+ *
+ * @see android.graphics.Color
+ */
+@Retention(SOURCE)
+@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD})
+public @interface ColorLong {
+}
diff --git a/api/current.txt b/api/current.txt
index 6509469..9fa42ed 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4219,6 +4219,7 @@
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);
@@ -4482,6 +4483,7 @@
method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
method public abstract boolean isAddToBackStackAllowed();
method public abstract boolean isEmpty();
+ method public abstract android.support.v4.app.FragmentTransaction postOnCommit(java.lang.Runnable);
method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
@@ -4553,6 +4555,7 @@
method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
method public static int getActionCount(android.app.Notification);
method public static java.lang.String getCategory(android.app.Notification);
+ method public static java.lang.String getChannel(android.app.Notification);
method public static android.os.Bundle getExtras(android.app.Notification);
method public static java.lang.String getGroup(android.app.Notification);
method public static boolean getLocalOnly(android.app.Notification);
@@ -4702,6 +4705,7 @@
method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+ method public android.support.v4.app.NotificationCompat.Builder setChannel(java.lang.String);
method public android.support.v4.app.NotificationCompat.Builder setColor(int);
method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
index ae23f03..7c6b6ce 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
@@ -26,6 +26,7 @@
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.maven.MavenDeployer
+import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.tasks.Upload
import org.gradle.api.tasks.bundling.Jar
@@ -84,6 +85,13 @@
uploadTask.getRepositories().withType(MavenDeployer.class, new Action<MavenDeployer>() {
@Override
public void execute(MavenDeployer mavenDeployer) {
+ ExtraPropertiesExtension ext = project.getRootProject().getExtensions()
+ .findByType(ExtraPropertiesExtension.class);
+ URI uri = project.uri(ext.get("supportRepoOut"));
+ Map<String, Object> repo = new HashMap<String, Object>();
+ repo.put("url", uri);
+ mavenDeployer.repository(repo);
+
mavenDeployer.getPom().project {
name supportLibraryExtension.getName()
description supportLibraryExtension.getDescription()
diff --git a/compat/api24/android/support/v4/app/NotificationCompatApi24.java b/compat/api24/android/support/v4/app/NotificationCompatApi24.java
index 7126665..12faa8e 100644
--- a/compat/api24/android/support/v4/app/NotificationCompatApi24.java
+++ b/compat/api24/android/support/v4/app/NotificationCompatApi24.java
@@ -113,25 +113,7 @@
@Override
public void addAction(NotificationCompatBase.Action action) {
- Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
- action.getIcon(), action.getTitle(), action.getActionIntent());
- if (action.getRemoteInputs() != null) {
- for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
- action.getRemoteInputs())) {
- actionBuilder.addRemoteInput(remoteInput);
- }
- }
- Bundle actionExtras;
- if (action.getExtras() != null) {
- actionExtras = new Bundle(action.getExtras());
- } else {
- actionExtras = new Bundle();
- }
- actionExtras.putBoolean(NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES,
- action.getAllowGeneratedReplies());
- actionBuilder.addExtras(actionExtras);
- actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());
- b.addAction(actionBuilder.build());
+ NotificationCompatApi24.addAction(b, action);
}
@Override
@@ -161,4 +143,26 @@
}
style.setBuilder(b.getBuilder());
}
+
+ public static void addAction(Notification.Builder b, NotificationCompatBase.Action action) {
+ Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
+ action.getIcon(), action.getTitle(), action.getActionIntent());
+ if (action.getRemoteInputs() != null) {
+ for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
+ action.getRemoteInputs())) {
+ actionBuilder.addRemoteInput(remoteInput);
+ }
+ }
+ Bundle actionExtras;
+ if (action.getExtras() != null) {
+ actionExtras = new Bundle(action.getExtras());
+ } else {
+ actionExtras = new Bundle();
+ }
+ actionExtras.putBoolean(NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES,
+ action.getAllowGeneratedReplies());
+ actionBuilder.addExtras(actionExtras);
+ actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());
+ b.addAction(actionBuilder.build());
+ }
}
diff --git a/compat/api24/android/support/v4/view/ViewCompatApi24.java b/compat/api24/android/support/v4/view/ViewCompatApi24.java
index f4193c1..924466f 100644
--- a/compat/api24/android/support/v4/view/ViewCompatApi24.java
+++ b/compat/api24/android/support/v4/view/ViewCompatApi24.java
@@ -25,4 +25,12 @@
public static void setPointerIcon(View view, Object pointerIcon) {
view.setPointerIcon((PointerIcon)pointerIcon);
}
+
+ public static void dispatchStartTemporaryDetach(View view) {
+ view.dispatchStartTemporaryDetach();
+ }
+
+ public static void dispatchFinishTemporaryDetach(View view) {
+ view.dispatchFinishTemporaryDetach();
+ }
}
diff --git a/compat/api26/android/support/v4/app/NotificationCompatApi26.java b/compat/api26/android/support/v4/app/NotificationCompatApi26.java
new file mode 100644
index 0000000..b6acd04
--- /dev/null
+++ b/compat/api26/android/support/v4/app/NotificationCompatApi26.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.support.annotation.RequiresApi;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
+
+@RequiresApi(26)
+class NotificationCompatApi26 {
+ public static class Builder implements NotificationBuilderWithBuilderAccessor,
+ NotificationBuilderWithActions {
+ private Notification.Builder mB;
+
+ Builder(Context context, Notification n,
+ CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
+ RemoteViews tickerView, int number,
+ PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
+ int progressMax, int progress, boolean progressIndeterminate, boolean showWhen,
+ boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
+ String category, ArrayList<String> people, Bundle extras, int color,
+ int visibility, Notification publicVersion, String groupKey, boolean groupSummary,
+ String sortKey, CharSequence[] remoteInputHistory, RemoteViews contentView,
+ RemoteViews bigContentView, RemoteViews headsUpContentView,
+ String channelId) {
+ mB = new Notification.Builder(context)
+ .setWhen(n.when)
+ .setShowWhen(showWhen)
+ .setSmallIcon(n.icon, n.iconLevel)
+ .setContent(n.contentView)
+ .setTicker(n.tickerText, tickerView)
+ .setSound(n.sound, n.audioStreamType)
+ .setVibrate(n.vibrate)
+ .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
+ .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
+ .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
+ .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
+ .setDefaults(n.defaults)
+ .setContentTitle(contentTitle)
+ .setContentText(contentText)
+ .setSubText(subText)
+ .setContentInfo(contentInfo)
+ .setContentIntent(contentIntent)
+ .setDeleteIntent(n.deleteIntent)
+ .setFullScreenIntent(fullScreenIntent,
+ (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
+ .setLargeIcon(largeIcon)
+ .setNumber(number)
+ .setUsesChronometer(useChronometer)
+ .setPriority(priority)
+ .setProgress(progressMax, progress, progressIndeterminate)
+ .setLocalOnly(localOnly)
+ .setExtras(extras)
+ .setGroup(groupKey)
+ .setGroupSummary(groupSummary)
+ .setSortKey(sortKey)
+ .setCategory(category)
+ .setColor(color)
+ .setVisibility(visibility)
+ .setPublicVersion(publicVersion)
+ .setRemoteInputHistory(remoteInputHistory)
+ .setChannel(channelId);
+ if (contentView != null) {
+ mB.setCustomContentView(contentView);
+ }
+ if (bigContentView != null) {
+ mB.setCustomBigContentView(bigContentView);
+ }
+ if (headsUpContentView != null) {
+ mB.setCustomHeadsUpContentView(headsUpContentView);
+ }
+ for (String person : people) {
+ mB.addPerson(person);
+ }
+ }
+
+ @Override
+ public void addAction(NotificationCompatBase.Action action) {
+ NotificationCompatApi24.addAction(mB, action);
+ }
+
+ @Override
+ public Notification.Builder getBuilder() {
+ return mB;
+ }
+
+ @Override
+ public Notification build() {
+ return mB.build();
+ }
+ }
+
+ public static String getChannel(Notification n) {
+ return n.getChannel();
+ }
+}
diff --git a/compat/build.gradle b/compat/build.gradle
index 99818e9..d5e6aee 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -51,12 +51,3 @@
inceptionYear '2015'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/compat/java/android/support/v4/app/NotificationCompat.java b/compat/java/android/support/v4/app/NotificationCompat.java
index 492d0fd..6e79394b 100644
--- a/compat/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/java/android/support/v4/app/NotificationCompat.java
@@ -31,6 +31,7 @@
import android.os.Parcelable;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
import android.support.v4.os.BuildCompat;
import android.support.v4.view.GravityCompat;
@@ -508,6 +509,7 @@
NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
+ String getChannel(Notification n);
}
/**
@@ -604,6 +606,11 @@
RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
return null;
}
+
+ @Override
+ public String getChannel(Notification n) {
+ return null;
+ }
}
static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
@@ -631,6 +638,7 @@
}
}
+ @RequiresApi(16)
static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
@Override
public Notification build(Builder b, BuilderExtender extender) {
@@ -702,6 +710,7 @@
}
}
+ @RequiresApi(19)
static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
@Override
public Notification build(Builder b, BuilderExtender extender) {
@@ -754,6 +763,7 @@
}
}
+ @RequiresApi(20)
static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
@Override
public Notification build(Builder b, BuilderExtender extender) {
@@ -812,6 +822,7 @@
}
}
+ @RequiresApi(21)
static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
@Override
public Notification build(Builder b, BuilderExtender extender) {
@@ -851,6 +862,7 @@
}
}
+ @RequiresApi(24)
static class NotificationCompatImplApi24 extends NotificationCompatImplApi21 {
@Override
public Notification build(Builder b,
@@ -873,6 +885,34 @@
}
}
+ @RequiresApi(26)
+ static class NotificationCompatImplApi26 extends NotificationCompatImplApi24 {
+ @Override
+ public Notification build(Builder b,
+ BuilderExtender extender) {
+ NotificationCompatApi26.Builder builder = new NotificationCompatApi26.Builder(
+ b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+ b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+ b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
+ b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
+ b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
+ b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mRemoteInputHistory, b.mContentView,
+ b.mBigContentView, b.mHeadsUpContentView, b.mChannelId);
+ addActionsToBuilder(builder, b.mActions);
+ addStyleToBuilderApi24(builder, b.mStyle);
+ Notification notification = extender.build(b, builder);
+ if (b.mStyle != null) {
+ b.mStyle.addCompatExtras(getExtras(notification));
+ }
+ return notification;
+ }
+
+ @Override
+ public String getChannel(Notification n) {
+ return NotificationCompatApi26.getChannel(n);
+ }
+ }
+
static void addActionsToBuilder(NotificationBuilderWithActions builder,
ArrayList<Action> actions) {
for (Action action : actions) {
@@ -880,6 +920,7 @@
}
}
+ @RequiresApi(16)
static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
Style style) {
if (style != null) {
@@ -910,6 +951,7 @@
}
}
+ @RequiresApi(24)
static void addStyleToBuilderApi24(NotificationBuilderWithBuilderAccessor builder,
Style style) {
if (style != null) {
@@ -938,7 +980,9 @@
}
static {
- if (BuildCompat.isAtLeastN()) {
+ if (BuildCompat.isAtLeastO()) {
+ IMPL = new NotificationCompatImplApi26();
+ } else if (Build.VERSION.SDK_INT >= 24) {
IMPL = new NotificationCompatImplApi24();
} else if (Build.VERSION.SDK_INT >= 21) {
IMPL = new NotificationCompatImplApi21();
@@ -1043,6 +1087,7 @@
RemoteViews mContentView;
RemoteViews mBigContentView;
RemoteViews mHeadsUpContentView;
+ String mChannelId;
/** @hide */
@RestrictTo(LIBRARY_GROUP)
@@ -1721,6 +1766,16 @@
}
/**
+ * Specifies the channel the notification should be delivered on.
+ *
+ * No-op on versions prior to {@link android.os.Build.VERSION_CODES#O} .
+ */
+ public Builder setChannel(String channelId) {
+ mChannelId = channelId;
+ return this;
+ }
+
+ /**
* Apply an extender to this notification builder. Extenders may be used to add
* metadata or change options on this builder.
*/
@@ -2147,7 +2202,7 @@
public static MessagingStyle extractMessagingStyleFromNotification(Notification notif) {
MessagingStyle style;
Bundle extras = IMPL.getExtras(notif);
- if (!extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) {
+ if (extras != null && !extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) {
style = null;
} else {
try {
@@ -4168,4 +4223,11 @@
public static String getSortKey(Notification notif) {
return IMPL.getSortKey(notif);
}
+
+ /**
+ * @return the ID of the channel this notification posts to.
+ */
+ public static String getChannel(Notification n) {
+ return IMPL.getChannel(n);
+ }
}
diff --git a/compat/java/android/support/v4/view/ViewCompat.java b/compat/java/android/support/v4/view/ViewCompat.java
index 4300cd8..215df5b 100644
--- a/compat/java/android/support/v4/view/ViewCompat.java
+++ b/compat/java/android/support/v4/view/ViewCompat.java
@@ -1817,6 +1817,16 @@
static class Api24ViewCompatImpl extends MarshmallowViewCompatImpl {
@Override
+ public void dispatchStartTemporaryDetach(View view) {
+ ViewCompatApi24.dispatchStartTemporaryDetach(view);
+ }
+
+ @Override
+ public void dispatchFinishTemporaryDetach(View view) {
+ ViewCompatApi24.dispatchFinishTemporaryDetach(view);
+ }
+
+ @Override
public void setPointerIcon(View view, PointerIconCompat pointerIconCompat) {
ViewCompatApi24.setPointerIcon(view,
pointerIconCompat != null ? pointerIconCompat.getPointerIcon() : null);
diff --git a/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java b/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
index 820b3d0..4c61a47 100644
--- a/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
+++ b/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
@@ -296,21 +296,24 @@
RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
synchronized (sActionsLock) {
try {
- Object actionObject = getActionObjectsLocked(notif)[actionIndex];
- Bundle actionExtras = null;
- Bundle extras = getExtras(notif);
- if (extras != null) {
- SparseArray<Bundle> actionExtrasMap = extras.getSparseParcelableArray(
- EXTRA_ACTION_EXTRAS);
- if (actionExtrasMap != null) {
- actionExtras = actionExtrasMap.get(actionIndex);
+ Object[] actionObjects = getActionObjectsLocked(notif);
+ if (actionObjects != null) {
+ Object actionObject = actionObjects[actionIndex];
+ Bundle actionExtras = null;
+ Bundle extras = getExtras(notif);
+ if (extras != null) {
+ SparseArray<Bundle> actionExtrasMap = extras.getSparseParcelableArray(
+ EXTRA_ACTION_EXTRAS);
+ if (actionExtrasMap != null) {
+ actionExtras = actionExtrasMap.get(actionIndex);
+ }
}
+ return readAction(factory, remoteInputFactory,
+ sActionIconField.getInt(actionObject),
+ (CharSequence) sActionTitleField.get(actionObject),
+ (PendingIntent) sActionIntentField.get(actionObject),
+ actionExtras);
}
- return readAction(factory, remoteInputFactory,
- sActionIconField.getInt(actionObject),
- (CharSequence) sActionTitleField.get(actionObject),
- (PendingIntent) sActionIntentField.get(actionObject),
- actionExtras);
} catch (IllegalAccessException e) {
Log.e(TAG, "Unable to access notification actions", e);
sActionsAccessFailed = true;
diff --git a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
index 19ab555..90d0ba7 100644
--- a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
+++ b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
@@ -18,20 +18,40 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import android.app.Notification;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.os.BuildCompat;
import org.junit.Test;
import org.junit.runner.RunWith;
-
@RunWith(AndroidJUnit4.class)
-public class NotificationCompatTest {
+@SmallTest
+public class NotificationCompatTest extends BaseInstrumentationTestCase<TestSupportActivity> {
- @SmallTest
+ public NotificationCompatTest() {
+ super(TestSupportActivity.class);
+ }
+
+ @Test
+ public void testNotificationChannel() throws Throwable {
+ String channelId = "new ID";
+ Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+ .setChannel(channelId)
+ .build();
+ if (BuildCompat.isAtLeastO()) {
+ assertEquals(channelId, NotificationCompat.getChannel(n));
+ } else {
+ assertNull(NotificationCompat.getChannel(n));
+ }
+ }
+
@Test
public void testNotificationActionBuilder_copiesRemoteInputs() throws Throwable {
NotificationCompat.Action a = newActionBuilder()
@@ -42,7 +62,6 @@
assertSame(a.getRemoteInputs()[0], aCopy.getRemoteInputs()[0]);
}
- @SmallTest
@Test
public void testNotificationActionBuilder_copiesAllowGeneratedReplies() throws Throwable {
NotificationCompat.Action a = newActionBuilder()
@@ -53,7 +72,6 @@
assertEquals(a.getAllowGeneratedReplies(), aCopy.getAllowGeneratedReplies());
}
- @SmallTest
@Test
public void testNotificationActionBuilder_defaultAllowGeneratedRepliesTrue() throws Throwable {
NotificationCompat.Action a = newActionBuilder().build();
@@ -61,7 +79,6 @@
assertTrue(a.getAllowGeneratedReplies());
}
- @SmallTest
@Test
public void testNotificationAction_defaultAllowGeneratedRepliesTrue() throws Throwable {
NotificationCompat.Action a = new NotificationCompat.Action(0, null, null);
@@ -69,7 +86,6 @@
assertTrue(a.getAllowGeneratedReplies());
}
- @SmallTest
@Test
public void testNotificationActionBuilder_setAllowGeneratedRepliesFalse() throws Throwable {
NotificationCompat.Action a = newActionBuilder()
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 206ee9a..1b888a1 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -46,12 +46,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index ac1c031..680d91e 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -43,12 +43,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index d8ab349..0fcf7e8 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -35,12 +35,3 @@
inceptionYear '2015'
description 'Android Support Custom Tabs'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/design/Android.mk b/design/Android.mk
index b3bc846..08f8815 100644
--- a/design/Android.mk
+++ b/design/Android.mk
@@ -31,10 +31,6 @@
LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
LOCAL_SRC_FILES := \
$(call all-java-files-under,base) \
- $(call all-java-files-under,gingerbread) \
- $(call all-java-files-under,honeycomb) \
- $(call all-java-files-under,honeycomb-mr1) \
- $(call all-java-files-under,ics) \
$(call all-java-files-under,lollipop) \
$(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
diff --git a/design/build.gradle b/design/build.gradle
index be28dc5..4d9dc01 100644
--- a/design/build.gradle
+++ b/design/build.gradle
@@ -66,12 +66,3 @@
inceptionYear '2015'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index eeac690..e350cd4 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -414,8 +414,8 @@
// Only enter by the amount of the collapsed height
range += childHeight - ViewCompat.getMinimumHeight(child);
} else {
- // Else use the full height
- range += childHeight;
+ // Else use the full height (minus the top inset)
+ range += childHeight - getTopInset();
}
} else if (range > 0) {
// If we've hit an non-quick return scrollable view, and we've already hit a
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
index 82add6f..bd5ffba 100644
--- a/design/src/android/support/design/widget/Snackbar.java
+++ b/design/src/android/support/design/widget/Snackbar.java
@@ -133,6 +133,11 @@
public static Snackbar make(@NonNull View view, @NonNull CharSequence text,
@Duration int duration) {
final ViewGroup parent = findSuitableParent(view);
+ if (parent == null) {
+ throw new IllegalArgumentException("No suitable parent found from the given view. "
+ + "Please provide a valid view.");
+ }
+
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final SnackbarContentLayout content =
(SnackbarContentLayout) inflater.inflate(
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml
new file mode 100644
index 0000000..43a8d51
--- /dev/null
+++ b/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml
@@ -0,0 +1,49 @@
+<?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"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <android.support.design.widget.AppBarLayout
+ android:id="@+id/app_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/appbar_height"
+ android:fitsSystemWindows="true">
+
+ <android.support.design.widget.CollapsingToolbarLayout
+ android:id="@+id/collapsing_app_bar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_scrollFlags="scroll|enterAlways">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_height="?attr/actionBarSize"
+ android:layout_width="match_parent"
+ app:layout_collapseMode="pin"/>
+
+ </android.support.design.widget.CollapsingToolbarLayout>
+
+ </android.support.design.widget.AppBarLayout>
+
+ <include layout="@layout/include_appbar_scrollview" />
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java b/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java
index adcfee8..2db3471 100644
--- a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java
+++ b/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java
@@ -16,7 +16,10 @@
package android.support.design.widget;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
import android.os.Build;
import android.os.SystemClock;
@@ -245,6 +248,111 @@
}
@Test
+ public void testScrollingToolbarEnterAlways() throws Throwable {
+ configureContent(R.layout.design_appbar_toolbar_collapse_scroll_enteralways,
+ R.string.design_appbar_collapsing_toolbar_scroll);
+
+ final int[] appbarOnScreenXY = new int[2];
+ final int[] coordinatorLayoutOnScreenXY = new int[2];
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+ mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
+
+ final int topInset = mAppBar.getTopInset();
+
+ final int originalAppbarTop = appbarOnScreenXY[1];
+ final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
+ final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
+
+ final int toolbarHeight = mToolbar.getHeight();
+ final int appbarHeight = mAppBar.getHeight();
+ final int longSwipeAmount = 3 * appbarHeight / 2;
+ final int reallyLongSwipeAmount = 2 * appbarHeight;
+ final int shortSwipeAmount = toolbarHeight;
+
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(0);
+
+ // Perform a swipe-up gesture across the horizontal center of the screen, starting from
+ // just below the AppBarLayout
+ performVerticalSwipeUpGesture(
+ R.id.coordinator_layout,
+ centerX,
+ originalAppbarBottom + 20,
+ longSwipeAmount);
+
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+ // At this point the app bar should not be visually "present" on the screen, with its bottom
+ // edge aligned with the bottom of system status bar. If we're running on a device which
+ // supports a translucent status bar, we need to take the status bar height into account.
+ // Allow for off-by-a-pixel margin of error.
+ assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(255);
+
+ // Perform another swipe-up gesture
+ performVerticalSwipeUpGesture(
+ R.id.coordinator_layout,
+ centerX,
+ originalAppbarBottom,
+ shortSwipeAmount);
+
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+ // At this point the app bar should still be off the screen. Allow for off-by-a-pixel
+ // margin of error.
+ assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(255);
+
+ // Perform a short swipe-down gesture across the horizontal center of the screen.
+ // Note that the swipe down is a bit longer than the swipe up to fully bring down
+ // the scrolled-away toolbar
+ performVerticalSwipeDownGesture(
+ R.id.coordinator_layout,
+ centerX,
+ originalAppbarBottom,
+ 3 * shortSwipeAmount / 2);
+
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+
+ // At this point the app bar should be visually below the system status bar as it
+ // in scrolling mode and we've swiped down, not fully but more than collapsed
+ assertThat(appbarOnScreenXY[1] + appbarHeight,
+ is(greaterThan(originalAppbarTop + toolbarHeight + topInset)));
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(255);
+
+ // Perform another swipe-down gesture across the horizontal center of the screen.
+ performVerticalSwipeDownGesture(
+ R.id.coordinator_layout,
+ centerX,
+ originalAppbarBottom,
+ reallyLongSwipeAmount);
+
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+ // At this point the app bar should be in its original position.
+ // Allow for off-by-a-pixel margin of error.
+ assertEquals(originalAppbarTop, appbarOnScreenXY[1]);
+ assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight);
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(0);
+
+ // Perform yet another swipe-down gesture across the horizontal center of the screen.
+ performVerticalSwipeDownGesture(
+ R.id.coordinator_layout,
+ centerX,
+ originalAppbarBottom,
+ longSwipeAmount);
+
+ mAppBar.getLocationOnScreen(appbarOnScreenXY);
+ // At this point the app bar should still be in its original position.
+ // Allow for off-by-a-pixel margin of error.
+ assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
+ assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
+ assertAppBarElevation(mDefaultElevationValue);
+ assertScrimAlpha(0);
+ }
+
+ @Test
public void testPinnedToolbarAndAnchoredFab() throws Throwable {
configureContent(R.layout.design_appbar_toolbar_collapse_pin_with_fab,
R.string.design_appbar_collapsing_toolbar_pin_fab);
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index a01eaec..b9ecadf 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -23,12 +23,3 @@
inceptionYear '2016'
description 'Android Support ExifInterface'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/exifinterface/src/android/support/media/ExifInterface.java b/exifinterface/src/android/support/media/ExifInterface.java
index ae9d842..a6f9240 100644
--- a/exifinterface/src/android/support/media/ExifInterface.java
+++ b/exifinterface/src/android/support/media/ExifInterface.java
@@ -658,9 +658,9 @@
}
private Object getValue(ByteOrder byteOrder) {
+ ByteOrderedDataInputStream inputStream = null;
try {
- ByteOrderedDataInputStream inputStream =
- new ByteOrderedDataInputStream(bytes);
+ inputStream = new ByteOrderedDataInputStream(bytes);
inputStream.setByteOrder(byteOrder);
switch (format) {
case IFD_FORMAT_BYTE:
@@ -768,6 +768,14 @@
} catch (IOException e) {
Log.w(TAG, "IOException occurred during reading a value", e);
return null;
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ Log.e(TAG, "IOException occurred while closing InputStream", e);
+ }
+ }
}
}
@@ -2040,6 +2048,7 @@
signatureInputStream.setByteOrder(mExifByteOrder);
short orfSignature = signatureInputStream.readShort();
+ signatureInputStream.close();
return orfSignature == ORF_SIGNATURE_1 || orfSignature == ORF_SIGNATURE_2;
}
@@ -2056,6 +2065,7 @@
signatureInputStream.setByteOrder(mExifByteOrder);
short signatureByte = signatureInputStream.readShort();
+ signatureInputStream.close();
return signatureByte == RW2_SIGNATURE;
}
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 9d25919..8b48582 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -41,11 +41,3 @@
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 4 or later."
}
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/fragment/java/android/support/v4/app/BackStackRecord.java b/fragment/java/android/support/v4/app/BackStackRecord.java
index 5b992d6..0debe7a 100644
--- a/fragment/java/android/support/v4/app/BackStackRecord.java
+++ b/fragment/java/android/support/v4/app/BackStackRecord.java
@@ -228,6 +228,8 @@
ArrayList<String> mSharedElementTargetNames;
boolean mAllowOptimization = false;
+ ArrayList<Runnable> mCommitRunnables;
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder(128);
@@ -606,6 +608,28 @@
}
@Override
+ public FragmentTransaction postOnCommit(Runnable runnable) {
+ if (runnable == null) {
+ throw new IllegalArgumentException("runnable cannot be null");
+ }
+ disallowAddToBackStack();
+ if (mCommitRunnables == null) {
+ mCommitRunnables = new ArrayList<>();
+ }
+ mCommitRunnables.add(runnable);
+ return this;
+ }
+
+ public void runOnCommitRunnables() {
+ if (mCommitRunnables != null) {
+ for (int i = 0, N = mCommitRunnables.size(); i < N; i++) {
+ mCommitRunnables.get(i).run();
+ }
+ mCommitRunnables = null;
+ }
+ }
+
+ @Override
public int commit() {
return commitInternal(false);
}
@@ -640,6 +664,7 @@
LogWriter logw = new LogWriter(TAG);
PrintWriter pw = new PrintWriter(logw);
dump(" ", null, pw, null);
+ pw.close();
}
mCommitted = true;
if (mAddToBackStack) {
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
index 84b4d5a..0a4fe6f 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -551,15 +551,15 @@
}
/**
- * Supply the construction arguments for this fragment. This can only
- * be called before the fragment has been attached to its activity; that
- * is, you should call it immediately after constructing the fragment. The
- * arguments supplied here will be retained across fragment destroy and
+ * Supply the construction arguments for this fragment.
+ * The arguments supplied here will be retained across fragment destroy and
* creation.
+ * <p>This method cannot be called if the fragment is added to a FragmentManager and
+ * if {@link #isStateSaved()} would return true.</p>
*/
public void setArguments(Bundle args) {
- if (mIndex >= 0) {
- throw new IllegalStateException("Fragment already active");
+ if (mIndex >= 0 && isStateSaved()) {
+ throw new IllegalStateException("Fragment already active and state has been saved");
}
mArguments = args;
}
@@ -573,6 +573,21 @@
}
/**
+ * Returns true if this fragment is added and its state has already been saved
+ * by its host. Any operations that would change saved state should not be performed
+ * if this method returns true, and some operations such as {@link #setArguments(Bundle)}
+ * will fail.
+ *
+ * @return true if this fragment's state has already been saved by its host
+ */
+ public final boolean isStateSaved() {
+ if (mFragmentManager == null) {
+ return false;
+ }
+ return mFragmentManager.isStateSaved();
+ }
+
+ /**
* Set the initial saved state that this Fragment should restore itself
* from when first being constructed, as returned by
* {@link FragmentManager#saveFragmentInstanceState(Fragment)
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/java/android/support/v4/app/FragmentManager.java
index 10f15f6..dc241bb 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -1888,6 +1888,10 @@
}
}
+ public boolean isStateSaved() {
+ return mStateSaved;
+ }
+
/**
* Adds an action to the queue of pending actions.
*
@@ -2209,6 +2213,7 @@
freeBackStackIndex(record.mIndex);
record.mIndex = -1;
}
+ record.runOnCommitRunnables();
}
if (addToBackStack) {
reportBackStackChanged();
@@ -2899,6 +2904,7 @@
LogWriter logw = new LogWriter(TAG);
PrintWriter pw = new PrintWriter(logw);
bse.dump(" ", pw, false);
+ pw.close();
}
mBackStack.add(bse);
if (bse.mIndex >= 0) {
diff --git a/fragment/java/android/support/v4/app/FragmentTransaction.java b/fragment/java/android/support/v4/app/FragmentTransaction.java
index fade3dc..e7ac0c6 100644
--- a/fragment/java/android/support/v4/app/FragmentTransaction.java
+++ b/fragment/java/android/support/v4/app/FragmentTransaction.java
@@ -16,8 +16,6 @@
package android.support.v4.app;
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
import android.support.annotation.AnimRes;
import android.support.annotation.IdRes;
import android.support.annotation.IntDef;
@@ -30,6 +28,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
/**
* Static library support version of the framework's {@link android.app.FragmentTransaction}.
* Used to write apps that run on platforms prior to Android 3.0. When running
@@ -323,6 +323,22 @@
public abstract FragmentTransaction setAllowOptimization(boolean allowOptimization);
/**
+ * Add a Runnable to this transaction that will be run after this transaction has
+ * been committed. If fragment transactions are {@link #setAllowOptimization(boolean) optimized}
+ * this may be after other subsequent fragment operations have also taken place, or operations
+ * in this transaction may have been optimized out due to the presence of a subsequent
+ * fragment transaction in the batch.
+ *
+ * <p><code>postOnCommit</code> may not be used with transactions
+ * {@link #addToBackStack(String) added to the back stack} as Runnables cannot be persisted
+ * with back stack state.</p>
+ *
+ * @param runnable Runnable to add
+ * @return this FragmentTransaction
+ */
+ public abstract FragmentTransaction postOnCommit(Runnable runnable);
+
+ /**
* Schedules a commit of this transaction. The commit does
* not happen immediately; it will be scheduled as work on the main thread
* to be done the next time that thread is ready.
diff --git a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
index 4c0c0a4..1da53ba 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -586,6 +586,77 @@
assertFalse(fragment1.mCalledOnResume);
}
+ @Test
+ @UiThreadTest
+ public void testIsStateSaved() throws Throwable {
+ FragmentController fc = startupFragmentController(null);
+ FragmentManager fm = fc.getSupportFragmentManager();
+
+ Fragment f = new StrictFragment();
+ fm.beginTransaction()
+ .add(f, "1")
+ .commitNow();
+
+ assertFalse("fragment reported state saved while resumed", f.isStateSaved());
+
+ fc.dispatchPause();
+ fc.saveAllState();
+
+ assertTrue("fragment reported state not saved after saveAllState", f.isStateSaved());
+
+ fc.dispatchStop();
+ fc.dispatchReallyStop();
+
+ assertTrue("fragment reported state not saved after stop", f.isStateSaved());
+
+ fc.dispatchDestroy();
+
+ assertFalse("fragment reported state saved after destroy", f.isStateSaved());
+ }
+
+ @Test
+ @UiThreadTest
+ public void testSetArgumentsLifecycle() throws Throwable {
+ FragmentController fc = startupFragmentController(null);
+ FragmentManager fm = fc.getSupportFragmentManager();
+
+ Fragment f = new StrictFragment();
+ f.setArguments(new Bundle());
+
+ fm.beginTransaction()
+ .add(f, "1")
+ .commitNow();
+
+ f.setArguments(new Bundle());
+
+ fc.dispatchPause();
+ fc.saveAllState();
+
+ boolean threw = false;
+ try {
+ f.setArguments(new Bundle());
+ } catch (IllegalStateException ise) {
+ threw = true;
+ }
+ assertTrue("fragment allowed setArguments after state save", threw);
+
+ fc.dispatchStop();
+ fc.dispatchReallyStop();
+
+ threw = false;
+ try {
+ f.setArguments(new Bundle());
+ } catch (IllegalStateException ise) {
+ threw = true;
+ }
+ assertTrue("fragment allowed setArguments after stop", threw);
+
+ fc.dispatchDestroy();
+
+ // Fully destroyed, so fragments have been removed.
+ f.setArguments(new Bundle());
+ }
+
private void assertAnimationsMatch(FragmentManager fm, int enter, int exit, int popEnter,
int popExit) {
FragmentManagerImpl fmImpl = (FragmentManagerImpl) fm;
diff --git a/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java b/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
index 06abd69..13901c4 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentOptimizationTest.java
@@ -15,11 +15,14 @@
*/
package android.support.v4.app;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import android.app.Instrumentation;
import android.support.fragment.test.R;
import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.MediumTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
@@ -648,38 +651,30 @@
// Test that a fragment view that is created with focus has focus after the transaction
// completes.
+ @UiThreadTest
@Test
public void focusedView() throws Throwable {
- FragmentTestUtil.setContentView(mActivityRule, R.layout.double_container);
+ mActivityRule.getActivity().setContentView(R.layout.double_container);
mContainer = (ViewGroup) mActivityRule.getActivity().findViewById(R.id.fragmentContainer1);
- final EditText firstEditText = new EditText(mContainer.getContext());
- mInstrumentation.runOnMainSync(new Runnable() {
- @Override
- public void run() {
- mContainer.addView(firstEditText);
- firstEditText.requestFocus();
- }
- });
+ EditText firstEditText = new EditText(mContainer.getContext());
+ mContainer.addView(firstEditText);
+ firstEditText.requestFocus();
+
assertTrue(firstEditText.isFocused());
final CountCallsFragment fragment1 = new CountCallsFragment();
final CountCallsFragment fragment2 = new CountCallsFragment();
fragment2.setLayoutId(R.layout.with_edit_text);
- mInstrumentation.runOnMainSync(new Runnable() {
- @Override
- public void run() {
- mFM.beginTransaction()
- .add(R.id.fragmentContainer2, fragment1)
- .addToBackStack(null)
- .setAllowOptimization(true)
- .commit();
- mFM.beginTransaction()
- .replace(R.id.fragmentContainer2, fragment2)
- .addToBackStack(null)
- .setAllowOptimization(true)
- .commit();
- mFM.executePendingTransactions();
- }
- });
+ mFM.beginTransaction()
+ .add(R.id.fragmentContainer2, fragment1)
+ .addToBackStack(null)
+ .setAllowOptimization(true)
+ .commit();
+ mFM.beginTransaction()
+ .replace(R.id.fragmentContainer2, fragment2)
+ .addToBackStack(null)
+ .setAllowOptimization(true)
+ .commit();
+ mFM.executePendingTransactions();
final View editText = fragment2.getView().findViewById(R.id.editText);
assertTrue(editText.isFocused());
assertFalse(firstEditText.isFocused());
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
index 117ca9d..201a197 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
@@ -161,6 +161,46 @@
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
}
+ @Test
+ public void testPostOnCommit() throws Throwable {
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final boolean[] ran = new boolean[1];
+ FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+ fm.beginTransaction().postOnCommit(new Runnable() {
+ @Override
+ public void run() {
+ ran[0] = true;
+ }
+ }).commit();
+ fm.executePendingTransactions();
+
+ assertTrue("postOnCommit runnable never ran", ran[0]);
+
+ ran[0] = false;
+
+ boolean threw = false;
+ try {
+ fm.beginTransaction().postOnCommit(new Runnable() {
+ @Override
+ public void run() {
+ ran[0] = true;
+ }
+ }).addToBackStack(null).commit();
+ } catch (IllegalStateException ise) {
+ threw = true;
+ }
+
+ fm.executePendingTransactions();
+
+ assertTrue("postOnCommit was allowed to be called for back stack transaction",
+ threw);
+ assertFalse("postOnCommit runnable for back stack transaction was run", ran[0]);
+ }
+ });
+ }
+
public static class CorrectFragment extends Fragment {}
private static class PrivateFragment extends Fragment {}
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 07484c1..56eafd8 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -39,13 +39,4 @@
name 'Android Support AnimatedVectorDrawable'
inceptionYear '2015'
description 'Android Support AnimatedVectorDrawable'
-}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
+}
\ No newline at end of file
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index c9ef5d1..33ff2c5 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -466,6 +466,7 @@
Animator objectAnimator = AnimatorInflater.loadAnimator(mContext, id);
setupAnimatorsForTarget(target, objectAnimator);
} else {
+ a.recycle();
throw new IllegalStateException("Context can't be null when inflating" +
" animators");
}
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index ba6b160..bf342b5 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -36,12 +36,3 @@
inceptionYear '2015'
description 'Android Support VectorDrawable'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index e09b56b..4044784 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -43,12 +43,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java b/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
index 85c64ea..1991231 100644
--- a/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/MediaBrowserServiceCompatTest.java
@@ -147,9 +147,8 @@
}
}
- // TODO(hdmoon): Uncomment after fixing failing tests. (Fails on API >= 24)
- // @Test
- // @SmallTest
+ @Test
+ @SmallTest
public void testDelayedItem() throws Exception {
synchronized (mWaitLock) {
mItemCallback.reset();
diff --git a/percent/build.gradle b/percent/build.gradle
index 96292d0..30aa2b8 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -33,12 +33,3 @@
inceptionYear '2015'
description 'Android Percent Support Library'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index 3a6815f..864de0b 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -26,12 +26,3 @@
inceptionYear '2015'
description 'Android Support Recommendation'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/transition/Android.mk b/transition/Android.mk
index eab8441..b647dfc 100644
--- a/transition/Android.mk
+++ b/transition/Android.mk
@@ -30,7 +30,6 @@
$(call all-java-files-under,base) \
$(call all-java-files-under,api14) \
$(call all-java-files-under,api18) \
- $(call all-java-files-under,api19) \
$(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/transition/api14/android/support/transition/ViewGroupUtilsApi14.java b/transition/api14/android/support/transition/ViewGroupUtilsApi14.java
index 45ad978..e37a1cc 100644
--- a/transition/api14/android/support/transition/ViewGroupUtilsApi14.java
+++ b/transition/api14/android/support/transition/ViewGroupUtilsApi14.java
@@ -16,13 +16,31 @@
package android.support.transition;
+import android.animation.LayoutTransition;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
+import android.util.Log;
import android.view.ViewGroup;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
@RequiresApi(14)
class ViewGroupUtilsApi14 implements ViewGroupUtilsImpl {
+ private static final String TAG = "ViewGroupUtilsApi14";
+
+ private static final int LAYOUT_TRANSITION_CHANGING = 4;
+
+ private static LayoutTransition sEmptyLayoutTransition;
+
+ private static Field sLayoutSuppressedField;
+ private static boolean sLayoutSuppressedFieldFetched;
+
+ private static Method sCancelMethod;
+ private static boolean sCancelMethodFetched;
+
@Override
public ViewGroupOverlayImpl getOverlay(@NonNull ViewGroup group) {
return ViewGroupOverlayApi14.createFrom(group);
@@ -30,7 +48,89 @@
@Override
public void suppressLayout(@NonNull ViewGroup group, boolean suppress) {
- // TODO: Backport
+ // Prepare the dummy LayoutTransition
+ if (sEmptyLayoutTransition == null) {
+ sEmptyLayoutTransition = new LayoutTransition() {
+ @Override
+ public boolean isChangingLayout() {
+ return true;
+ }
+ };
+ sEmptyLayoutTransition.setAnimator(LayoutTransition.APPEARING, null);
+ sEmptyLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, null);
+ sEmptyLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, null);
+ sEmptyLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, null);
+ sEmptyLayoutTransition.setAnimator(LAYOUT_TRANSITION_CHANGING, null);
+ }
+ if (suppress) {
+ // Save the current LayoutTransition
+ final LayoutTransition layoutTransition = group.getLayoutTransition();
+ if (layoutTransition != null) {
+ if (layoutTransition.isRunning()) {
+ cancelLayoutTransition(layoutTransition);
+ }
+ if (layoutTransition != sEmptyLayoutTransition) {
+ group.setTag(R.id.transition_layout_save, layoutTransition);
+ }
+ }
+ // Suppress the layout
+ group.setLayoutTransition(sEmptyLayoutTransition);
+ } else {
+ // Thaw the layout suppression
+ group.setLayoutTransition(null);
+ // Request layout if necessary
+ if (!sLayoutSuppressedFieldFetched) {
+ try {
+ sLayoutSuppressedField = ViewGroup.class.getDeclaredField("mLayoutSuppressed");
+ sLayoutSuppressedField.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ Log.i(TAG, "Failed to access mLayoutSuppressed field by reflection");
+ }
+ sLayoutSuppressedFieldFetched = true;
+ }
+ boolean layoutSuppressed = false;
+ if (sLayoutSuppressedField != null) {
+ try {
+ layoutSuppressed = sLayoutSuppressedField.getBoolean(group);
+ if (layoutSuppressed) {
+ sLayoutSuppressedField.setBoolean(group, false);
+ }
+ } catch (IllegalAccessException e) {
+ Log.i(TAG, "Failed to get mLayoutSuppressed field by reflection");
+ }
+ }
+ if (layoutSuppressed) {
+ group.requestLayout();
+ }
+ // Restore the saved LayoutTransition
+ final LayoutTransition layoutTransition =
+ (LayoutTransition) group.getTag(R.id.transition_layout_save);
+ if (layoutTransition != null) {
+ group.setTag(R.id.transition_layout_save, null);
+ group.setLayoutTransition(layoutTransition);
+ }
+ }
+ }
+
+ private static void cancelLayoutTransition(LayoutTransition t) {
+ if (!sCancelMethodFetched) {
+ try {
+ sCancelMethod = LayoutTransition.class.getDeclaredMethod("cancel");
+ sCancelMethod.setAccessible(true);
+ } catch (NoSuchMethodException e) {
+ Log.i(TAG, "Failed to access cancel method by reflection");
+ }
+ sCancelMethodFetched = true;
+ }
+ if (sCancelMethod != null) {
+ try {
+ sCancelMethod.invoke(t);
+ } catch (IllegalAccessException e) {
+ Log.i(TAG, "Failed to access cancel method by reflection");
+ } catch (InvocationTargetException e) {
+ Log.i(TAG, "Failed to invoke cancel method by reflection");
+ }
+ }
}
}
diff --git a/transition/api18/android/support/transition/ViewGroupUtilsApi18.java b/transition/api18/android/support/transition/ViewGroupUtilsApi18.java
index b176363..7aad4e1 100644
--- a/transition/api18/android/support/transition/ViewGroupUtilsApi18.java
+++ b/transition/api18/android/support/transition/ViewGroupUtilsApi18.java
@@ -18,14 +18,50 @@
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
+import android.util.Log;
import android.view.ViewGroup;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
@RequiresApi(18)
class ViewGroupUtilsApi18 extends ViewGroupUtilsApi14 {
+ private static final String TAG = "ViewUtilsApi18";
+
+ private static Method sSuppressLayoutMethod;
+ private static boolean sSuppressLayoutMethodFetched;
+
@Override
public ViewGroupOverlayImpl getOverlay(@NonNull ViewGroup group) {
return new ViewGroupOverlayApi18(group);
}
+ @Override
+ public void suppressLayout(@NonNull ViewGroup group, boolean suppress) {
+ fetchSuppressLayoutMethod();
+ if (sSuppressLayoutMethod != null) {
+ try {
+ sSuppressLayoutMethod.invoke(group, suppress);
+ } catch (IllegalAccessException e) {
+ Log.i(TAG, "Failed to invoke suppressLayout method", e);
+ } catch (InvocationTargetException e) {
+ Log.i(TAG, "Error invoking suppressLayout method", e);
+ }
+ }
+ }
+
+ private void fetchSuppressLayoutMethod() {
+ if (!sSuppressLayoutMethodFetched) {
+ try {
+ sSuppressLayoutMethod = ViewGroup.class.getDeclaredMethod("suppressLayout",
+ boolean.class);
+ sSuppressLayoutMethod.setAccessible(true);
+ } catch (NoSuchMethodException e) {
+ Log.i(TAG, "Failed to retrieve suppressLayout method", e);
+ }
+ sSuppressLayoutMethodFetched = true;
+ }
+ }
+
}
diff --git a/transition/api19/android/support/transition/ViewGroupUtilsApi19.java b/transition/api19/android/support/transition/ViewGroupUtilsApi19.java
deleted file mode 100644
index db4710e..0000000
--- a/transition/api19/android/support/transition/ViewGroupUtilsApi19.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 android.support.transition;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.util.Log;
-import android.view.ViewGroup;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-@RequiresApi(19)
-class ViewGroupUtilsApi19 extends ViewGroupUtilsApi18 {
-
- private static final String TAG = "ViewUtilsApi19";
-
- private static Method sSuppressLayoutMethod;
- private static boolean sSuppressLayoutMethodFetched;
-
- @Override
- public void suppressLayout(@NonNull ViewGroup group, boolean suppress) {
- fetchSuppressLayoutMethod();
- if (sSuppressLayoutMethod != null) {
- try {
- sSuppressLayoutMethod.invoke(group, suppress);
- } catch (IllegalAccessException e) {
- Log.i(TAG, "Failed to invoke suppressLayout method", e);
- } catch (InvocationTargetException e) {
- Log.i(TAG, "Error invoking suppressLayout method", e);
- }
- }
- }
-
- private void fetchSuppressLayoutMethod() {
- if (!sSuppressLayoutMethodFetched) {
- try {
- sSuppressLayoutMethod = ViewGroup.class.getDeclaredMethod("suppressLayout",
- boolean.class);
- sSuppressLayoutMethod.setAccessible(true);
- } catch (NoSuchMethodException e) {
- Log.i(TAG, "Failed to retrieve suppressLayout method", e);
- }
- sSuppressLayoutMethodFetched = true;
- }
- }
-
-}
diff --git a/transition/build.gradle b/transition/build.gradle
index 63e6071..637efd5 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -30,7 +30,6 @@
'base',
'api14',
'api18',
- 'api19',
'src'
]
main.res.srcDirs = [
@@ -45,13 +44,3 @@
inceptionYear '2016'
description 'Android Transition Support Library'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
-
diff --git a/transition/res/values/ids.xml b/transition/res/values/ids.xml
index 9a6846b..071cf2a 100644
--- a/transition/res/values/ids.xml
+++ b/transition/res/values/ids.xml
@@ -17,4 +17,5 @@
<resources>
<item name="transition_scene_layoutid_cache" type="id"/>
<item name="transition_current_scene" type="id"/>
+ <item name="transition_layout_save" type="id"/>
</resources>
diff --git a/transition/src/android/support/transition/ViewGroupUtils.java b/transition/src/android/support/transition/ViewGroupUtils.java
index b06d0df..370e3a3 100644
--- a/transition/src/android/support/transition/ViewGroupUtils.java
+++ b/transition/src/android/support/transition/ViewGroupUtils.java
@@ -28,9 +28,7 @@
private static final ViewGroupUtilsImpl IMPL;
static {
- if (Build.VERSION.SDK_INT >= 19) {
- IMPL = new ViewGroupUtilsApi19();
- } else if (Build.VERSION.SDK_INT >= 18) {
+ if (Build.VERSION.SDK_INT >= 18) {
IMPL = new ViewGroupUtilsApi18();
} else {
IMPL = new ViewGroupUtilsApi14();
diff --git a/transition/tests/res/layout/activity_transition.xml b/transition/tests/res/layout/activity_transition.xml
index cfbbe61..cf25ef9 100644
--- a/transition/tests/res/layout/activity_transition.xml
+++ b/transition/tests/res/layout/activity_transition.xml
@@ -14,7 +14,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/root"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/root"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"/>
diff --git a/transition/tests/src/android/support/transition/AutoTransitionTest.java b/transition/tests/src/android/support/transition/AutoTransitionTest.java
new file mode 100644
index 0000000..137f6d3
--- /dev/null
+++ b/transition/tests/src/android/support/transition/AutoTransitionTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.transition;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import android.graphics.Color;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.MediumTest;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import org.junit.Before;
+import org.junit.Test;
+
+@MediumTest
+public class AutoTransitionTest extends BaseTest {
+
+ private LinearLayout mRoot;
+ private View mView0;
+ private View mView1;
+
+ @UiThreadTest
+ @Before
+ public void setUp() {
+ mRoot = (LinearLayout) rule.getActivity().getRoot();
+ mView0 = new View(rule.getActivity());
+ mView0.setBackgroundColor(Color.RED);
+ mRoot.addView(mView0, new LinearLayout.LayoutParams(100, 100));
+ mView1 = new View(rule.getActivity());
+ mView1.setBackgroundColor(Color.BLUE);
+ mRoot.addView(mView1, new LinearLayout.LayoutParams(100, 100));
+ }
+
+ @Test
+ public void testLayoutBetweenFadeAndChangeBounds() throws Throwable {
+ final LayoutCounter counter = new LayoutCounter();
+ rule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ assertThat(mView1.getY(), is(100.f));
+ assertThat(mView0.getVisibility(), is(View.VISIBLE));
+ mView1.addOnLayoutChangeListener(counter);
+ }
+ });
+ final SyncTransitionListener listener = new SyncTransitionListener(
+ SyncTransitionListener.EVENT_END);
+ final Transition transition = new AutoTransition();
+ transition.addListener(listener);
+ rule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ TransitionManager.beginDelayedTransition(mRoot, transition);
+ // This makes view0 fade out and causes view1 to move upwards.
+ mView0.setVisibility(View.GONE);
+ }
+ });
+ assertThat("Timed out waiting for the TransitionListener",
+ listener.await(), is(true));
+ assertThat(mView1.getY(), is(0.f));
+ assertThat(mView0.getVisibility(), is(View.GONE));
+ counter.reset();
+ listener.reset();
+ rule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ TransitionManager.beginDelayedTransition(mRoot, transition);
+ // Revert
+ mView0.setVisibility(View.VISIBLE);
+ }
+ });
+ assertThat("Timed out waiting for the TransitionListener",
+ listener.await(), is(true));
+ assertThat(mView1.getY(), is(100.f));
+ assertThat(mView0.getVisibility(), is(View.VISIBLE));
+ }
+
+ private static class LayoutCounter implements View.OnLayoutChangeListener {
+
+ private int mCalledCount;
+
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ mCalledCount++;
+ // There should not be more than one layout request to view1.
+ if (mCalledCount > 1) {
+ fail("View layout happened too many times");
+ }
+ }
+
+ void reset() {
+ mCalledCount = 0;
+ }
+
+ }
+
+}
diff --git a/transition/tests/src/android/support/transition/SyncTransitionListener.java b/transition/tests/src/android/support/transition/SyncTransitionListener.java
new file mode 100644
index 0000000..4d7e02e
--- /dev/null
+++ b/transition/tests/src/android/support/transition/SyncTransitionListener.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.transition;
+
+import android.support.annotation.NonNull;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This {@link Transition.TransitionListener} synchronously waits for the specified callback.
+ */
+class SyncTransitionListener implements Transition.TransitionListener {
+
+ static final int EVENT_START = 1;
+ static final int EVENT_END = 2;
+ static final int EVENT_CANCEL = 3;
+ static final int EVENT_PAUSE = 4;
+ static final int EVENT_RESUME = 5;
+
+ private final int mTargetEvent;
+ private CountDownLatch mLatch = new CountDownLatch(1);
+
+ SyncTransitionListener(int event) {
+ mTargetEvent = event;
+ }
+
+ boolean await() {
+ try {
+ return mLatch.await(3000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ return false;
+ }
+ }
+
+ void reset() {
+ mLatch = new CountDownLatch(1);
+ }
+
+ @Override
+ public void onTransitionStart(@NonNull Transition transition) {
+ if (mTargetEvent == EVENT_START) {
+ mLatch.countDown();
+ }
+ }
+
+ @Override
+ public void onTransitionEnd(@NonNull Transition transition) {
+ if (mTargetEvent == EVENT_END) {
+ mLatch.countDown();
+ }
+ }
+
+ @Override
+ public void onTransitionCancel(@NonNull Transition transition) {
+ if (mTargetEvent == EVENT_CANCEL) {
+ mLatch.countDown();
+ }
+ }
+
+ @Override
+ public void onTransitionPause(@NonNull Transition transition) {
+ if (mTargetEvent == EVENT_PAUSE) {
+ mLatch.countDown();
+ }
+ }
+
+ @Override
+ public void onTransitionResume(@NonNull Transition transition) {
+ if (mTargetEvent == EVENT_RESUME) {
+ mLatch.countDown();
+ }
+ }
+}
diff --git a/transition/tests/src/android/support/transition/TransitionActivity.java b/transition/tests/src/android/support/transition/TransitionActivity.java
index ff9dbcc..43f03d3 100644
--- a/transition/tests/src/android/support/transition/TransitionActivity.java
+++ b/transition/tests/src/android/support/transition/TransitionActivity.java
@@ -20,17 +20,17 @@
import android.os.Bundle;
import android.support.transition.test.R;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
+import android.widget.LinearLayout;
public class TransitionActivity extends Activity {
- private FrameLayout mRoot;
+ private LinearLayout mRoot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
- mRoot = (FrameLayout) findViewById(R.id.root);
+ mRoot = (LinearLayout) findViewById(R.id.root);
}
ViewGroup getRoot() {
diff --git a/transition/tests/src/android/support/transition/TransitionManagerTest.java b/transition/tests/src/android/support/transition/TransitionManagerTest.java
index 00b328b..82fb17b 100644
--- a/transition/tests/src/android/support/transition/TransitionManagerTest.java
+++ b/transition/tests/src/android/support/transition/TransitionManagerTest.java
@@ -21,7 +21,6 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.sameInstance;
-import android.support.annotation.NonNull;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.MediumTest;
import android.support.transition.test.R;
@@ -30,9 +29,6 @@
import org.junit.Before;
import org.junit.Test;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
@MediumTest
public class TransitionManagerTest extends BaseTest {
@@ -122,66 +118,4 @@
listener.await(), is(true));
}
- /**
- * This {@link Transition.TransitionListener} synchronously waits for the specified callback.
- */
- private static class SyncTransitionListener implements Transition.TransitionListener {
-
- static final int EVENT_START = 1;
- static final int EVENT_END = 2;
- static final int EVENT_CANCEL = 3;
- static final int EVENT_PAUSE = 4;
- static final int EVENT_RESUME = 5;
-
- private final int mTargetEvent;
- private final CountDownLatch mLatch = new CountDownLatch(1);
-
- SyncTransitionListener(int event) {
- mTargetEvent = event;
- }
-
- boolean await() {
- try {
- return mLatch.await(3000, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- return false;
- }
- }
-
- @Override
- public void onTransitionStart(@NonNull Transition transition) {
- if (mTargetEvent == EVENT_START) {
- mLatch.countDown();
- }
- }
-
- @Override
- public void onTransitionEnd(@NonNull Transition transition) {
- if (mTargetEvent == EVENT_END) {
- mLatch.countDown();
- }
- }
-
- @Override
- public void onTransitionCancel(@NonNull Transition transition) {
- if (mTargetEvent == EVENT_CANCEL) {
- mLatch.countDown();
- }
- }
-
- @Override
- public void onTransitionPause(@NonNull Transition transition) {
- if (mTargetEvent == EVENT_PAUSE) {
- mLatch.countDown();
- }
- }
-
- @Override
- public void onTransitionResume(@NonNull Transition transition) {
- if (mTargetEvent == EVENT_RESUME) {
- mLatch.countDown();
- }
- }
- }
-
}
diff --git a/v13/build.gradle b/v13/build.gradle
index 7bed2ab..3b3e31c 100644
--- a/v13/build.gradle
+++ b/v13/build.gradle
@@ -40,12 +40,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v14/preference/build.gradle b/v14/preference/build.gradle
index 26222c7..5d6dafb 100644
--- a/v14/preference/build.gradle
+++ b/v14/preference/build.gradle
@@ -44,12 +44,3 @@
inceptionYear '2015'
description 'Android Support Preference v14'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v17/leanback/build.gradle b/v17/leanback/build.gradle
index f8468ed..8eb4636 100644
--- a/v17/leanback/build.gradle
+++ b/v17/leanback/build.gradle
@@ -49,12 +49,3 @@
inceptionYear '2014'
description 'Android Support Leanback v17'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v17/leanback/generatev4.py b/v17/leanback/generatev4.py
index 2e1eaeb..9eb5932 100755
--- a/v17/leanback/generatev4.py
+++ b/v17/leanback/generatev4.py
@@ -16,6 +16,7 @@
import os
import sys
+import re
print "Generate v4 fragment related code for leanback"
@@ -41,6 +42,7 @@
line = line.replace('activity.getFragmentManager()', 'activity.getSupportFragmentManager()')
line = line.replace('Activity activity', 'FragmentActivity activity')
line = line.replace('(Activity', '(FragmentActivity')
+ line = re.sub(r'FragmentUtil.getContext\(.*this\)', 'getContext()', line);
outfile.write(line)
file.close()
outfile.close()
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
index 3b4c851..8ab731f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
@@ -219,7 +219,7 @@
@Override
public boolean onPreDraw() {
view.getViewTreeObserver().removeOnPreDrawListener(this);
- if (getActivity() == null || getView() == null) {
+ if (FragmentUtil.getContext(BaseFragment.this) == null || getView() == null) {
// bail out if fragment is destroyed immediately after startEntranceTransition
return true;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
index 8de54a7..7d08738 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
@@ -222,7 +222,7 @@
@Override
public boolean onPreDraw() {
view.getViewTreeObserver().removeOnPreDrawListener(this);
- if (getActivity() == null || getView() == null) {
+ if (getContext() == null || getView() == null) {
// bail out if fragment is destroyed immediately after startEntranceTransition
return true;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
index fc6561e..24b1a85 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
@@ -19,6 +19,7 @@
import android.app.FragmentManager;
import android.app.FragmentManager.BackStackEntry;
import android.app.FragmentTransaction;
+import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
@@ -1056,12 +1057,13 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.LeanbackTheme);
+ final Context context = FragmentUtil.getContext(this);
+ TypedArray ta = context.obtainStyledAttributes(R.styleable.LeanbackTheme);
mContainerListMarginStart = (int) ta.getDimension(
- R.styleable.LeanbackTheme_browseRowsMarginStart, getActivity().getResources()
+ R.styleable.LeanbackTheme_browseRowsMarginStart, context.getResources()
.getDimensionPixelSize(R.dimen.lb_browse_rows_margin_start));
mContainerListAlignTop = (int) ta.getDimension(
- R.styleable.LeanbackTheme_browseRowsMarginTop, getActivity().getResources()
+ R.styleable.LeanbackTheme_browseRowsMarginTop, context.getResources()
.getDimensionPixelSize(R.dimen.lb_browse_rows_margin_top));
ta.recycle();
@@ -1223,7 +1225,7 @@
}
void createHeadersTransition() {
- mHeadersTransition = TransitionHelper.loadTransition(getActivity(),
+ mHeadersTransition = TransitionHelper.loadTransition(FragmentUtil.getContext(this),
mShowingHeaders
? R.transition.lb_browse_headers_in : R.transition.lb_browse_headers_out);
@@ -1657,7 +1659,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(FragmentUtil.getContext(this),
R.transition.lb_browse_entrance_transition);
}
@@ -1740,7 +1742,7 @@
@Override
public boolean onPreDraw() {
- if (getView() == null || getActivity() == null) {
+ if (getView() == null || FragmentUtil.getContext(BrowseFragment.this) == null) {
mView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
index 7bcc43d..b73d23d 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
@@ -22,6 +22,7 @@
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentManager.BackStackEntry;
import android.support.v4.app.FragmentTransaction;
+import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
@@ -1059,12 +1060,13 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.LeanbackTheme);
+ final Context context = getContext();
+ TypedArray ta = context.obtainStyledAttributes(R.styleable.LeanbackTheme);
mContainerListMarginStart = (int) ta.getDimension(
- R.styleable.LeanbackTheme_browseRowsMarginStart, getActivity().getResources()
+ R.styleable.LeanbackTheme_browseRowsMarginStart, context.getResources()
.getDimensionPixelSize(R.dimen.lb_browse_rows_margin_start));
mContainerListAlignTop = (int) ta.getDimension(
- R.styleable.LeanbackTheme_browseRowsMarginTop, getActivity().getResources()
+ R.styleable.LeanbackTheme_browseRowsMarginTop, context.getResources()
.getDimensionPixelSize(R.dimen.lb_browse_rows_margin_top));
ta.recycle();
@@ -1226,7 +1228,7 @@
}
void createHeadersTransition() {
- mHeadersTransition = TransitionHelper.loadTransition(getActivity(),
+ mHeadersTransition = TransitionHelper.loadTransition(getContext(),
mShowingHeaders
? R.transition.lb_browse_headers_in : R.transition.lb_browse_headers_out);
@@ -1660,7 +1662,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(getContext(),
R.transition.lb_browse_entrance_transition);
}
@@ -1743,7 +1745,7 @@
@Override
public boolean onPreDraw() {
- if (getView() == null || getActivity() == null) {
+ if (getView() == null || getContext() == null) {
mView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
index fcb3fa9..f73cee6 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -473,7 +473,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(FragmentUtil.getContext(this),
R.transition.lb_details_enter_transition);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
index a9bbf28..ee63156 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
@@ -476,7 +476,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(getContext(),
R.transition.lb_details_enter_transition);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/FragmentUtil.java b/v17/leanback/src/android/support/v17/leanback/app/FragmentUtil.java
new file mode 100644
index 0000000..23c6039
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/app/FragmentUtil.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.v17.leanback.app;
+
+import android.annotation.TargetApi;
+import android.app.Fragment;
+import android.content.Context;
+import android.os.Build;
+
+class FragmentUtil {
+
+ @TargetApi(23)
+ private static Context getContextNew(Fragment fragment) {
+ return fragment.getContext();
+ }
+
+ public static Context getContext(Fragment fragment) {
+ if (Build.VERSION.SDK_INT >= 23) {
+ return getContextNew(fragment);
+ } else {
+ return fragment.getActivity();
+ }
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
index da44fde..bab48bd 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -1129,7 +1129,7 @@
} else {
// when there are two actions panel, we need adjust the weight of action to
// guidedActionContentWidthWeightTwoPanels.
- Context ctx = mThemeWrapper != null ? mThemeWrapper : getActivity();
+ Context ctx = mThemeWrapper != null ? mThemeWrapper : FragmentUtil.getContext(this);
TypedValue typedValue = new TypedValue();
if (ctx.getTheme().resolveAttribute(R.attr.guidedActionContentWidthWeightTwoPanels,
typedValue, true)) {
@@ -1327,18 +1327,18 @@
private void resolveTheme() {
// Look up the guidedStepTheme in the currently specified theme. If it exists,
// replace the theme with its value.
- Activity activity = getActivity();
+ Context context = FragmentUtil.getContext(this);
int theme = onProvideTheme();
- if (theme == -1 && !isGuidedStepTheme(activity)) {
+ if (theme == -1 && !isGuidedStepTheme(context)) {
// Look up the guidedStepTheme in the activity's currently specified theme. If it
// exists, replace the theme with its value.
int resId = R.attr.guidedStepTheme;
TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
+ boolean found = context.getTheme().resolveAttribute(resId, typedValue, true);
if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
if (found) {
ContextThemeWrapper themeWrapper =
- new ContextThemeWrapper(activity, typedValue.resourceId);
+ new ContextThemeWrapper(context, typedValue.resourceId);
if (isGuidedStepTheme(themeWrapper)) {
mThemeWrapper = themeWrapper;
} else {
@@ -1350,7 +1350,7 @@
Log.e(TAG, "GuidedStepFragment does not have an appropriate theme set.");
}
} else if (theme != -1) {
- mThemeWrapper = new ContextThemeWrapper(activity, theme);
+ mThemeWrapper = new ContextThemeWrapper(context, theme);
}
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
index 32de1fd..f68366c 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
@@ -1132,7 +1132,7 @@
} else {
// when there are two actions panel, we need adjust the weight of action to
// guidedActionContentWidthWeightTwoPanels.
- Context ctx = mThemeWrapper != null ? mThemeWrapper : getActivity();
+ Context ctx = mThemeWrapper != null ? mThemeWrapper : getContext();
TypedValue typedValue = new TypedValue();
if (ctx.getTheme().resolveAttribute(R.attr.guidedActionContentWidthWeightTwoPanels,
typedValue, true)) {
@@ -1330,18 +1330,18 @@
private void resolveTheme() {
// Look up the guidedStepTheme in the currently specified theme. If it exists,
// replace the theme with its value.
- FragmentActivity activity = getActivity();
+ Context context = getContext();
int theme = onProvideTheme();
- if (theme == -1 && !isGuidedStepTheme(activity)) {
+ if (theme == -1 && !isGuidedStepTheme(context)) {
// Look up the guidedStepTheme in the activity's currently specified theme. If it
// exists, replace the theme with its value.
int resId = R.attr.guidedStepTheme;
TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
+ boolean found = context.getTheme().resolveAttribute(resId, typedValue, true);
if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
if (found) {
ContextThemeWrapper themeWrapper =
- new ContextThemeWrapper(activity, typedValue.resourceId);
+ new ContextThemeWrapper(context, typedValue.resourceId);
if (isGuidedStepTheme(themeWrapper)) {
mThemeWrapper = themeWrapper;
} else {
@@ -1353,7 +1353,7 @@
Log.e(TAG, "GuidedStepSupportFragment does not have an appropriate theme set.");
}
} else if (theme != -1) {
- mThemeWrapper = new ContextThemeWrapper(activity, theme);
+ mThemeWrapper = new ContextThemeWrapper(context, theme);
}
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
index d67cdf2..564c3c7 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
@@ -22,8 +22,8 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
-import android.app.Activity;
import android.app.Fragment;
+import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v17.leanback.R;
@@ -274,8 +274,9 @@
mLogoView = (ImageView) view.findViewById(R.id.logo);
mTitleView = (TextView) view.findViewById(R.id.title);
mDescriptionView = (TextView) view.findViewById(R.id.description);
+ final Context context = FragmentUtil.getContext(this);
if (sSlideDistance == 0) {
- sSlideDistance = (int) (SLIDE_DISTANCE * getActivity().getResources()
+ sSlideDistance = (int) (SLIDE_DISTANCE * context.getResources()
.getDisplayMetrics().scaledDensity);
}
if (savedInstanceState == null) {
@@ -319,20 +320,20 @@
}
private void resolveTheme() {
- Activity activity = getActivity();
+ final Context context = FragmentUtil.getContext(this);
int theme = onProvideTheme();
if (theme == -1) {
// Look up the onboardingTheme in the activity's currently specified theme. If it
// exists, wrap the theme with its value.
int resId = R.attr.onboardingTheme;
TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
+ boolean found = context.getTheme().resolveAttribute(resId, typedValue, true);
if (DEBUG) Log.v(TAG, "Found onboarding theme reference? " + found);
if (found) {
- mThemeWrapper = new ContextThemeWrapper(activity, typedValue.resourceId);
+ mThemeWrapper = new ContextThemeWrapper(context, typedValue.resourceId);
}
} else {
- mThemeWrapper = new ContextThemeWrapper(activity, theme);
+ mThemeWrapper = new ContextThemeWrapper(context, theme);
}
}
@@ -373,13 +374,14 @@
}
boolean startLogoAnimation() {
+ final Context context = FragmentUtil.getContext(this);
Animator animator = null;
if (mLogoResourceId != 0) {
mLogoView.setVisibility(View.VISIBLE);
mLogoView.setImageResource(mLogoResourceId);
- Animator inAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator inAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_logo_enter);
- Animator outAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator outAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_logo_exit);
outAnimator.setStartDelay(LOGO_SPLASH_PAUSE_DURATION_MS);
AnimatorSet logoAnimator = new AnimatorSet();
@@ -393,7 +395,7 @@
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- if (getActivity() != null) {
+ if (context != null) {
startEnterAnimation();
}
}
@@ -424,7 +426,8 @@
}
// Create custom views.
- LayoutInflater inflater = getThemeInflater(LayoutInflater.from(getActivity()));
+ LayoutInflater inflater = getThemeInflater(LayoutInflater.from(
+ FragmentUtil.getContext(this)));
ViewGroup backgroundContainer = (ViewGroup) container.findViewById(
R.id.background_container);
View background = onCreateBackgroundView(inflater, backgroundContainer);
@@ -466,7 +469,8 @@
mEnterTransitionFinished = true;
initializeViews(getView());
List<Animator> animators = new ArrayList<>();
- Animator animator = AnimatorInflater.loadAnimator(getActivity(),
+ final Context context = FragmentUtil.getContext(this);
+ Animator animator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_enter);
animator.setTarget(getPageCount() <= 1 ? mStartButton : mPageIndicator);
animators.add(animator);
@@ -507,7 +511,7 @@
* default fade and slide animation. Returning null will disable the animation.
*/
protected Animator onCreateDescriptionAnimator() {
- return AnimatorInflater.loadAnimator(getActivity(),
+ return AnimatorInflater.loadAnimator(FragmentUtil.getContext(this),
R.animator.lb_onboarding_description_enter);
}
@@ -516,7 +520,7 @@
* default fade and slide animation. Returning null will disable the animation.
*/
protected Animator onCreateTitleAnimator() {
- return AnimatorInflater.loadAnimator(getActivity(),
+ return AnimatorInflater.loadAnimator(FragmentUtil.getContext(this),
R.animator.lb_onboarding_title_enter);
}
@@ -645,10 +649,11 @@
}
});
+ final Context context = FragmentUtil.getContext(this);
// Animator for switching between page indicator and button.
if (getCurrentPageIndex() == getPageCount() - 1) {
mStartButton.setVisibility(View.VISIBLE);
- Animator navigatorFadeOutAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator navigatorFadeOutAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_fade_out);
navigatorFadeOutAnimator.setTarget(mPageIndicator);
navigatorFadeOutAnimator.addListener(new AnimatorListenerAdapter() {
@@ -658,17 +663,17 @@
}
});
animators.add(navigatorFadeOutAnimator);
- Animator buttonFadeInAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator buttonFadeInAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_start_button_fade_in);
buttonFadeInAnimator.setTarget(mStartButton);
animators.add(buttonFadeInAnimator);
} else if (previousPage == getPageCount() - 1) {
mPageIndicator.setVisibility(View.VISIBLE);
- Animator navigatorFadeInAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator navigatorFadeInAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_fade_in);
navigatorFadeInAnimator.setTarget(mPageIndicator);
animators.add(navigatorFadeInAnimator);
- Animator buttonFadeOutAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator buttonFadeOutAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_start_button_fade_out);
buttonFadeOutAnimator.setTarget(mStartButton);
buttonFadeOutAnimator.addListener(new AnimatorListenerAdapter() {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
index 75daf31..5df8f41 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
@@ -25,8 +25,8 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
-import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment;
+import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v17.leanback.R;
@@ -277,8 +277,9 @@
mLogoView = (ImageView) view.findViewById(R.id.logo);
mTitleView = (TextView) view.findViewById(R.id.title);
mDescriptionView = (TextView) view.findViewById(R.id.description);
+ final Context context = getContext();
if (sSlideDistance == 0) {
- sSlideDistance = (int) (SLIDE_DISTANCE * getActivity().getResources()
+ sSlideDistance = (int) (SLIDE_DISTANCE * context.getResources()
.getDisplayMetrics().scaledDensity);
}
if (savedInstanceState == null) {
@@ -322,20 +323,20 @@
}
private void resolveTheme() {
- FragmentActivity activity = getActivity();
+ final Context context = getContext();
int theme = onProvideTheme();
if (theme == -1) {
// Look up the onboardingTheme in the activity's currently specified theme. If it
// exists, wrap the theme with its value.
int resId = R.attr.onboardingTheme;
TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
+ boolean found = context.getTheme().resolveAttribute(resId, typedValue, true);
if (DEBUG) Log.v(TAG, "Found onboarding theme reference? " + found);
if (found) {
- mThemeWrapper = new ContextThemeWrapper(activity, typedValue.resourceId);
+ mThemeWrapper = new ContextThemeWrapper(context, typedValue.resourceId);
}
} else {
- mThemeWrapper = new ContextThemeWrapper(activity, theme);
+ mThemeWrapper = new ContextThemeWrapper(context, theme);
}
}
@@ -376,13 +377,14 @@
}
boolean startLogoAnimation() {
+ final Context context = getContext();
Animator animator = null;
if (mLogoResourceId != 0) {
mLogoView.setVisibility(View.VISIBLE);
mLogoView.setImageResource(mLogoResourceId);
- Animator inAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator inAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_logo_enter);
- Animator outAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator outAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_logo_exit);
outAnimator.setStartDelay(LOGO_SPLASH_PAUSE_DURATION_MS);
AnimatorSet logoAnimator = new AnimatorSet();
@@ -396,7 +398,7 @@
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- if (getActivity() != null) {
+ if (context != null) {
startEnterAnimation();
}
}
@@ -427,7 +429,8 @@
}
// Create custom views.
- LayoutInflater inflater = getThemeInflater(LayoutInflater.from(getActivity()));
+ LayoutInflater inflater = getThemeInflater(LayoutInflater.from(
+ getContext()));
ViewGroup backgroundContainer = (ViewGroup) container.findViewById(
R.id.background_container);
View background = onCreateBackgroundView(inflater, backgroundContainer);
@@ -469,7 +472,8 @@
mEnterTransitionFinished = true;
initializeViews(getView());
List<Animator> animators = new ArrayList<>();
- Animator animator = AnimatorInflater.loadAnimator(getActivity(),
+ final Context context = getContext();
+ Animator animator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_enter);
animator.setTarget(getPageCount() <= 1 ? mStartButton : mPageIndicator);
animators.add(animator);
@@ -510,7 +514,7 @@
* default fade and slide animation. Returning null will disable the animation.
*/
protected Animator onCreateDescriptionAnimator() {
- return AnimatorInflater.loadAnimator(getActivity(),
+ return AnimatorInflater.loadAnimator(getContext(),
R.animator.lb_onboarding_description_enter);
}
@@ -519,7 +523,7 @@
* default fade and slide animation. Returning null will disable the animation.
*/
protected Animator onCreateTitleAnimator() {
- return AnimatorInflater.loadAnimator(getActivity(),
+ return AnimatorInflater.loadAnimator(getContext(),
R.animator.lb_onboarding_title_enter);
}
@@ -648,10 +652,11 @@
}
});
+ final Context context = getContext();
// Animator for switching between page indicator and button.
if (getCurrentPageIndex() == getPageCount() - 1) {
mStartButton.setVisibility(View.VISIBLE);
- Animator navigatorFadeOutAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator navigatorFadeOutAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_fade_out);
navigatorFadeOutAnimator.setTarget(mPageIndicator);
navigatorFadeOutAnimator.addListener(new AnimatorListenerAdapter() {
@@ -661,17 +666,17 @@
}
});
animators.add(navigatorFadeOutAnimator);
- Animator buttonFadeInAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator buttonFadeInAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_start_button_fade_in);
buttonFadeInAnimator.setTarget(mStartButton);
animators.add(buttonFadeInAnimator);
} else if (previousPage == getPageCount() - 1) {
mPageIndicator.setVisibility(View.VISIBLE);
- Animator navigatorFadeInAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator navigatorFadeInAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_page_indicator_fade_in);
navigatorFadeInAnimator.setTarget(mPageIndicator);
animators.add(navigatorFadeInAnimator);
- Animator buttonFadeOutAnimator = AnimatorInflater.loadAnimator(getActivity(),
+ Animator buttonFadeOutAnimator = AnimatorInflater.loadAnimator(context,
R.animator.lb_onboarding_start_button_fade_out);
buttonFadeOutAnimator.setTarget(mStartButton);
buttonFadeOutAnimator.addListener(new AnimatorListenerAdapter() {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
index 02a0257..4e04e51 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
@@ -452,11 +452,12 @@
}
};
- mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mBgFadeInAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_in);
mBgFadeInAnimator.addUpdateListener(listener);
mBgFadeInAnimator.addListener(mFadeListener);
- mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
+ mBgFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_out);
mBgFadeOutAnimator.addUpdateListener(listener);
mBgFadeOutAnimator.addListener(mFadeListener);
}
@@ -498,14 +499,14 @@
}
};
- mControlRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mControlRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mControlRowFadeInAnimator.addUpdateListener(updateListener);
mControlRowFadeInAnimator.addListener(listener);
mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mControlRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mControlRowFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_controls_fade_out);
mControlRowFadeOutAnimator.addUpdateListener(updateListener);
mControlRowFadeOutAnimator.addListener(listener);
mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
@@ -543,14 +544,13 @@
}
};
- mOtherRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mOtherRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mOtherRowFadeInAnimator.addListener(listener);
mOtherRowFadeInAnimator.addUpdateListener(updateListener);
mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mOtherRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mOtherRowFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_out);
mOtherRowFadeOutAnimator.addListener(listener);
mOtherRowFadeOutAnimator.addUpdateListener(updateListener);
mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator());
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
index 33e35eb..3b8cfd3 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
@@ -433,11 +433,12 @@
}
};
- mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mBgFadeInAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_in);
mBgFadeInAnimator.addUpdateListener(listener);
mBgFadeInAnimator.addListener(mFadeListener);
- mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
+ mBgFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_out);
mBgFadeOutAnimator.addUpdateListener(listener);
mBgFadeOutAnimator.addListener(mFadeListener);
}
@@ -479,14 +480,14 @@
}
};
- mControlRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mControlRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mControlRowFadeInAnimator.addUpdateListener(updateListener);
mControlRowFadeInAnimator.addListener(listener);
mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mControlRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mControlRowFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_controls_fade_out);
mControlRowFadeOutAnimator.addUpdateListener(updateListener);
mControlRowFadeOutAnimator.addListener(listener);
mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
@@ -524,14 +525,13 @@
}
};
- mOtherRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mOtherRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mOtherRowFadeInAnimator.addListener(listener);
mOtherRowFadeInAnimator.addUpdateListener(updateListener);
mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mOtherRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mOtherRowFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_out);
mOtherRowFadeOutAnimator.addListener(listener);
mOtherRowFadeOutAnimator.addUpdateListener(updateListener);
mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator());
@@ -557,13 +557,14 @@
}
};
- mDescriptionFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_description_fade_in);
+ Context context = FragmentUtil.getContext(this);
+ mDescriptionFadeInAnimator = loadAnimator(context,
+ R.animator.lb_playback_description_fade_in);
mDescriptionFadeInAnimator.addUpdateListener(listener);
mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mDescriptionFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_description_fade_out);
+ mDescriptionFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_description_fade_out);
mDescriptionFadeOutAnimator.addUpdateListener(listener);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
index d41d65f..b58a2ad 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
@@ -436,11 +436,12 @@
}
};
- mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
+ Context context = getContext();
+ mBgFadeInAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_in);
mBgFadeInAnimator.addUpdateListener(listener);
mBgFadeInAnimator.addListener(mFadeListener);
- mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
+ mBgFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_out);
mBgFadeOutAnimator.addUpdateListener(listener);
mBgFadeOutAnimator.addListener(mFadeListener);
}
@@ -482,14 +483,14 @@
}
};
- mControlRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = getContext();
+ mControlRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mControlRowFadeInAnimator.addUpdateListener(updateListener);
mControlRowFadeInAnimator.addListener(listener);
mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mControlRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mControlRowFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_controls_fade_out);
mControlRowFadeOutAnimator.addUpdateListener(updateListener);
mControlRowFadeOutAnimator.addListener(listener);
mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
@@ -527,14 +528,13 @@
}
};
- mOtherRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = getContext();
+ mOtherRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mOtherRowFadeInAnimator.addListener(listener);
mOtherRowFadeInAnimator.addUpdateListener(updateListener);
mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mOtherRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mOtherRowFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_out);
mOtherRowFadeOutAnimator.addListener(listener);
mOtherRowFadeOutAnimator.addUpdateListener(updateListener);
mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator());
@@ -560,13 +560,14 @@
}
};
- mDescriptionFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_description_fade_in);
+ Context context = getContext();
+ mDescriptionFadeInAnimator = loadAnimator(context,
+ R.animator.lb_playback_description_fade_in);
mDescriptionFadeInAnimator.addUpdateListener(listener);
mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mDescriptionFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_description_fade_out);
+ mDescriptionFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_description_fade_out);
mDescriptionFadeOutAnimator.addUpdateListener(listener);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
index 07701f9..3d3ff7e 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
@@ -455,11 +455,12 @@
}
};
- mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
+ Context context = getContext();
+ mBgFadeInAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_in);
mBgFadeInAnimator.addUpdateListener(listener);
mBgFadeInAnimator.addListener(mFadeListener);
- mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
+ mBgFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_bg_fade_out);
mBgFadeOutAnimator.addUpdateListener(listener);
mBgFadeOutAnimator.addListener(mFadeListener);
}
@@ -501,14 +502,14 @@
}
};
- mControlRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = getContext();
+ mControlRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mControlRowFadeInAnimator.addUpdateListener(updateListener);
mControlRowFadeInAnimator.addListener(listener);
mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mControlRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mControlRowFadeOutAnimator = loadAnimator(context,
+ R.animator.lb_playback_controls_fade_out);
mControlRowFadeOutAnimator.addUpdateListener(updateListener);
mControlRowFadeOutAnimator.addListener(listener);
mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
@@ -546,14 +547,13 @@
}
};
- mOtherRowFadeInAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_in);
+ Context context = getContext();
+ mOtherRowFadeInAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_in);
mOtherRowFadeInAnimator.addListener(listener);
mOtherRowFadeInAnimator.addUpdateListener(updateListener);
mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
- mOtherRowFadeOutAnimator = loadAnimator(
- getActivity(), R.animator.lb_playback_controls_fade_out);
+ mOtherRowFadeOutAnimator = loadAnimator(context, R.animator.lb_playback_controls_fade_out);
mOtherRowFadeOutAnimator.addListener(listener);
mOtherRowFadeOutAnimator.addUpdateListener(updateListener);
mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator());
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
index 93886f9..d2b9bb1 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
@@ -391,7 +391,8 @@
super.onResume();
mIsPaused = false;
if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer) {
- mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getActivity());
+ mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(
+ FragmentUtil.getContext(this));
mSearchBar.setSpeechRecognizer(mSpeechRecognizer);
}
if (mPendingStartRecognitionWhenPaused) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
index c8a058d..b870d79 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
@@ -394,7 +394,8 @@
super.onResume();
mIsPaused = false;
if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer) {
- mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getActivity());
+ mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(
+ getContext());
mSearchBar.setSpeechRecognizer(mSpeechRecognizer);
}
if (mPendingStartRecognitionWhenPaused) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
index b8f3df2..cfa27df 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
@@ -13,9 +13,11 @@
*/
package android.support.v17.leanback.app;
+import android.os.Bundle;
import android.support.v17.leanback.R;
import android.support.v17.leanback.transition.TransitionHelper;
import android.support.v17.leanback.widget.BrowseFrameLayout;
+import android.support.v17.leanback.widget.ObjectAdapter;
import android.support.v17.leanback.widget.OnChildLaidOutListener;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
@@ -23,8 +25,6 @@
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.support.v17.leanback.widget.VerticalGridPresenter;
-import android.support.v17.leanback.widget.ObjectAdapter;
-import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -223,7 +223,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(FragmentUtil.getContext(this),
R.transition.lb_vertical_grid_entrance_transition);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
index 2a87f10..55e079d 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
@@ -16,9 +16,11 @@
*/
package android.support.v17.leanback.app;
+import android.os.Bundle;
import android.support.v17.leanback.R;
import android.support.v17.leanback.transition.TransitionHelper;
import android.support.v17.leanback.widget.BrowseFrameLayout;
+import android.support.v17.leanback.widget.ObjectAdapter;
import android.support.v17.leanback.widget.OnChildLaidOutListener;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
@@ -26,8 +28,6 @@
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.support.v17.leanback.widget.VerticalGridPresenter;
-import android.support.v17.leanback.widget.ObjectAdapter;
-import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -226,7 +226,7 @@
@Override
protected Object createEntranceTransition() {
- return TransitionHelper.loadTransition(getActivity(),
+ return TransitionHelper.loadTransition(getContext(),
R.transition.lb_vertical_grid_entrance_transition);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VideoFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VideoFragment.java
index fa9989e..9906813 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VideoFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VideoFragment.java
@@ -39,7 +39,7 @@
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState);
- mVideoSurface = (SurfaceView) getActivity().getLayoutInflater().inflate(
+ mVideoSurface = (SurfaceView) LayoutInflater.from(FragmentUtil.getContext(this)).inflate(
R.layout.lb_video_surface, root, false);
root.addView(mVideoSurface, 0);
mVideoSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VideoSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VideoSupportFragment.java
index 0f76e6e..29f1faf 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VideoSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VideoSupportFragment.java
@@ -42,7 +42,7 @@
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState);
- mVideoSurface = (SurfaceView) getActivity().getLayoutInflater().inflate(
+ mVideoSurface = (SurfaceView) LayoutInflater.from(getContext()).inflate(
R.layout.lb_video_surface, root, false);
root.addView(mVideoSurface, 0);
mVideoSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
diff --git a/v4/build.gradle b/v4/build.gradle
index ae7e723..a12fc83 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -24,12 +24,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index ade9fb1..b571334 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -45,12 +45,3 @@
inceptionYear '2011'
description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 4 or later."
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v11/themes_base.xml b/v7/appcompat/res/values-v11/themes_base.xml
index d38ef32..11ef632 100644
--- a/v7/appcompat/res/values-v11/themes_base.xml
+++ b/v7/appcompat/res/values-v11/themes_base.xml
@@ -32,6 +32,7 @@
<item name="android:buttonBarStyle">?attr/buttonBarStyle</item>
<item name="android:buttonBarButtonStyle">?attr/buttonBarButtonStyle</item>
+ <item name="android:borderlessButtonStyle">?attr/borderlessButtonStyle</item>
<!-- Window colors -->
<item name="android:colorForeground">@color/foreground_material_dark</item>
@@ -86,6 +87,7 @@
<item name="android:buttonBarStyle">?attr/buttonBarStyle</item>
<item name="android:buttonBarButtonStyle">?attr/buttonBarButtonStyle</item>
+ <item name="android:borderlessButtonStyle">?attr/borderlessButtonStyle</item>
<!-- Window colors -->
<item name="android:colorForeground">@color/foreground_material_light</item>
diff --git a/v7/cardview/build.gradle b/v7/cardview/build.gradle
index c9d4db8..665d655 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -29,12 +29,3 @@
inceptionYear '2011'
description 'Android Support CardView v7'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index f007373..b2fea02 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -34,12 +34,3 @@
inceptionYear '2013'
description 'Android Support Grid Layout'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index 61f2a8b..936496a 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -33,12 +33,3 @@
inceptionYear '2013'
description 'Android MediaRouter Support Library'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
index ae74f95..c6a2d67 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
@@ -451,37 +451,42 @@
}
void refreshRoute() {
+ final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
+ final boolean isRemote = !route.isDefaultOrBluetooth() && route.matchesSelector(mSelector);
+ final boolean isConnecting = isRemote && route.isConnecting();
+ boolean needsRefresh = false;
+ if (mRemoteActive != isRemote) {
+ mRemoteActive = isRemote;
+ needsRefresh = true;
+ }
+ if (mIsConnecting != isConnecting) {
+ mIsConnecting = isConnecting;
+ needsRefresh = true;
+ }
+
+ if (needsRefresh) {
+ updateContentDescription();
+ refreshDrawableState();
+ }
if (mAttachedToWindow) {
- final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- final boolean isRemote = !route.isDefaultOrBluetooth()
- && route.matchesSelector(mSelector);
- final boolean isConnecting = isRemote && route.isConnecting();
-
- boolean needsRefresh = false;
- if (mRemoteActive != isRemote) {
- mRemoteActive = isRemote;
- needsRefresh = true;
- }
- if (mIsConnecting != isConnecting) {
- mIsConnecting = isConnecting;
- needsRefresh = true;
- }
-
- if (needsRefresh) {
- updateContentDescription();
- refreshDrawableState();
- if (mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
- AnimationDrawable curDrawable =
- (AnimationDrawable) mRemoteIndicator.getCurrent();
- if (!curDrawable.isRunning()) {
- curDrawable.start();
- }
- }
- }
-
setEnabled(mRouter.isRouteAvailable(mSelector,
MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
}
+ if (mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
+ AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
+ if (mAttachedToWindow) {
+ if ((needsRefresh || isConnecting) && !curDrawable.isRunning()) {
+ curDrawable.start();
+ }
+ } else if (isRemote && !isConnecting) {
+ // When the route is already connected before the view is attached, show the last
+ // frame of the connected animation immediately.
+ if (curDrawable.isRunning()) {
+ curDrawable.stop();
+ }
+ curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
+ }
+ }
}
private void updateContentDescription() {
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index 70e740a..be16341 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -24,12 +24,3 @@
inceptionYear '2014'
description 'Android Support Palette v7'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index 74d4286..0acb240 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -61,12 +61,3 @@
inceptionYear '2015'
description 'Android Support Preference v7'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index 4fd4b3e..0ab61c9 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -49,12 +49,3 @@
inceptionYear '2014'
description 'Android Support RecyclerView v7'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
index 0d39fed..d5600c0 100644
--- a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
@@ -1057,7 +1057,7 @@
*/
public void startDrag(ViewHolder viewHolder) {
if (!mCallback.hasDragFlag(mRecyclerView, viewHolder)) {
- Log.e(TAG, "Start drag has been called but swiping is not enabled");
+ Log.e(TAG, "Start drag has been called but dragging is not enabled");
return;
}
if (viewHolder.itemView.getParent() != mRecyclerView) {
@@ -1104,7 +1104,7 @@
*/
public void startSwipe(ViewHolder viewHolder) {
if (!mCallback.hasSwipeFlag(mRecyclerView, viewHolder)) {
- Log.e(TAG, "Start swipe has been called but dragging is not enabled");
+ Log.e(TAG, "Start swipe has been called but swiping is not enabled");
return;
}
if (viewHolder.itemView.getParent() != mRecyclerView) {
diff --git a/v8/Android.mk b/v8/Android.mk
deleted file mode 100644
index 14ff0aa..0000000
--- a/v8/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/wearable/build.gradle b/wearable/build.gradle
index e680623..2102c4f 100644
--- a/wearable/build.gradle
+++ b/wearable/build.gradle
@@ -42,12 +42,3 @@
inceptionYear '2016'
description 'Android Wear Support UI'
}
-
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: uri(rootProject.ext.supportRepoOut)) {
- }
- }
- }
-}