Merge "Grid/CellContent changes to know # of lines in a row"
diff --git a/asynclayoutinflater/api/current.txt b/asynclayoutinflater/api/current.txt
new file mode 100644
index 0000000..83a85be
--- /dev/null
+++ b/asynclayoutinflater/api/current.txt
@@ -0,0 +1,13 @@
+package android.support.v4.view {
+
+ public final class AsyncLayoutInflater {
+ ctor public AsyncLayoutInflater(android.content.Context);
+ method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
+ }
+
+ public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
+ method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
+ }
+
+}
+
diff --git a/asynclayoutinflater/build.gradle b/asynclayoutinflater/build.gradle
new file mode 100644
index 0000000..597b01d
--- /dev/null
+++ b/asynclayoutinflater/build.gradle
@@ -0,0 +1,20 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+}
+
+supportLibrary {
+ name = "Android Support Library Async Layout Inflater"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/asynclayoutinflater/src/main/AndroidManifest.xml b/asynclayoutinflater/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a98f288
--- /dev/null
+++ b/asynclayoutinflater/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.asynclayoutinflater"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java b/asynclayoutinflater/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
rename to asynclayoutinflater/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
index 383c3d0..ac74c0d 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
@@ -46,9 +46,9 @@
val LIFECYCLES_VIEWMODEL = LIFECYCLES_EXT
/**
- * Version code for RecyclerView & Room paging
+ * Version code for Paging
*/
- val PAGING = Version("1.0.0-alpha5")
+ val PAGING = Version("1.0.0-alpha6")
private val LIFECYCLES = Version("1.1.0")
diff --git a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
index 6db309e..69419d4 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
@@ -47,15 +47,6 @@
library.defaultConfig.minSdkVersion(supportLibraryExtension.minSdkVersion)
- if (supportLibraryExtension.legacySourceLocation) {
- // We use a non-standard test directory structure.
- val androidTest = library.sourceSets.getByName("androidTest")
- androidTest.setRoot("tests")
- androidTest.java.srcDir("tests/src")
- androidTest.res.srcDir("tests/res")
- androidTest.manifest.srcFile("tests/AndroidManifest.xml")
- }
-
// Java 8 is only fully supported on API 24+ and not all Java 8 features are binary
// compatible with API < 24, so use Java 7 for both source AND target.
val javaVersion: JavaVersion
@@ -175,10 +166,6 @@
lintOptions.fatal("MissingTranslation")
}
- if (System.getenv("GRADLE_PLUGIN_VERSION") != null) {
- lintOptions.check("NewApi")
- }
-
// Set baseline file for all legacy lint warnings.
if (baseline.exists()) {
lintOptions.baseline(baseline)
diff --git a/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt b/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
index c6b5fa5..fb2f3b5 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
@@ -33,7 +33,6 @@
var url = SUPPORT_URL
private var licenses: MutableCollection<License> = ArrayList()
var java8Library = false
- var legacySourceLocation = false
var publish = false
/**
* This flag works only if publish flag is "true".
diff --git a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
index 7345733..0844832 100644
--- a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
@@ -50,6 +50,12 @@
// Support library dependencies needed for projects that compile against prebuilt versions
// instead of source directly.
+// NOTE: _27 versions exist for modules that have opted-in to 27, and tests that depend on those
+// modules. Other projects may stick to older versions to avoid forcing users to update.
+private const val SUPPORT_VERSION_27 = "27.1.0"
+const val SUPPORT_RECYCLERVIEW_27 = "com.android.support:recyclerview-v7:$SUPPORT_VERSION_27"
+const val SUPPORT_APPCOMPAT_27 = "com.android.support:appcompat-v7:$SUPPORT_VERSION_27"
+
private const val SUPPORT_VERSION = "26.1.0"
const val SUPPORT_ANNOTATIONS = "com.android.support:support-annotations:$SUPPORT_VERSION"
const val SUPPORT_APPCOMPAT = "com.android.support:appcompat-v7:$SUPPORT_VERSION"
diff --git a/car/src/androidTest/NO_DOCS b/car/src/androidTest/NO_DOCS
deleted file mode 100644
index bd77b1a..0000000
--- a/car/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/collections/build.gradle b/collections/build.gradle
new file mode 100644
index 0000000..3145c4a
--- /dev/null
+++ b/collections/build.gradle
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportJavaLibraryPlugin")
+}
+
+dependencies {
+ compile(project(":support-annotations"))
+ testCompile(JUNIT)
+}
+
+supportLibrary {
+ name = "Android Support Library collections"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ description = "Standalone efficient collections."
+}
diff --git a/compat/src/main/java/android/support/v4/util/ArrayMap.java b/collections/src/main/java/android/support/v4/util/ArrayMap.java
similarity index 98%
rename from compat/src/main/java/android/support/v4/util/ArrayMap.java
rename to collections/src/main/java/android/support/v4/util/ArrayMap.java
index 0a8a0ab..1948093 100644
--- a/compat/src/main/java/android/support/v4/util/ArrayMap.java
+++ b/collections/src/main/java/android/support/v4/util/ArrayMap.java
@@ -24,7 +24,7 @@
* ArrayMap is a generic key->value mapping data structure that is
* designed to be more memory efficient than a traditional {@link java.util.HashMap},
* this implementation is a version of the platform's
- * {@link android.util.ArrayMap} that can be used on older versions of the platform.
+ * {@code android.util.ArrayMap} that can be used on older versions of the platform.
* It keeps its mappings in an array data structure -- an integer array of hash
* codes for each item, and an Object array of the key/value pairs. This allows it to
* avoid having to create an extra object for every entry put in to the map, and it
diff --git a/compat/src/main/java/android/support/v4/util/ArraySet.java b/collections/src/main/java/android/support/v4/util/ArraySet.java
similarity index 94%
rename from compat/src/main/java/android/support/v4/util/ArraySet.java
rename to collections/src/main/java/android/support/v4/util/ArraySet.java
index 8444d2c..84073f0 100644
--- a/compat/src/main/java/android/support/v4/util/ArraySet.java
+++ b/collections/src/main/java/android/support/v4/util/ArraySet.java
@@ -21,7 +21,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
-import android.util.Log;
import java.lang.reflect.Array;
import java.util.Collection;
@@ -169,7 +168,7 @@
array[0] = array[1] = null;
sTwiceBaseCacheSize--;
if (DEBUG) {
- Log.d(TAG, "Retrieving 2x cache " + mHashes + " now have "
+ System.out.println(TAG + " Retrieving 2x cache " + mHashes + " now have "
+ sTwiceBaseCacheSize + " entries");
}
return;
@@ -185,8 +184,8 @@
array[0] = array[1] = null;
sBaseCacheSize--;
if (DEBUG) {
- Log.d(TAG, "Retrieving 1x cache " + mHashes + " now have " + sBaseCacheSize
- + " entries");
+ System.out.println(TAG + " Retrieving 1x cache " + mHashes + " now have "
+ + sBaseCacheSize + " entries");
}
return;
}
@@ -210,8 +209,8 @@
sTwiceBaseCache = array;
sTwiceBaseCacheSize++;
if (DEBUG) {
- Log.d(TAG, "Storing 2x cache " + array + " now have " + sTwiceBaseCacheSize
- + " entries");
+ System.out.println(TAG + " Storing 2x cache " + array + " now have "
+ + sTwiceBaseCacheSize + " entries");
}
}
}
@@ -226,7 +225,7 @@
sBaseCache = array;
sBaseCacheSize++;
if (DEBUG) {
- Log.d(TAG, "Storing 1x cache " + array + " now have "
+ System.out.println(TAG + " Storing 1x cache " + array + " now have "
+ sBaseCacheSize + " entries");
}
}
@@ -373,14 +372,14 @@
final int n = mSize >= (BASE_SIZE * 2) ? (mSize + (mSize >> 1))
: (mSize >= BASE_SIZE ? (BASE_SIZE * 2) : BASE_SIZE);
- if (DEBUG) Log.d(TAG, "add: grow from " + mHashes.length + " to " + n);
+ if (DEBUG) System.out.println(TAG + " add: grow from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
allocArrays(n);
if (mHashes.length > 0) {
- if (DEBUG) Log.d(TAG, "add: copy 0-" + mSize + " to 0");
+ if (DEBUG) System.out.println(TAG + " add: copy 0-" + mSize + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
@@ -390,7 +389,8 @@
if (index < mSize) {
if (DEBUG) {
- Log.d(TAG, "add: move " + index + "-" + (mSize - index) + " to " + (index + 1));
+ System.out.println(TAG + " add: move " + index + "-" + (mSize - index) + " to "
+ + (index + 1));
}
System.arraycopy(mHashes, index, mHashes, index + 1, mSize - index);
System.arraycopy(mArray, index, mArray, index + 1, mSize - index);
@@ -418,10 +418,10 @@
// Cannot optimize since it would break the sorted order - fallback to add()
if (DEBUG) {
RuntimeException e = new RuntimeException("here");
- e.fillInStackTrace();
- Log.w(TAG, "New hash " + hash
+ System.err.println(TAG + " New hash " + hash
+ " is before end of array hash " + mHashes[index - 1]
- + " at index " + index, e);
+ + " at index " + index);
+ e.printStackTrace();
}
add(value);
return;
@@ -476,7 +476,7 @@
final Object old = mArray[index];
if (mSize <= 1) {
// Now empty.
- if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
+ if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to 0");
freeArrays(mHashes, mArray, mSize);
mHashes = INT;
mArray = OBJECT;
@@ -488,7 +488,7 @@
// that and BASE_SIZE.
final int n = mSize > (BASE_SIZE * 2) ? (mSize + (mSize >> 1)) : (BASE_SIZE * 2);
- if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
+ if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
@@ -496,13 +496,13 @@
mSize--;
if (index > 0) {
- if (DEBUG) Log.d(TAG, "remove: copy from 0-" + index + " to 0");
+ if (DEBUG) System.out.println(TAG + " remove: copy from 0-" + index + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, index);
System.arraycopy(oarray, 0, mArray, 0, index);
}
if (index < mSize) {
if (DEBUG) {
- Log.d(TAG, "remove: copy from " + (index + 1) + "-" + mSize
+ System.out.println(TAG + " remove: copy from " + (index + 1) + "-" + mSize
+ " to " + index);
}
System.arraycopy(ohashes, index + 1, mHashes, index, mSize - index);
@@ -512,7 +512,7 @@
mSize--;
if (index < mSize) {
if (DEBUG) {
- Log.d(TAG, "remove: move " + (index + 1) + "-" + mSize + " to " + index);
+ System.out.println(TAG + " remove: move " + (index + 1) + "-" + mSize + " to " + index);
}
System.arraycopy(mHashes, index + 1, mHashes, index, mSize - index);
System.arraycopy(mArray, index + 1, mArray, index, mSize - index);
diff --git a/compat/src/main/java/android/support/v4/util/CircularArray.java b/collections/src/main/java/android/support/v4/util/CircularArray.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/CircularArray.java
rename to collections/src/main/java/android/support/v4/util/CircularArray.java
diff --git a/compat/src/main/java/android/support/v4/util/CircularIntArray.java b/collections/src/main/java/android/support/v4/util/CircularIntArray.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/CircularIntArray.java
rename to collections/src/main/java/android/support/v4/util/CircularIntArray.java
diff --git a/compat/src/main/java/android/support/v4/util/ContainerHelpers.java b/collections/src/main/java/android/support/v4/util/ContainerHelpers.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/ContainerHelpers.java
rename to collections/src/main/java/android/support/v4/util/ContainerHelpers.java
diff --git a/compat/src/main/java/android/support/v4/util/LongSparseArray.java b/collections/src/main/java/android/support/v4/util/LongSparseArray.java
similarity index 99%
rename from compat/src/main/java/android/support/v4/util/LongSparseArray.java
rename to collections/src/main/java/android/support/v4/util/LongSparseArray.java
index febb5d5..9285619 100644
--- a/compat/src/main/java/android/support/v4/util/LongSparseArray.java
+++ b/collections/src/main/java/android/support/v4/util/LongSparseArray.java
@@ -18,7 +18,7 @@
/**
* SparseArray mapping longs to Objects, a version of the platform's
- * {@link android.util.LongSparseArray} that can be used on older versions of the
+ * {@code android.util.LongSparseArray} that can be used on older versions of the
* platform. Unlike a normal array of Objects,
* there can be gaps in the indices. It is intended to be more memory efficient
* than using a HashMap to map Longs to Objects, both because it avoids
diff --git a/compat/src/main/java/android/support/v4/util/LruCache.java b/collections/src/main/java/android/support/v4/util/LruCache.java
similarity index 99%
rename from compat/src/main/java/android/support/v4/util/LruCache.java
rename to collections/src/main/java/android/support/v4/util/LruCache.java
index 944b354..d41f4fb 100644
--- a/compat/src/main/java/android/support/v4/util/LruCache.java
+++ b/collections/src/main/java/android/support/v4/util/LruCache.java
@@ -21,7 +21,7 @@
import java.util.Map;
/**
- * Static library version of {@link android.util.LruCache}. Used to write apps
+ * Static library version of {@code android.util.LruCache}. Used to write apps
* that run on API levels prior to 12. When running on API level 12 or above,
* this implementation is still used; it does not try to switch to the
* framework's implementation. See the framework SDK documentation for a class
diff --git a/compat/src/main/java/android/support/v4/util/MapCollections.java b/collections/src/main/java/android/support/v4/util/MapCollections.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/MapCollections.java
rename to collections/src/main/java/android/support/v4/util/MapCollections.java
diff --git a/compat/src/main/java/android/support/v4/util/SimpleArrayMap.java b/collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
similarity index 94%
rename from compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
rename to collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
index 06e68f0..247451f 100644
--- a/compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
+++ b/collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
@@ -16,8 +16,6 @@
package android.support.v4.util;
-import android.util.Log;
-
import java.util.ConcurrentModificationException;
import java.util.Map;
@@ -170,7 +168,7 @@
mHashes = (int[])array[1];
array[0] = array[1] = null;
mTwiceBaseCacheSize--;
- if (DEBUG) Log.d(TAG, "Retrieving 2x cache " + mHashes
+ if (DEBUG) System.out.println(TAG + " Retrieving 2x cache " + mHashes
+ " now have " + mTwiceBaseCacheSize + " entries");
return;
}
@@ -184,7 +182,7 @@
mHashes = (int[])array[1];
array[0] = array[1] = null;
mBaseCacheSize--;
- if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
+ if (DEBUG) System.out.println(TAG + " Retrieving 1x cache " + mHashes
+ " now have " + mBaseCacheSize + " entries");
return;
}
@@ -207,7 +205,7 @@
}
mTwiceBaseCache = array;
mTwiceBaseCacheSize++;
- if (DEBUG) Log.d(TAG, "Storing 2x cache " + array
+ if (DEBUG) System.out.println(TAG + " Storing 2x cache " + array
+ " now have " + mTwiceBaseCacheSize + " entries");
}
}
@@ -221,7 +219,7 @@
}
mBaseCache = array;
mBaseCacheSize++;
- if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
+ if (DEBUG) System.out.println(TAG + " Storing 1x cache " + array
+ " now have " + mBaseCacheSize + " entries");
}
}
@@ -430,7 +428,7 @@
final int n = osize >= (BASE_SIZE*2) ? (osize+(osize>>1))
: (osize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
- if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
+ if (DEBUG) System.out.println(TAG + " put: grow from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
@@ -441,7 +439,7 @@
}
if (mHashes.length > 0) {
- if (DEBUG) Log.d(TAG, "put: copy 0-" + osize + " to 0");
+ if (DEBUG) System.out.println(TAG + " put: copy 0-" + osize + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
@@ -450,7 +448,7 @@
}
if (index < osize) {
- if (DEBUG) Log.d(TAG, "put: move " + index + "-" + (osize-index)
+ if (DEBUG) System.out.println(TAG + " put: move " + index + "-" + (osize-index)
+ " to " + (index+1));
System.arraycopy(mHashes, index, mHashes, index + 1, osize - index);
System.arraycopy(mArray, index << 1, mArray, (index + 1) << 1, (mSize - index) << 1);
@@ -515,7 +513,7 @@
final int nsize;
if (osize <= 1) {
// Now empty.
- if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
+ if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to 0");
freeArrays(mHashes, mArray, osize);
mHashes = ContainerHelpers.EMPTY_INTS;
mArray = ContainerHelpers.EMPTY_OBJECTS;
@@ -528,7 +526,7 @@
// that and BASE_SIZE.
final int n = osize > (BASE_SIZE*2) ? (osize + (osize>>1)) : (BASE_SIZE*2);
- if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
+ if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
@@ -539,12 +537,12 @@
}
if (index > 0) {
- if (DEBUG) Log.d(TAG, "remove: copy from 0-" + index + " to 0");
+ if (DEBUG) System.out.println(TAG + " remove: copy from 0-" + index + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, index);
System.arraycopy(oarray, 0, mArray, 0, index << 1);
}
if (index < nsize) {
- if (DEBUG) Log.d(TAG, "remove: copy from " + (index+1) + "-" + nsize
+ if (DEBUG) System.out.println(TAG + " remove: copy from " + (index+1) + "-" + nsize
+ " to " + index);
System.arraycopy(ohashes, index + 1, mHashes, index, nsize - index);
System.arraycopy(oarray, (index + 1) << 1, mArray, index << 1,
@@ -552,7 +550,7 @@
}
} else {
if (index < nsize) {
- if (DEBUG) Log.d(TAG, "remove: move " + (index+1) + "-" + nsize
+ if (DEBUG) System.out.println(TAG + " remove: move " + (index+1) + "-" + nsize
+ " to " + index);
System.arraycopy(mHashes, index + 1, mHashes, index, nsize - index);
System.arraycopy(mArray, (index + 1) << 1, mArray, index << 1,
diff --git a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java b/collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
similarity index 86%
rename from compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
rename to collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
index 5238cf0..eece9b5 100644
--- a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
+++ b/collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
@@ -17,8 +17,32 @@
package android.support.v4.util;
/**
- * A copy of the current platform (currently {@link android.os.Build.VERSION_CODES#KITKAT}
- * version of {@link android.util.SparseArray}; provides a removeAt() method and other things.
+ * SparseArrays map integers to Objects. Unlike a normal array of Objects,
+ * there can be gaps in the indices. It is intended to be more memory efficient
+ * than using a HashMap to map Integers to Objects, both because it avoids
+ * auto-boxing keys and its data structure doesn't rely on an extra entry object
+ * for each mapping.
+ *
+ * <p>Note that this container keeps its mappings in an array data structure,
+ * using a binary search to find keys. The implementation is not intended to be appropriate for
+ * data structures
+ * that may contain large numbers of items. It is generally slower than a traditional
+ * HashMap, since lookups require a binary search and adds and removes require inserting
+ * and deleting entries in the array. For containers holding up to hundreds of items,
+ * the performance difference is not significant, less than 50%.</p>
+ *
+ * <p>To help with performance, the container includes an optimization when removing
+ * keys: instead of compacting its array immediately, it leaves the removed entry marked
+ * as deleted. The entry can then be re-used for the same key, or compacted later in
+ * a single garbage collection step of all removed entries. This garbage collection will
+ * need to be performed at any time the array needs to be grown or the the map size or
+ * entry values are retrieved.</p>
+ *
+ * <p>It is possible to iterate over the items in this container using
+ * {@link #keyAt(int)} and {@link #valueAt(int)}. Iterating over the keys using
+ * <code>keyAt(int)</code> with ascending values of the index will return the
+ * keys in ascending order, or the values corresponding to the keys in ascending
+ * order in the case of <code>valueAt(int)</code>.</p>
*/
public class SparseArrayCompat<E> implements Cloneable {
private static final Object DELETED = new Object();
diff --git a/compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java b/collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
similarity index 95%
rename from compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java
rename to collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
index c00d264..add6ba5 100644
--- a/compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
@@ -19,11 +19,7 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.AbstractMap;
import java.util.Arrays;
@@ -33,8 +29,6 @@
import java.util.NoSuchElementException;
import java.util.Set;
-@RunWith(AndroidJUnit4.class)
-@SmallTest
public class ArrayMapCompatTest {
@Test
diff --git a/compat/tests/java/android/support/v4/util/ArraySetCompatTest.java b/collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
similarity index 88%
rename from compat/tests/java/android/support/v4/util/ArraySetCompatTest.java
rename to collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
index 10a0b1b..a0e74e9 100644
--- a/compat/tests/java/android/support/v4/util/ArraySetCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
@@ -20,17 +20,11 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.Iterator;
import java.util.NoSuchElementException;
-@RunWith(AndroidJUnit4.class)
-@SmallTest
public class ArraySetCompatTest {
@Test
public void testCanNotIteratePastEnd() {
diff --git a/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java b/collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
similarity index 91%
rename from compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
rename to collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
index 663ea48..0276e14 100644
--- a/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
+++ b/collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
@@ -19,14 +19,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
-@SmallTest
public class LongSparseArrayTest {
@Test
public void isEmpty() throws Exception {
diff --git a/compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java b/collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
similarity index 79%
rename from compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java
rename to collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
index 350b917..3c2bea1 100644
--- a/compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java
+++ b/collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
@@ -16,12 +16,7 @@
import static org.junit.Assert.fail;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ConcurrentModificationException;
import java.util.Locale;
@@ -29,10 +24,7 @@
/**
* Unit tests for SimpleArrayMap
*/
-@RunWith(AndroidJUnit4.class)
-@LargeTest
public class SimpleArrayMapTest {
- private static final String TAG = "SimpleArrayMapTest";
SimpleArrayMap<String, String> map = new SimpleArrayMap<>();
private boolean mDone;
@@ -42,7 +34,7 @@
@Test
public void testConcurrentModificationException() throws Exception {
final int TEST_LEN_MS = 5000;
- Log.d(TAG, "Starting SimpleArrayMap concurrency test");
+ System.out.println("Starting SimpleArrayMap concurrency test");
mDone = false;
new Thread(new Runnable() {
@Override
@@ -54,11 +46,13 @@
} catch (ArrayIndexOutOfBoundsException e) {
// SimpleArrayMap is not thread safe, so lots of concurrent modifications
// can still cause data corruption
- Log.w(TAG, "concurrent modification uncaught, causing indexing failure", e);
+ System.err.println("concurrent modification uncaught, causing indexing failure");
+ e.printStackTrace();
} catch (ClassCastException e) {
// cache corruption should not occur as it is hard to trace and one thread
// may corrupt the pool for all threads in the same process.
- Log.e(TAG, "concurrent modification uncaught, causing cache corruption", e);
+ System.err.println("concurrent modification uncaught, causing cache corruption");
+ e.printStackTrace();
fail();
} catch (ConcurrentModificationException e) {
}
@@ -71,9 +65,9 @@
map.clear();
} catch (InterruptedException e) {
} catch (ArrayIndexOutOfBoundsException e) {
- Log.w(TAG, "concurrent modification uncaught, causing indexing failure");
+ System.err.println("concurrent modification uncaught, causing indexing failure");
} catch (ClassCastException e) {
- Log.e(TAG, "concurrent modification uncaught, causing cache corruption");
+ System.err.println("concurrent modification uncaught, causing cache corruption");
fail();
} catch (ConcurrentModificationException e) {
}
@@ -93,7 +87,8 @@
map.clear();
}
} catch (ConcurrentModificationException e) {
- Log.e(TAG, "concurrent modification caught on single thread", e);
+ System.err.println("Concurrent modification caught on single thread");
+ e.printStackTrace();
fail();
}
}
diff --git a/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java b/collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
similarity index 91%
rename from compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
rename to collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
index 122c89b..afe58ae 100644
--- a/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
@@ -19,14 +19,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
-@SmallTest
public class SparseArrayCompatTest {
@Test
public void isEmpty() throws Exception {
diff --git a/compat/api/27.1.0.ignore b/compat/api/27.1.0.ignore
index 1963552..e8c272c 100644
--- a/compat/api/27.1.0.ignore
+++ b/compat/api/27.1.0.ignore
@@ -1,2 +1,10 @@
+44c2c3c
+fbe2c76
+e51f961
+c851773
+34f4ba1
+9fad272
+43b0030
+81879f6
343d890
483ac6a
diff --git a/compat/api/current.txt b/compat/api/current.txt
index 0381328..a85290e 100644
--- a/compat/api/current.txt
+++ b/compat/api/current.txt
@@ -267,6 +267,7 @@
method public boolean getShowsUserInterface();
method public java.lang.CharSequence getTitle();
field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+ field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
@@ -1123,45 +1124,6 @@
package android.support.v4.util {
- public class ArrayMap<K, V> extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
- ctor public ArrayMap();
- ctor public ArrayMap(int);
- ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
- method public boolean containsAll(java.util.Collection<?>);
- method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public java.util.Set<K> keySet();
- method public void putAll(java.util.Map<? extends K, ? extends V>);
- method public boolean removeAll(java.util.Collection<?>);
- method public boolean retainAll(java.util.Collection<?>);
- method public java.util.Collection<V> values();
- }
-
- public final class ArraySet<E> implements java.util.Collection java.util.Set {
- ctor public ArraySet();
- ctor public ArraySet(int);
- ctor public ArraySet(android.support.v4.util.ArraySet<E>);
- ctor public ArraySet(java.util.Collection<E>);
- method public boolean add(E);
- method public void addAll(android.support.v4.util.ArraySet<? extends E>);
- method public boolean addAll(java.util.Collection<? extends E>);
- method public void clear();
- method public boolean contains(java.lang.Object);
- method public boolean containsAll(java.util.Collection<?>);
- method public void ensureCapacity(int);
- method public int indexOf(java.lang.Object);
- method public boolean isEmpty();
- method public java.util.Iterator<E> iterator();
- method public boolean remove(java.lang.Object);
- method public boolean removeAll(android.support.v4.util.ArraySet<? extends E>);
- method public boolean removeAll(java.util.Collection<?>);
- method public E removeAt(int);
- method public boolean retainAll(java.util.Collection<?>);
- method public int size();
- method public java.lang.Object[] toArray();
- method public <T> T[] toArray(T[]);
- method public E valueAt(int);
- }
-
public class AtomicFile {
ctor public AtomicFile(java.io.File);
method public void delete();
@@ -1173,83 +1135,6 @@
method public java.io.FileOutputStream startWrite() throws java.io.IOException;
}
- public final class CircularArray<E> {
- ctor public CircularArray();
- ctor public CircularArray(int);
- method public void addFirst(E);
- method public void addLast(E);
- method public void clear();
- method public E get(int);
- method public E getFirst();
- method public E getLast();
- method public boolean isEmpty();
- method public E popFirst();
- method public E popLast();
- method public void removeFromEnd(int);
- method public void removeFromStart(int);
- method public int size();
- }
-
- public final class CircularIntArray {
- ctor public CircularIntArray();
- ctor public CircularIntArray(int);
- method public void addFirst(int);
- method public void addLast(int);
- method public void clear();
- method public int get(int);
- method public int getFirst();
- method public int getLast();
- method public boolean isEmpty();
- method public int popFirst();
- method public int popLast();
- method public void removeFromEnd(int);
- method public void removeFromStart(int);
- method public int size();
- }
-
- public class LongSparseArray<E> implements java.lang.Cloneable {
- ctor public LongSparseArray();
- ctor public LongSparseArray(int);
- method public void append(long, E);
- method public void clear();
- method public android.support.v4.util.LongSparseArray<E> clone();
- method public void delete(long);
- method public E get(long);
- method public E get(long, E);
- method public int indexOfKey(long);
- method public int indexOfValue(E);
- method public boolean isEmpty();
- method public long keyAt(int);
- method public void put(long, E);
- method public void remove(long);
- method public void removeAt(int);
- method public void setValueAt(int, E);
- method public int size();
- method public E valueAt(int);
- }
-
- public class LruCache<K, V> {
- ctor public LruCache(int);
- method protected V create(K);
- method public final synchronized int createCount();
- method protected void entryRemoved(boolean, K, V, V);
- method public final void evictAll();
- method public final synchronized int evictionCount();
- method public final V get(K);
- method public final synchronized int hitCount();
- method public final synchronized int maxSize();
- method public final synchronized int missCount();
- method public final V put(K, V);
- method public final synchronized int putCount();
- method public final V remove(K);
- method public void resize(int);
- method public final synchronized int size();
- method protected int sizeOf(K, V);
- method public final synchronized java.util.Map<K, V> snapshot();
- method public final synchronized java.lang.String toString();
- method public void trimToSize(int);
- }
-
public class ObjectsCompat {
method public static boolean equals(java.lang.Object, java.lang.Object);
method public static int hash(java.lang.Object...);
@@ -1288,49 +1173,6 @@
ctor public Pools.SynchronizedPool(int);
}
- public class SimpleArrayMap<K, V> {
- ctor public SimpleArrayMap();
- ctor public SimpleArrayMap(int);
- ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap<K, V>);
- method public void clear();
- method public boolean containsKey(java.lang.Object);
- method public boolean containsValue(java.lang.Object);
- method public void ensureCapacity(int);
- method public V get(java.lang.Object);
- method public int indexOfKey(java.lang.Object);
- method public boolean isEmpty();
- method public K keyAt(int);
- method public V put(K, V);
- method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
- method public V remove(java.lang.Object);
- method public V removeAt(int);
- method public V setValueAt(int, V);
- method public int size();
- method public V valueAt(int);
- }
-
- public class SparseArrayCompat<E> implements java.lang.Cloneable {
- ctor public SparseArrayCompat();
- ctor public SparseArrayCompat(int);
- method public void append(int, E);
- method public void clear();
- method public android.support.v4.util.SparseArrayCompat<E> clone();
- method public void delete(int);
- method public E get(int);
- method public E get(int, E);
- method public int indexOfKey(int);
- method public int indexOfValue(E);
- method public boolean isEmpty();
- method public int keyAt(int);
- method public void put(int, E);
- method public void remove(int);
- method public void removeAt(int);
- method public void removeAtRange(int, int);
- method public void setValueAt(int, E);
- method public int size();
- method public E valueAt(int);
- }
-
}
package android.support.v4.view {
@@ -1562,6 +1404,26 @@
method public abstract void stopNestedScroll(int);
}
+ public class NestedScrollingChildHelper {
+ ctor public NestedScrollingChildHelper(android.view.View);
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
+ method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ method public boolean hasNestedScrollingParent();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isNestedScrollingEnabled();
+ method public void onDetachedFromWindow();
+ method public void onStopNestedScroll(android.view.View);
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll();
+ method public void stopNestedScroll(int);
+ }
+
public abstract interface NestedScrollingParent {
method public abstract int getNestedScrollAxes();
method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
@@ -1581,6 +1443,15 @@
method public abstract void onStopNestedScroll(android.view.View, int);
}
+ public class NestedScrollingParentHelper {
+ ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+ method public int getNestedScrollAxes();
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
public abstract interface OnApplyWindowInsetsListener {
method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
}
@@ -2383,6 +2254,42 @@
method public static void scrollListBy(android.widget.ListView, int);
}
+ public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
+ ctor public NestedScrollView(android.content.Context);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
+ method public boolean arrowScroll(int);
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fling(int);
+ method public boolean fullScroll(int);
+ method public int getMaxScrollAmount();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isFillViewport();
+ method public boolean isSmoothScrollingEnabled();
+ method public void onAttachedToWindow();
+ method public boolean pageScroll(int);
+ method public void setFillViewport(boolean);
+ method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
+ method public void setSmoothScrollingEnabled(boolean);
+ method public final void smoothScrollBy(int, int);
+ method public final void smoothScrollTo(int, int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public static abstract interface NestedScrollView.OnScrollChangeListener {
+ method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
+ }
+
public final class PopupMenuCompat {
method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
}
diff --git a/compat/build.gradle b/compat/build.gradle
index 8f44285..f52c5ff 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -8,6 +8,7 @@
dependencies {
api(project(":support-annotations"))
+ api(project(":collections"))
api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
androidTestImplementation(TEST_RUNNER)
@@ -21,7 +22,6 @@
android {
sourceSets {
- main.aidl.srcDirs = ['src/main/java']
main.res.srcDirs 'res', 'res-public'
}
@@ -37,5 +37,4 @@
mavenGroup = LibraryGroups.SUPPORT
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 14 or later."
- legacySourceLocation = true
}
diff --git a/compat/tests/AndroidManifest.xml b/compat/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from compat/tests/AndroidManifest.xml
rename to compat/src/androidTest/AndroidManifest.xml
diff --git a/compat/tests/assets/fonts/large_a.ttf b/compat/src/androidTest/assets/fonts/large_a.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_a.ttf
rename to compat/src/androidTest/assets/fonts/large_a.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_a.ttx b/compat/src/androidTest/assets/fonts/large_a.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_a.ttx
rename to compat/src/androidTest/assets/fonts/large_a.ttx
diff --git a/compat/tests/assets/fonts/large_b.ttf b/compat/src/androidTest/assets/fonts/large_b.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_b.ttf
rename to compat/src/androidTest/assets/fonts/large_b.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_b.ttx b/compat/src/androidTest/assets/fonts/large_b.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_b.ttx
rename to compat/src/androidTest/assets/fonts/large_b.ttx
diff --git a/compat/tests/assets/fonts/large_c.ttf b/compat/src/androidTest/assets/fonts/large_c.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_c.ttf
rename to compat/src/androidTest/assets/fonts/large_c.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_c.ttx b/compat/src/androidTest/assets/fonts/large_c.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_c.ttx
rename to compat/src/androidTest/assets/fonts/large_c.ttx
diff --git a/compat/tests/assets/fonts/large_d.ttf b/compat/src/androidTest/assets/fonts/large_d.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_d.ttf
rename to compat/src/androidTest/assets/fonts/large_d.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_d.ttx b/compat/src/androidTest/assets/fonts/large_d.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_d.ttx
rename to compat/src/androidTest/assets/fonts/large_d.ttx
diff --git a/compat/tests/assets/fonts/samplefont.ttf b/compat/src/androidTest/assets/fonts/samplefont.ttf
similarity index 100%
rename from compat/tests/assets/fonts/samplefont.ttf
rename to compat/src/androidTest/assets/fonts/samplefont.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/samplefont.ttx b/compat/src/androidTest/assets/fonts/samplefont.ttx
similarity index 100%
rename from compat/tests/assets/fonts/samplefont.ttx
rename to compat/src/androidTest/assets/fonts/samplefont.ttx
diff --git a/compat/tests/fonts_readme.txt b/compat/src/androidTest/fonts_readme.txt
similarity index 100%
rename from compat/tests/fonts_readme.txt
rename to compat/src/androidTest/fonts_readme.txt
diff --git a/compat/tests/java/android/support/v13/view/DragStartHelperTest.java b/compat/src/androidTest/java/android/support/v13/view/DragStartHelperTest.java
similarity index 100%
rename from compat/tests/java/android/support/v13/view/DragStartHelperTest.java
rename to compat/src/androidTest/java/android/support/v13/view/DragStartHelperTest.java
diff --git a/compat/tests/java/android/support/v13/view/DragStartHelperTestActivity.java b/compat/src/androidTest/java/android/support/v13/view/DragStartHelperTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v13/view/DragStartHelperTestActivity.java
rename to compat/src/androidTest/java/android/support/v13/view/DragStartHelperTestActivity.java
diff --git a/compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/compat/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
rename from compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
rename to compat/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/compat/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/BaseTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/compat/tests/java/android/support/v4/ThemedYellowActivity.java b/compat/src/androidTest/java/android/support/v4/ThemedYellowActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/ThemedYellowActivity.java
rename to compat/src/androidTest/java/android/support/v4/ThemedYellowActivity.java
diff --git a/compat/tests/java/android/support/v4/app/ActivityCompatTest.java b/compat/src/androidTest/java/android/support/v4/app/ActivityCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/ActivityCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/app/ActivityCompatTest.java
diff --git a/compat/tests/java/android/support/v4/app/JobIntentServiceTest.java b/compat/src/androidTest/java/android/support/v4/app/JobIntentServiceTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/JobIntentServiceTest.java
rename to compat/src/androidTest/java/android/support/v4/app/JobIntentServiceTest.java
diff --git a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java b/compat/src/androidTest/java/android/support/v4/app/NotificationCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/NotificationCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/app/NotificationCompatTest.java
diff --git a/compat/tests/java/android/support/v4/app/RemoteInputTest.java b/compat/src/androidTest/java/android/support/v4/app/RemoteInputTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/RemoteInputTest.java
rename to compat/src/androidTest/java/android/support/v4/app/RemoteInputTest.java
diff --git a/compat/tests/java/android/support/v4/app/SupportActivityTest.java b/compat/src/androidTest/java/android/support/v4/app/SupportActivityTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/SupportActivityTest.java
rename to compat/src/androidTest/java/android/support/v4/app/SupportActivityTest.java
diff --git a/compat/tests/java/android/support/v4/app/TestSupportActivity.java b/compat/src/androidTest/java/android/support/v4/app/TestSupportActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/TestSupportActivity.java
rename to compat/src/androidTest/java/android/support/v4/app/TestSupportActivity.java
diff --git a/compat/tests/java/android/support/v4/content/ContextCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/ContextCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/ContextCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/ContextCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/res/ResourcesCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/res/ResourcesCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/DrawableCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/DrawableCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java b/compat/src/androidTest/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java b/compat/src/androidTest/java/android/support/v4/graphics/TestTintAwareDrawable.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TestTintAwareDrawable.java
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatUtilTest.java b/compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/drawable/IconCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/drawable/IconCompatTest.java
diff --git a/compat/tests/java/android/support/v4/os/LocaleListCompatTest.java b/compat/src/androidTest/java/android/support/v4/os/LocaleListCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/os/LocaleListCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/os/LocaleListCompatTest.java
diff --git a/compat/tests/java/android/support/v4/provider/FontRequestTest.java b/compat/src/androidTest/java/android/support/v4/provider/FontRequestTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/FontRequestTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/FontRequestTest.java
diff --git a/compat/tests/java/android/support/v4/provider/FontsContractCompatTest.java b/compat/src/androidTest/java/android/support/v4/provider/FontsContractCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/FontsContractCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/FontsContractCompatTest.java
diff --git a/compat/tests/java/android/support/v4/provider/MockFontProvider.java b/compat/src/androidTest/java/android/support/v4/provider/MockFontProvider.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/MockFontProvider.java
rename to compat/src/androidTest/java/android/support/v4/provider/MockFontProvider.java
diff --git a/compat/tests/java/android/support/v4/provider/SelfDestructiveThreadTest.java b/compat/src/androidTest/java/android/support/v4/provider/SelfDestructiveThreadTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/SelfDestructiveThreadTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/SelfDestructiveThreadTest.java
diff --git a/compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java b/compat/src/androidTest/java/android/support/v4/testutils/LayoutDirectionActions.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java
rename to compat/src/androidTest/java/android/support/v4/testutils/LayoutDirectionActions.java
diff --git a/compat/tests/java/android/support/v4/testutils/TestUtils.java b/compat/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/TestUtils.java
rename to compat/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/compat/tests/java/android/support/v4/testutils/TextViewActions.java b/compat/src/androidTest/java/android/support/v4/testutils/TextViewActions.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/TextViewActions.java
rename to compat/src/androidTest/java/android/support/v4/testutils/TextViewActions.java
diff --git a/compat/tests/java/android/support/v4/text/BidiFormatterTest.java b/compat/src/androidTest/java/android/support/v4/text/BidiFormatterTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/BidiFormatterTest.java
rename to compat/src/androidTest/java/android/support/v4/text/BidiFormatterTest.java
diff --git a/compat/tests/java/android/support/v4/text/IcuCompatTest.java b/compat/src/androidTest/java/android/support/v4/text/IcuCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/IcuCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/text/IcuCompatTest.java
diff --git a/compat/tests/java/android/support/v4/text/util/FindAddressTest.java b/compat/src/androidTest/java/android/support/v4/text/util/FindAddressTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/util/FindAddressTest.java
rename to compat/src/androidTest/java/android/support/v4/text/util/FindAddressTest.java
diff --git a/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java b/compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
similarity index 99%
rename from compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
index fe587ee..afaf879 100644
--- a/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
+++ b/compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
@@ -832,7 +832,6 @@
verifyAddLinksFails(msg, url, Linkify.MAP_ADDRESSES);
}
-
private static void verifyAddLinksSucceeds(String msg, String string, int type) {
String str = "start " + string + " end";
Spannable spannable = new SpannableString(str);
diff --git a/compat/tests/java/android/support/v4/util/ObjectsCompatTest.java b/compat/src/androidTest/java/android/support/v4/util/ObjectsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/util/ObjectsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/util/ObjectsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/util/PatternsCompatTest.java b/compat/src/androidTest/java/android/support/v4/util/PatternsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/util/PatternsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/util/PatternsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/GravityCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/GravityCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/GravityCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/GravityCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/PointerIconCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/PointerIconCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/PointerIconCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/PointerIconCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewCompatActivity.java b/compat/src/androidTest/java/android/support/v4/view/ViewCompatActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewCompatActivity.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewCompatActivity.java
diff --git a/compat/tests/java/android/support/v4/view/ViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewGroupCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewGroupCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewGroupCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewGroupCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/VpaActivity.java b/compat/src/androidTest/java/android/support/v4/view/VpaActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/VpaActivity.java
rename to compat/src/androidTest/java/android/support/v4/view/VpaActivity.java
diff --git a/compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/ListViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/widget/ListViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ListViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/widget/ListViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/ListViewTestActivity.java b/compat/src/androidTest/java/android/support/v4/widget/ListViewTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ListViewTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/widget/ListViewTestActivity.java
diff --git a/compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java b/compat/src/androidTest/java/android/support/v4/widget/ScrollerCompatTestBase.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java
rename to compat/src/androidTest/java/android/support/v4/widget/ScrollerCompatTestBase.java
diff --git a/compat/tests/java/android/support/v4/widget/TextViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/widget/TextViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/TextViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/widget/TextViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/TextViewTestActivity.java b/compat/src/androidTest/java/android/support/v4/widget/TextViewTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/TextViewTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/widget/TextViewTestActivity.java
diff --git a/compat/tests/res/color/complex_themed_selector.xml b/compat/src/androidTest/res/color/complex_themed_selector.xml
similarity index 100%
rename from compat/tests/res/color/complex_themed_selector.xml
rename to compat/src/androidTest/res/color/complex_themed_selector.xml
diff --git a/compat/tests/res/color/complex_unthemed_selector.xml b/compat/src/androidTest/res/color/complex_unthemed_selector.xml
similarity index 100%
rename from compat/tests/res/color/complex_unthemed_selector.xml
rename to compat/src/androidTest/res/color/complex_unthemed_selector.xml
diff --git a/compat/tests/res/color/simple_themed_selector.xml b/compat/src/androidTest/res/color/simple_themed_selector.xml
similarity index 100%
rename from compat/tests/res/color/simple_themed_selector.xml
rename to compat/src/androidTest/res/color/simple_themed_selector.xml
diff --git a/compat/tests/res/drawable-hdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-hdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-hdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-hdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png b/compat/src/androidTest/res/drawable-ldpi/aliased_drawable_alternate.png
similarity index 100%
rename from compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png
rename to compat/src/androidTest/res/drawable-ldpi/aliased_drawable_alternate.png
Binary files differ
diff --git a/compat/tests/res/drawable-mdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-mdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-mdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-mdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-mdpi/test_drawable.png b/compat/src/androidTest/res/drawable-mdpi/test_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-mdpi/test_drawable.png
rename to compat/src/androidTest/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-xhdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-xhdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-xhdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-xhdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-xxhdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-xxhdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-xxhdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-xxhdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable/action_icon.xml b/compat/src/androidTest/res/drawable/action_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/action_icon.xml
rename to compat/src/androidTest/res/drawable/action_icon.xml
diff --git a/compat/tests/res/drawable/action_icon2.xml b/compat/src/androidTest/res/drawable/action_icon2.xml
similarity index 100%
rename from compat/tests/res/drawable/action_icon2.xml
rename to compat/src/androidTest/res/drawable/action_icon2.xml
diff --git a/compat/tests/res/drawable/content_icon.xml b/compat/src/androidTest/res/drawable/content_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/content_icon.xml
rename to compat/src/androidTest/res/drawable/content_icon.xml
diff --git a/compat/tests/res/drawable/content_icon2.xml b/compat/src/androidTest/res/drawable/content_icon2.xml
similarity index 100%
rename from compat/tests/res/drawable/content_icon2.xml
rename to compat/src/androidTest/res/drawable/content_icon2.xml
diff --git a/compat/tests/res/drawable/pointer_icon.xml b/compat/src/androidTest/res/drawable/pointer_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/pointer_icon.xml
rename to compat/src/androidTest/res/drawable/pointer_icon.xml
diff --git a/compat/tests/res/drawable/test_drawable_blue.xml b/compat/src/androidTest/res/drawable/test_drawable_blue.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_blue.xml
rename to compat/src/androidTest/res/drawable/test_drawable_blue.xml
diff --git a/compat/tests/res/drawable/test_drawable_green.xml b/compat/src/androidTest/res/drawable/test_drawable_green.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_green.xml
rename to compat/src/androidTest/res/drawable/test_drawable_green.xml
diff --git a/compat/tests/res/drawable/test_drawable_red.xml b/compat/src/androidTest/res/drawable/test_drawable_red.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_red.xml
rename to compat/src/androidTest/res/drawable/test_drawable_red.xml
diff --git a/compat/tests/res/drawable/themed_bitmap.xml b/compat/src/androidTest/res/drawable/themed_bitmap.xml
similarity index 100%
rename from compat/tests/res/drawable/themed_bitmap.xml
rename to compat/src/androidTest/res/drawable/themed_bitmap.xml
diff --git a/compat/tests/res/drawable/themed_drawable.xml b/compat/src/androidTest/res/drawable/themed_drawable.xml
similarity index 100%
rename from compat/tests/res/drawable/themed_drawable.xml
rename to compat/src/androidTest/res/drawable/themed_drawable.xml
diff --git a/compat/tests/res/font/dummyproviderfont.xml b/compat/src/androidTest/res/font/dummyproviderfont.xml
similarity index 100%
rename from compat/tests/res/font/dummyproviderfont.xml
rename to compat/src/androidTest/res/font/dummyproviderfont.xml
diff --git a/compat/tests/res/font/invalid_font.ttf b/compat/src/androidTest/res/font/invalid_font.ttf
similarity index 100%
rename from compat/tests/res/font/invalid_font.ttf
rename to compat/src/androidTest/res/font/invalid_font.ttf
diff --git a/compat/tests/res/font/invalid_xmlempty.xml b/compat/src/androidTest/res/font/invalid_xmlempty.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlempty.xml
rename to compat/src/androidTest/res/font/invalid_xmlempty.xml
diff --git a/compat/tests/res/font/invalid_xmlfamily.xml b/compat/src/androidTest/res/font/invalid_xmlfamily.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfamily.xml
rename to compat/src/androidTest/res/font/invalid_xmlfamily.xml
diff --git a/compat/tests/res/font/invalid_xmlfont.xml b/compat/src/androidTest/res/font/invalid_xmlfont.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfont.xml
rename to compat/src/androidTest/res/font/invalid_xmlfont.xml
diff --git a/compat/tests/res/font/invalid_xmlfont_contains_invalid_font_file.xml b/compat/src/androidTest/res/font/invalid_xmlfont_contains_invalid_font_file.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfont_contains_invalid_font_file.xml
rename to compat/src/androidTest/res/font/invalid_xmlfont_contains_invalid_font_file.xml
diff --git a/compat/tests/res/font/large_a.ttf b/compat/src/androidTest/res/font/large_a.ttf
similarity index 100%
rename from compat/tests/res/font/large_a.ttf
rename to compat/src/androidTest/res/font/large_a.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_b.ttf b/compat/src/androidTest/res/font/large_b.ttf
similarity index 100%
rename from compat/tests/res/font/large_b.ttf
rename to compat/src/androidTest/res/font/large_b.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_c.ttf b/compat/src/androidTest/res/font/large_c.ttf
similarity index 100%
rename from compat/tests/res/font/large_c.ttf
rename to compat/src/androidTest/res/font/large_c.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_d.ttf b/compat/src/androidTest/res/font/large_d.ttf
similarity index 100%
rename from compat/tests/res/font/large_d.ttf
rename to compat/src/androidTest/res/font/large_d.ttf
Binary files differ
diff --git a/compat/tests/res/font/sample_font_collection.ttc b/compat/src/androidTest/res/font/sample_font_collection.ttc
similarity index 100%
rename from compat/tests/res/font/sample_font_collection.ttc
rename to compat/src/androidTest/res/font/sample_font_collection.ttc
Binary files differ
diff --git a/compat/tests/res/font/samplefont.ttf b/compat/src/androidTest/res/font/samplefont.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont.ttf
rename to compat/src/androidTest/res/font/samplefont.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont2.ttf b/compat/src/androidTest/res/font/samplefont2.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont2.ttf
rename to compat/src/androidTest/res/font/samplefont2.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont3.ttf b/compat/src/androidTest/res/font/samplefont3.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont3.ttf
rename to compat/src/androidTest/res/font/samplefont3.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont4.ttf b/compat/src/androidTest/res/font/samplefont4.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont4.ttf
rename to compat/src/androidTest/res/font/samplefont4.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplexmldownloadedfont.xml b/compat/src/androidTest/res/font/samplexmldownloadedfont.xml
similarity index 100%
rename from compat/tests/res/font/samplexmldownloadedfont.xml
rename to compat/src/androidTest/res/font/samplexmldownloadedfont.xml
diff --git a/compat/tests/res/font/samplexmldownloadedfontblocking.xml b/compat/src/androidTest/res/font/samplexmldownloadedfontblocking.xml
similarity index 100%
rename from compat/tests/res/font/samplexmldownloadedfontblocking.xml
rename to compat/src/androidTest/res/font/samplexmldownloadedfontblocking.xml
diff --git a/compat/tests/res/font/samplexmlfont.xml b/compat/src/androidTest/res/font/samplexmlfont.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfont.xml
rename to compat/src/androidTest/res/font/samplexmlfont.xml
diff --git a/compat/tests/res/font/samplexmlfont2.xml b/compat/src/androidTest/res/font/samplexmlfont2.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfont2.xml
rename to compat/src/androidTest/res/font/samplexmlfont2.xml
diff --git a/compat/tests/res/font/samplexmlfontforparsing.xml b/compat/src/androidTest/res/font/samplexmlfontforparsing.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfontforparsing.xml
rename to compat/src/androidTest/res/font/samplexmlfontforparsing.xml
diff --git a/compat/tests/res/font/samplexmlfontforparsing2.xml b/compat/src/androidTest/res/font/samplexmlfontforparsing2.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfontforparsing2.xml
rename to compat/src/androidTest/res/font/samplexmlfontforparsing2.xml
diff --git a/compat/tests/res/font/styletest_async_providerfont.xml b/compat/src/androidTest/res/font/styletest_async_providerfont.xml
similarity index 100%
rename from compat/tests/res/font/styletest_async_providerfont.xml
rename to compat/src/androidTest/res/font/styletest_async_providerfont.xml
diff --git a/compat/tests/res/font/styletest_sync_providerfont.xml b/compat/src/androidTest/res/font/styletest_sync_providerfont.xml
similarity index 100%
rename from compat/tests/res/font/styletest_sync_providerfont.xml
rename to compat/src/androidTest/res/font/styletest_sync_providerfont.xml
diff --git a/compat/tests/res/font/styletestfont.xml b/compat/src/androidTest/res/font/styletestfont.xml
similarity index 100%
rename from compat/tests/res/font/styletestfont.xml
rename to compat/src/androidTest/res/font/styletestfont.xml
diff --git a/compat/tests/res/font/ttctestfont1.xml b/compat/src/androidTest/res/font/ttctestfont1.xml
similarity index 100%
rename from compat/tests/res/font/ttctestfont1.xml
rename to compat/src/androidTest/res/font/ttctestfont1.xml
diff --git a/compat/tests/res/font/ttctestfont2.xml b/compat/src/androidTest/res/font/ttctestfont2.xml
similarity index 100%
rename from compat/tests/res/font/ttctestfont2.xml
rename to compat/src/androidTest/res/font/ttctestfont2.xml
diff --git a/compat/tests/res/font/variable_width_dash_font.ttf b/compat/src/androidTest/res/font/variable_width_dash_font.ttf
similarity index 100%
rename from compat/tests/res/font/variable_width_dash_font.ttf
rename to compat/src/androidTest/res/font/variable_width_dash_font.ttf
Binary files differ
diff --git a/compat/tests/res/font/variationsettingstestfont1.xml b/compat/src/androidTest/res/font/variationsettingstestfont1.xml
similarity index 100%
rename from compat/tests/res/font/variationsettingstestfont1.xml
rename to compat/src/androidTest/res/font/variationsettingstestfont1.xml
diff --git a/compat/tests/res/font/variationsettingstestfont2.xml b/compat/src/androidTest/res/font/variationsettingstestfont2.xml
similarity index 100%
rename from compat/tests/res/font/variationsettingstestfont2.xml
rename to compat/src/androidTest/res/font/variationsettingstestfont2.xml
diff --git a/compat/tests/res/layout/activity_compat_activity.xml b/compat/src/androidTest/res/layout/activity_compat_activity.xml
similarity index 100%
rename from compat/tests/res/layout/activity_compat_activity.xml
rename to compat/src/androidTest/res/layout/activity_compat_activity.xml
diff --git a/compat/tests/res/layout/drag_source_activity.xml b/compat/src/androidTest/res/layout/drag_source_activity.xml
similarity index 100%
rename from compat/tests/res/layout/drag_source_activity.xml
rename to compat/src/androidTest/res/layout/drag_source_activity.xml
diff --git a/compat/tests/res/layout/list_view_activity.xml b/compat/src/androidTest/res/layout/list_view_activity.xml
similarity index 100%
rename from compat/tests/res/layout/list_view_activity.xml
rename to compat/src/androidTest/res/layout/list_view_activity.xml
diff --git a/compat/tests/res/layout/list_view_row.xml b/compat/src/androidTest/res/layout/list_view_row.xml
similarity index 100%
rename from compat/tests/res/layout/list_view_row.xml
rename to compat/src/androidTest/res/layout/list_view_row.xml
diff --git a/compat/tests/res/layout/text_view_activity.xml b/compat/src/androidTest/res/layout/text_view_activity.xml
similarity index 100%
rename from compat/tests/res/layout/text_view_activity.xml
rename to compat/src/androidTest/res/layout/text_view_activity.xml
diff --git a/compat/tests/res/layout/view_compat_activity.xml b/compat/src/androidTest/res/layout/view_compat_activity.xml
similarity index 100%
rename from compat/tests/res/layout/view_compat_activity.xml
rename to compat/src/androidTest/res/layout/view_compat_activity.xml
diff --git a/compat/tests/res/layout/vpa_activity.xml b/compat/src/androidTest/res/layout/vpa_activity.xml
similarity index 100%
rename from compat/tests/res/layout/vpa_activity.xml
rename to compat/src/androidTest/res/layout/vpa_activity.xml
diff --git a/compat/tests/res/values-hdpi/dimens.xml b/compat/src/androidTest/res/values-hdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-hdpi/dimens.xml
rename to compat/src/androidTest/res/values-hdpi/dimens.xml
diff --git a/compat/tests/res/values-mdpi/dimens.xml b/compat/src/androidTest/res/values-mdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-mdpi/dimens.xml
rename to compat/src/androidTest/res/values-mdpi/dimens.xml
diff --git a/compat/tests/res/values-xhdpi/dimens.xml b/compat/src/androidTest/res/values-xhdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-xhdpi/dimens.xml
rename to compat/src/androidTest/res/values-xhdpi/dimens.xml
diff --git a/compat/tests/res/values-xxhdpi/dimens.xml b/compat/src/androidTest/res/values-xxhdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-xxhdpi/dimens.xml
rename to compat/src/androidTest/res/values-xxhdpi/dimens.xml
diff --git a/compat/tests/res/values/arrays.xml b/compat/src/androidTest/res/values/arrays.xml
similarity index 100%
rename from compat/tests/res/values/arrays.xml
rename to compat/src/androidTest/res/values/arrays.xml
diff --git a/compat/tests/res/values/attrs.xml b/compat/src/androidTest/res/values/attrs.xml
similarity index 100%
rename from compat/tests/res/values/attrs.xml
rename to compat/src/androidTest/res/values/attrs.xml
diff --git a/compat/tests/res/values/colors.xml b/compat/src/androidTest/res/values/colors.xml
similarity index 100%
rename from compat/tests/res/values/colors.xml
rename to compat/src/androidTest/res/values/colors.xml
diff --git a/compat/tests/res/values/dimens.xml b/compat/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from compat/tests/res/values/dimens.xml
rename to compat/src/androidTest/res/values/dimens.xml
diff --git a/compat/tests/res/values/drawables.xml b/compat/src/androidTest/res/values/drawables.xml
similarity index 100%
rename from compat/tests/res/values/drawables.xml
rename to compat/src/androidTest/res/values/drawables.xml
diff --git a/compat/tests/res/values/strings.xml b/compat/src/androidTest/res/values/strings.xml
similarity index 100%
rename from compat/tests/res/values/strings.xml
rename to compat/src/androidTest/res/values/strings.xml
diff --git a/compat/tests/res/values/styles.xml b/compat/src/androidTest/res/values/styles.xml
similarity index 100%
rename from compat/tests/res/values/styles.xml
rename to compat/src/androidTest/res/values/styles.xml
diff --git a/compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl b/compat/src/main/aidl/android/support/v4/app/INotificationSideChannel.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl
rename to compat/src/main/aidl/android/support/v4/app/INotificationSideChannel.aidl
diff --git a/compat/src/main/java/android/support/v4/os/IResultReceiver.aidl b/compat/src/main/aidl/android/support/v4/os/IResultReceiver.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/os/IResultReceiver.aidl
rename to compat/src/main/aidl/android/support/v4/os/IResultReceiver.aidl
diff --git a/compat/src/main/java/android/support/v4/os/ResultReceiver.aidl b/compat/src/main/aidl/android/support/v4/os/ResultReceiver.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/os/ResultReceiver.aidl
rename to compat/src/main/aidl/android/support/v4/os/ResultReceiver.aidl
diff --git a/compat/src/main/java/android/support/v4/app/NotificationCompat.java b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
index 1e2f317..f5610ed 100644
--- a/compat/src/main/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
@@ -17,6 +17,7 @@
package android.support.v4.app;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.app.Activity;
@@ -2884,6 +2885,11 @@
*/
public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9;
+ /**
+ * {@link SemanticAction}: Call a contact, group, etc.
+ */
+ public static final int SEMANTIC_ACTION_CALL = 10;
+
static final String EXTRA_SHOWS_USER_INTERFACE =
"android.support.action.showsUserInterface";
@@ -3446,7 +3452,8 @@
SEMANTIC_ACTION_MUTE,
SEMANTIC_ACTION_UNMUTE,
SEMANTIC_ACTION_THUMBS_UP,
- SEMANTIC_ACTION_THUMBS_DOWN
+ SEMANTIC_ACTION_THUMBS_DOWN,
+ SEMANTIC_ACTION_CALL
})
@Retention(RetentionPolicy.SOURCE)
public @interface SemanticAction {}
diff --git a/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java b/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
index 3998279..32d1914 100644
--- a/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
+++ b/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
@@ -18,7 +18,6 @@
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import android.os.Build;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@@ -98,7 +97,7 @@
* @return True if at least one link is found and applied.
*/
public static boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
- if (Build.VERSION.SDK_INT >= 27) {
+ if (shouldAddLinksFallbackToFramework()) {
return Linkify.addLinks(text, mask);
}
if (mask == 0) {
@@ -111,13 +110,11 @@
text.removeSpan(old[i]);
}
- // Use framework to linkify phone numbers.
- boolean frameworkReturn = false;
if ((mask & Linkify.PHONE_NUMBERS) != 0) {
- frameworkReturn = Linkify.addLinks(text, Linkify.PHONE_NUMBERS);
+ Linkify.addLinks(text, Linkify.PHONE_NUMBERS);
}
- ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
+ final ArrayList<LinkSpec> links = new ArrayList<>();
if ((mask & Linkify.WEB_URLS) != 0) {
gatherLinks(links, text, PatternsCompat.AUTOLINK_WEB_URL,
@@ -162,7 +159,7 @@
* @return True if at least one link is found and applied.
*/
public static boolean addLinks(@NonNull TextView text, @LinkifyMask int mask) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
return Linkify.addLinks(text, mask);
}
if (mask == 0) {
@@ -205,7 +202,7 @@
*/
public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
@Nullable String scheme) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
Linkify.addLinks(text, pattern, scheme);
return;
}
@@ -229,7 +226,7 @@
public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
@Nullable String scheme, @Nullable MatchFilter matchFilter,
@Nullable TransformFilter transformFilter) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
Linkify.addLinks(text, pattern, scheme, matchFilter, transformFilter);
return;
}
@@ -256,7 +253,7 @@
public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
@Nullable String defaultScheme, @Nullable String[] schemes,
@Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
Linkify.addLinks(text, pattern, defaultScheme, schemes, matchFilter, transformFilter);
return;
}
@@ -281,7 +278,7 @@
*/
public static boolean addLinks(@NonNull Spannable text, @NonNull Pattern pattern,
@Nullable String scheme) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
return Linkify.addLinks(text, pattern, scheme);
}
return addLinks(text, pattern, scheme, null, null, null);
@@ -305,7 +302,7 @@
public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String scheme, @Nullable MatchFilter matchFilter,
@Nullable TransformFilter transformFilter) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
return Linkify.addLinks(spannable, pattern, scheme, matchFilter, transformFilter);
}
return addLinks(spannable, pattern, scheme, null, matchFilter,
@@ -331,7 +328,7 @@
public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String defaultScheme, @Nullable String[] schemes,
@Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
- if (Build.VERSION.SDK_INT >= 26) {
+ if (shouldAddLinksFallbackToFramework()) {
return Linkify.addLinks(spannable, pattern, defaultScheme, schemes, matchFilter,
transformFilter);
}
@@ -371,6 +368,10 @@
return hasMatches;
}
+ private static boolean shouldAddLinksFallbackToFramework() {
+ return BuildCompat.isAtLeastP();
+ }
+
private static void addLinkMovementMethod(@NonNull TextView t) {
MovementMethod m = t.getMovementMethod();
diff --git a/core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java b/compat/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
diff --git a/core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java b/compat/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java b/compat/src/main/java/android/support/v4/widget/NestedScrollView.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java
rename to compat/src/main/java/android/support/v4/widget/NestedScrollView.java
diff --git a/compat/tests/NO_DOCS b/compat/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/compat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/content/src/androidTest/NO_DOCS b/content/src/androidTest/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/content/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/coordinatorlayout/api/current.txt b/coordinatorlayout/api/current.txt
new file mode 100644
index 0000000..a5a44a2
--- /dev/null
+++ b/coordinatorlayout/api/current.txt
@@ -0,0 +1,97 @@
+package android.support.design.widget {
+
+ public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent2 {
+ ctor public CoordinatorLayout(android.content.Context);
+ ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
+ ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
+ method public void dispatchDependentViewsChanged(android.view.View);
+ method public boolean doViewsOverlap(android.view.View, android.view.View);
+ method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ method public java.util.List<android.view.View> getDependencies(android.view.View);
+ method public java.util.List<android.view.View> getDependents(android.view.View);
+ method public android.graphics.drawable.Drawable getStatusBarBackground();
+ method public boolean isPointInChildBounds(android.view.View, int, int);
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void onDraw(android.graphics.Canvas);
+ method public void onLayoutChild(android.view.View, int);
+ method public void onMeasureChild(android.view.View, int, int, int, int);
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+ method public void setStatusBarBackgroundColor(int);
+ method public void setStatusBarBackgroundResource(int);
+ }
+
+ public static abstract interface CoordinatorLayout.AttachedBehavior {
+ method public abstract android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+ }
+
+ public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
+ ctor public CoordinatorLayout.Behavior();
+ ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
+ method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
+ method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
+ method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+ method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+ method public static java.lang.Object getTag(android.view.View);
+ method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+ method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
+ method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+ method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+ method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+ method public void onDetachedFromLayoutParams();
+ method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+ method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+ method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
+ method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
+ method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+ method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
+ method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+ method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
+ method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+ method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+ method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
+ method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
+ method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
+ method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+ method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+ method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
+ method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+ method public static void setTag(android.view.View, java.lang.Object);
+ }
+
+ public static abstract deprecated class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
+ }
+
+ public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public CoordinatorLayout.LayoutParams(int, int);
+ ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+ ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+ ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ method public int getAnchorId();
+ method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+ method public void setAnchorId(int);
+ method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
+ field public int anchorGravity;
+ field public int dodgeInsetEdges;
+ field public int gravity;
+ field public int insetEdge;
+ field public int keyline;
+ }
+
+ protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
+ ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+ ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
+ field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
+ }
+
+}
+
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
new file mode 100644
index 0000000..c6ce55b
--- /dev/null
+++ b/coordinatorlayout/build.gradle
@@ -0,0 +1,42 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+ api(project(":customview"))
+
+ androidTestImplementation(TEST_RUNNER)
+ androidTestImplementation(ESPRESSO_CORE)
+ androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+ androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+ androidTestImplementation project(':support-testutils'), {
+ exclude group: 'com.android.support', module: 'support-core-ui'
+ }
+}
+
+android {
+ sourceSets {
+ main.res.srcDirs = [
+ 'src/main/res',
+ 'src/main/res-public'
+ ]
+ }
+ buildTypes.all {
+ consumerProguardFiles 'proguard-rules.pro'
+ }
+}
+
+supportLibrary {
+ name = "Android Support Library Coordinator Layout"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ 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 14 or later."
+}
diff --git a/core-ui/proguard-rules.pro b/coordinatorlayout/proguard-rules.pro
similarity index 100%
rename from core-ui/proguard-rules.pro
rename to coordinatorlayout/proguard-rules.pro
diff --git a/coordinatorlayout/src/androidTest/AndroidManifest.xml b/coordinatorlayout/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..ccf580d
--- /dev/null
+++ b/coordinatorlayout/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.support.coordinatorlayout.test">
+ <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+ <application
+ android:supportsRtl="true"
+ android:theme="@style/TestActivityTheme">
+
+ <activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
+
+ <activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
+
+ </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/design/custom/CustomBar.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomBar.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomBar.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomBar.java
diff --git a/core-ui/tests/java/android/support/design/custom/CustomTextView.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomTextView.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView.java
diff --git a/core-ui/tests/java/android/support/design/custom/CustomTextView2.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView2.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomTextView2.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView2.java
diff --git a/core-ui/tests/java/android/support/design/custom/TestFloatingBehavior.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/TestFloatingBehavior.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/TestFloatingBehavior.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/TestFloatingBehavior.java
diff --git a/core-ui/tests/java/android/support/design/testutils/CoordinatorLayoutUtils.java b/coordinatorlayout/src/androidTest/java/android/support/design/testutils/CoordinatorLayoutUtils.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/testutils/CoordinatorLayoutUtils.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/testutils/CoordinatorLayoutUtils.java
diff --git a/core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
index 5c79b21..f00d83b 100755
--- a/core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
@@ -20,7 +20,7 @@
import static org.hamcrest.Matchers.any;
import android.support.annotation.LayoutRes;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
import android.support.test.annotation.UiThreadTest;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
diff --git a/core-ui/tests/java/android/support/design/widget/BaseInstrumentationTestCase.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseInstrumentationTestCase.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/BaseInstrumentationTestCase.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseInstrumentationTestCase.java
diff --git a/core-ui/tests/java/android/support/design/widget/BaseTestActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseTestActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/BaseTestActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
index b7fe740..9fcc271 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
@@ -16,7 +16,7 @@
package android.support.design.widget;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
import android.support.v4.BaseTestActivity;
import android.widget.FrameLayout;
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutSortTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutSortTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutSortTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutSortTest.java
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
similarity index 99%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
index 9b4c586..bbf46f9 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
@@ -41,7 +41,7 @@
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
import android.support.design.testutils.CoordinatorLayoutUtils;
import android.support.design.testutils.CoordinatorLayoutUtils.DependentBehavior;
import android.support.design.widget.CoordinatorLayout.Behavior;
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
index 7089b80..f9f7694 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
@@ -24,7 +24,7 @@
import android.os.Handler;
import android.os.Looper;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
import android.support.design.custom.CustomBar;
import android.support.design.custom.TestFloatingBehavior;
import android.support.test.annotation.UiThreadTest;
diff --git a/core-ui/tests/java/android/support/design/widget/DesignViewActions.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DesignViewActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/DesignViewActions.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/DesignViewActions.java
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
similarity index 94%
rename from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
index ac61704..e6f7935 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
@@ -16,7 +16,7 @@
package android.support.design.widget;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
/**
* Test activity for testing various aspects of {@link CoordinatorLayout}.
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/coordinatorlayout/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseTestActivity.java
copy to coordinatorlayout/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/v4/widget/DirectedAcyclicGraphTest.java b/coordinatorlayout/src/androidTest/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
diff --git a/core-ui/tests/res/layout/activity_coordinator_layout.xml b/coordinatorlayout/src/androidTest/res/layout/activity_coordinator_layout.xml
similarity index 100%
rename from core-ui/tests/res/layout/activity_coordinator_layout.xml
rename to coordinatorlayout/src/androidTest/res/layout/activity_coordinator_layout.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_annotation.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_annotation.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_annotation.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_annotation.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_interface.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_interface.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_interface.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_interface.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_layout_attr.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_layout_attr.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_runtime.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_runtime.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_runtime.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_runtime.xml
diff --git a/core-ui/tests/res/layout/dynamic_coordinator_layout.xml b/coordinatorlayout/src/androidTest/res/layout/dynamic_coordinator_layout.xml
similarity index 100%
rename from core-ui/tests/res/layout/dynamic_coordinator_layout.xml
rename to coordinatorlayout/src/androidTest/res/layout/dynamic_coordinator_layout.xml
diff --git a/core-ui/tests/res/layout/emulated_snackbar.xml b/coordinatorlayout/src/androidTest/res/layout/emulated_snackbar.xml
similarity index 100%
rename from core-ui/tests/res/layout/emulated_snackbar.xml
rename to coordinatorlayout/src/androidTest/res/layout/emulated_snackbar.xml
diff --git a/core-ui/tests/res/layout/include_nestedscrollview.xml b/coordinatorlayout/src/androidTest/res/layout/include_nestedscrollview.xml
similarity index 100%
rename from core-ui/tests/res/layout/include_nestedscrollview.xml
rename to coordinatorlayout/src/androidTest/res/layout/include_nestedscrollview.xml
diff --git a/core-ui/tests/res/values/ids.xml b/coordinatorlayout/src/androidTest/res/values/ids.xml
similarity index 66%
copy from core-ui/tests/res/values/ids.xml
copy to coordinatorlayout/src/androidTest/res/values/ids.xml
index f3ac9b4..b34ad80 100644
--- a/core-ui/tests/res/values/ids.xml
+++ b/coordinatorlayout/src/androidTest/res/values/ids.xml
@@ -14,15 +14,5 @@
limitations under the License.
-->
<resources>
- <item name="page_0" type="id"/>
- <item name="page_1" type="id"/>
- <item name="page_2" type="id"/>
- <item name="page_3" type="id"/>
- <item name="page_4" type="id"/>
- <item name="page_5" type="id"/>
- <item name="page_6" type="id"/>
- <item name="page_7" type="id"/>
- <item name="page_8" type="id"/>
- <item name="page_9" type="id"/>
<item name="anchor" type="id"/>
</resources>
\ No newline at end of file
diff --git a/core-ui/tests/res/values/styles.xml b/coordinatorlayout/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to coordinatorlayout/src/androidTest/res/values/styles.xml
diff --git a/coordinatorlayout/src/main/AndroidManifest.xml b/coordinatorlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..bbad509
--- /dev/null
+++ b/coordinatorlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.coordinatorlayout" />
diff --git a/core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
similarity index 99%
rename from core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java
rename to coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
index ef4d1ed..91d3fa4 100644
--- a/core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
@@ -41,10 +41,9 @@
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
import android.support.annotation.VisibleForTesting;
-import android.support.coreui.R;
+import android.support.coordinatorlayout.R;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.math.MathUtils;
import android.support.v4.util.ObjectsCompat;
import android.support.v4.util.Pools;
import android.support.v4.view.AbsSavedState;
@@ -1235,7 +1234,7 @@
mScrimPaint = new Paint();
}
mScrimPaint.setColor(lp.mBehavior.getScrimColor(this, child));
- mScrimPaint.setAlpha(MathUtils.clamp(Math.round(255 * scrimAlpha), 0, 255));
+ mScrimPaint.setAlpha(clamp(Math.round(255 * scrimAlpha), 0, 255));
final int saved = canvas.save();
if (child.isOpaque()) {
@@ -1254,6 +1253,15 @@
return super.drawChild(canvas, child, drawingTime);
}
+ private static int clamp(int value, int min, int max) {
+ if (value < min) {
+ return min;
+ } else if (value > max) {
+ return max;
+ }
+ return value;
+ }
+
/**
* Dispatch any dependent view changes to the relevant {@link Behavior} instances.
*
diff --git a/core-ui/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java b/coordinatorlayout/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
rename to coordinatorlayout/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/ViewGroupUtils.java b/coordinatorlayout/src/main/java/android/support/v4/widget/ViewGroupUtils.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/ViewGroupUtils.java
rename to coordinatorlayout/src/main/java/android/support/v4/widget/ViewGroupUtils.java
diff --git a/core-ui/res-public/values/public_attrs.xml b/coordinatorlayout/src/main/res-public/values/public_attrs.xml
similarity index 100%
rename from core-ui/res-public/values/public_attrs.xml
rename to coordinatorlayout/src/main/res-public/values/public_attrs.xml
diff --git a/core-ui/res-public/values/public_styles.xml b/coordinatorlayout/src/main/res-public/values/public_styles.xml
similarity index 100%
rename from core-ui/res-public/values/public_styles.xml
rename to coordinatorlayout/src/main/res-public/values/public_styles.xml
diff --git a/core-ui/res/values/attrs.xml b/coordinatorlayout/src/main/res/values/attrs.xml
similarity index 100%
rename from core-ui/res/values/attrs.xml
rename to coordinatorlayout/src/main/res/values/attrs.xml
diff --git a/core-ui/res/values/styles.xml b/coordinatorlayout/src/main/res/values/styles.xml
similarity index 100%
rename from core-ui/res/values/styles.xml
rename to coordinatorlayout/src/main/res/values/styles.xml
diff --git a/core-ui/api/27.1.0.ignore b/core-ui/api/27.1.0.ignore
new file mode 100644
index 0000000..e38b98d
--- /dev/null
+++ b/core-ui/api/27.1.0.ignore
@@ -0,0 +1,21 @@
+21edeac
+c8f5cd8
+c6c4dfc
+3ee7015
+897caa3
+0a4a21e
+9a73d77
+2812bc8
+2b135f6
+6862ae7
+1bdc70f
+c79ca3e
+c9f0c98
+4a9b508
+0058a00
+28bb044
+8a30c7e
+19e12f3
+b7ca703
+c4280d0
+1017c49
diff --git a/core-ui/api/current.txt b/core-ui/api/current.txt
index 815d6e3..13abb73 100644
--- a/core-ui/api/current.txt
+++ b/core-ui/api/current.txt
@@ -1,100 +1,3 @@
-package android.support.design.widget {
-
- public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent2 {
- ctor public CoordinatorLayout(android.content.Context);
- ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
- ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
- method public void dispatchDependentViewsChanged(android.view.View);
- method public boolean doViewsOverlap(android.view.View, android.view.View);
- method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
- method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
- method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
- method public java.util.List<android.view.View> getDependencies(android.view.View);
- method public java.util.List<android.view.View> getDependents(android.view.View);
- method public android.graphics.drawable.Drawable getStatusBarBackground();
- method public boolean isPointInChildBounds(android.view.View, int, int);
- method public void onAttachedToWindow();
- method public void onDetachedFromWindow();
- method public void onDraw(android.graphics.Canvas);
- method public void onLayoutChild(android.view.View, int);
- method public void onMeasureChild(android.view.View, int, int, int, int);
- method public void onNestedPreScroll(android.view.View, int, int, int[], int);
- method public void onNestedScroll(android.view.View, int, int, int, int, int);
- method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
- method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
- method public void onStopNestedScroll(android.view.View, int);
- method public void setStatusBarBackground(android.graphics.drawable.Drawable);
- method public void setStatusBarBackgroundColor(int);
- method public void setStatusBarBackgroundResource(int);
- }
-
- public static abstract interface CoordinatorLayout.AttachedBehavior {
- method public abstract android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
- }
-
- public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
- ctor public CoordinatorLayout.Behavior();
- ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
- method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
- method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
- method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
- method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
- method public static java.lang.Object getTag(android.view.View);
- method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
- method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
- method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
- method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
- method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
- method public void onDetachedFromLayoutParams();
- method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
- method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
- method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
- method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
- method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
- method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
- method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
- method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
- method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
- method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
- method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
- method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
- method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
- method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
- method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
- method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
- method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
- method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
- method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
- method public static void setTag(android.view.View, java.lang.Object);
- }
-
- public static abstract deprecated class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
- }
-
- public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
- ctor public CoordinatorLayout.LayoutParams(int, int);
- ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
- ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
- ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
- method public int getAnchorId();
- method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
- method public void setAnchorId(int);
- method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
- field public int anchorGravity;
- field public int dodgeInsetEdges;
- field public int gravity;
- field public int insetEdge;
- field public int keyline;
- }
-
- protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
- ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
- ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
- }
-
-}
-
package android.support.v4.app {
public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
@@ -125,196 +28,6 @@
}
-package android.support.v4.view {
-
- public abstract class AbsSavedState implements android.os.Parcelable {
- ctor protected AbsSavedState(android.os.Parcelable);
- ctor protected AbsSavedState(android.os.Parcel);
- ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
- method public int describeContents();
- method public final android.os.Parcelable getSuperState();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
- field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
- }
-
- public final class AsyncLayoutInflater {
- ctor public AsyncLayoutInflater(android.content.Context);
- method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
- }
-
- public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
- method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
- }
-
- public class NestedScrollingChildHelper {
- ctor public NestedScrollingChildHelper(android.view.View);
- method public boolean dispatchNestedFling(float, float, boolean);
- method public boolean dispatchNestedPreFling(float, float);
- method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
- method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
- method public boolean dispatchNestedScroll(int, int, int, int, int[]);
- method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
- method public boolean hasNestedScrollingParent();
- method public boolean hasNestedScrollingParent(int);
- method public boolean isNestedScrollingEnabled();
- method public void onDetachedFromWindow();
- method public void onStopNestedScroll(android.view.View);
- method public void setNestedScrollingEnabled(boolean);
- method public boolean startNestedScroll(int);
- method public boolean startNestedScroll(int, int);
- method public void stopNestedScroll();
- method public void stopNestedScroll(int);
- }
-
- public class NestedScrollingParentHelper {
- ctor public NestedScrollingParentHelper(android.view.ViewGroup);
- method public int getNestedScrollAxes();
- method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
- method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
- method public void onStopNestedScroll(android.view.View);
- method public void onStopNestedScroll(android.view.View, int);
- }
-
- public abstract class PagerAdapter {
- ctor public PagerAdapter();
- method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
- method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
- method public void finishUpdate(android.view.ViewGroup);
- method public deprecated void finishUpdate(android.view.View);
- method public abstract int getCount();
- method public int getItemPosition(java.lang.Object);
- method public java.lang.CharSequence getPageTitle(int);
- method public float getPageWidth(int);
- method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
- method public deprecated java.lang.Object instantiateItem(android.view.View, int);
- method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
- method public void notifyDataSetChanged();
- method public void registerDataSetObserver(android.database.DataSetObserver);
- method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
- method public android.os.Parcelable saveState();
- method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
- method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
- method public void startUpdate(android.view.ViewGroup);
- method public deprecated void startUpdate(android.view.View);
- method public void unregisterDataSetObserver(android.database.DataSetObserver);
- field public static final int POSITION_NONE = -2; // 0xfffffffe
- field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
- }
-
- public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
- ctor public PagerTabStrip(android.content.Context);
- ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
- method public boolean getDrawFullUnderline();
- method public int getTabIndicatorColor();
- method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
- method public void setDrawFullUnderline(boolean);
- method public void setTabIndicatorColor(int);
- method public void setTabIndicatorColorResource(int);
- }
-
- public class PagerTitleStrip extends android.view.ViewGroup {
- ctor public PagerTitleStrip(android.content.Context);
- ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
- method public int getTextSpacing();
- method public void setGravity(int);
- method public void setNonPrimaryAlpha(float);
- method public void setTextColor(int);
- method public void setTextSize(int, float);
- method public void setTextSpacing(int);
- }
-
- public class ViewPager extends android.view.ViewGroup {
- ctor public ViewPager(android.content.Context);
- ctor public ViewPager(android.content.Context, android.util.AttributeSet);
- method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
- method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
- method public boolean arrowScroll(int);
- method public boolean beginFakeDrag();
- method protected boolean canScroll(android.view.View, boolean, int, int, int);
- method public void clearOnPageChangeListeners();
- method public void endFakeDrag();
- method public boolean executeKeyEvent(android.view.KeyEvent);
- method public void fakeDragBy(float);
- method public android.support.v4.view.PagerAdapter getAdapter();
- method public int getCurrentItem();
- method public int getOffscreenPageLimit();
- method public int getPageMargin();
- method public boolean isFakeDragging();
- method protected void onPageScrolled(int, float, int);
- method public void onRestoreInstanceState(android.os.Parcelable);
- method public android.os.Parcelable onSaveInstanceState();
- method public void removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
- method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
- method public void setAdapter(android.support.v4.view.PagerAdapter);
- method public void setCurrentItem(int);
- method public void setCurrentItem(int, boolean);
- method public void setOffscreenPageLimit(int);
- method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
- method public void setPageMargin(int);
- method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
- method public void setPageMarginDrawable(int);
- method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
- method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
- field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
- field public static final int SCROLL_STATE_IDLE = 0; // 0x0
- field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
- }
-
- public static abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
- }
-
- public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
- ctor public ViewPager.LayoutParams();
- ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
- field public int gravity;
- field public boolean isDecor;
- }
-
- public static abstract interface ViewPager.OnAdapterChangeListener {
- method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
- }
-
- public static abstract interface ViewPager.OnPageChangeListener {
- method public abstract void onPageScrollStateChanged(int);
- method public abstract void onPageScrolled(int, float, int);
- method public abstract void onPageSelected(int);
- }
-
- public static abstract interface ViewPager.PageTransformer {
- method public abstract void transformPage(android.view.View, float);
- }
-
- public static class ViewPager.SavedState extends android.support.v4.view.AbsSavedState {
- ctor public ViewPager.SavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
- }
-
- public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
- ctor public ViewPager.SimpleOnPageChangeListener();
- method public void onPageScrollStateChanged(int);
- method public void onPageScrolled(int, float, int);
- method public void onPageSelected(int);
- }
-
-}
-
-package android.support.v4.view.animation {
-
- public class FastOutLinearInInterpolator implements android.view.animation.Interpolator {
- ctor public FastOutLinearInInterpolator();
- }
-
- public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
- ctor public FastOutSlowInInterpolator();
- }
-
- public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
- ctor public LinearOutSlowInInterpolator();
- }
-
-}
-
package android.support.v4.widget {
public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
@@ -344,42 +57,6 @@
field public static final float RELATIVE_UNSPECIFIED = 0.0f;
}
- public class CircularProgressDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
- ctor public CircularProgressDrawable(android.content.Context);
- method public void draw(android.graphics.Canvas);
- method public boolean getArrowEnabled();
- method public float getArrowHeight();
- method public float getArrowScale();
- method public float getArrowWidth();
- method public int getBackgroundColor();
- method public float getCenterRadius();
- method public int[] getColorSchemeColors();
- method public float getEndTrim();
- method public int getOpacity();
- method public float getProgressRotation();
- method public float getStartTrim();
- method public android.graphics.Paint.Cap getStrokeCap();
- method public float getStrokeWidth();
- method public boolean isRunning();
- method public void setAlpha(int);
- method public void setArrowDimensions(float, float);
- method public void setArrowEnabled(boolean);
- method public void setArrowScale(float);
- method public void setBackgroundColor(int);
- method public void setCenterRadius(float);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setColorSchemeColors(int...);
- method public void setProgressRotation(float);
- method public void setStartEndTrim(float, float);
- method public void setStrokeCap(android.graphics.Paint.Cap);
- method public void setStrokeWidth(float);
- method public void setStyle(int);
- method public void start();
- method public void stop();
- field public static final int DEFAULT = 1; // 0x1
- field public static final int LARGE = 0; // 0x0
- }
-
public class ContentLoadingProgressBar extends android.widget.ProgressBar {
ctor public ContentLoadingProgressBar(android.content.Context);
ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
@@ -414,109 +91,6 @@
field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
}
- public class DrawerLayout extends android.view.ViewGroup {
- ctor public DrawerLayout(android.content.Context);
- ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
- ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
- method public void addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
- method public void closeDrawer(android.view.View);
- method public void closeDrawer(android.view.View, boolean);
- method public void closeDrawer(int);
- method public void closeDrawer(int, boolean);
- method public void closeDrawers();
- method public float getDrawerElevation();
- method public int getDrawerLockMode(int);
- method public int getDrawerLockMode(android.view.View);
- method public java.lang.CharSequence getDrawerTitle(int);
- method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
- method public boolean isDrawerOpen(android.view.View);
- method public boolean isDrawerOpen(int);
- method public boolean isDrawerVisible(android.view.View);
- method public boolean isDrawerVisible(int);
- method public void onDraw(android.graphics.Canvas);
- method public void openDrawer(android.view.View);
- method public void openDrawer(android.view.View, boolean);
- method public void openDrawer(int);
- method public void openDrawer(int, boolean);
- method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
- method public void setDrawerElevation(float);
- method public deprecated void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
- method public void setDrawerLockMode(int);
- method public void setDrawerLockMode(int, int);
- method public void setDrawerLockMode(int, android.view.View);
- method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
- method public void setDrawerShadow(int, int);
- method public void setDrawerTitle(int, java.lang.CharSequence);
- method public void setScrimColor(int);
- method public void setStatusBarBackground(android.graphics.drawable.Drawable);
- method public void setStatusBarBackground(int);
- method public void setStatusBarBackgroundColor(int);
- field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
- field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
- field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
- field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
- field public static final int STATE_DRAGGING = 1; // 0x1
- field public static final int STATE_IDLE = 0; // 0x0
- field public static final int STATE_SETTLING = 2; // 0x2
- }
-
- public static abstract interface DrawerLayout.DrawerListener {
- method public abstract void onDrawerClosed(android.view.View);
- method public abstract void onDrawerOpened(android.view.View);
- method public abstract void onDrawerSlide(android.view.View, float);
- method public abstract void onDrawerStateChanged(int);
- }
-
- public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
- ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
- ctor public DrawerLayout.LayoutParams(int, int);
- ctor public DrawerLayout.LayoutParams(int, int, int);
- ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
- ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
- ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
- field public int gravity;
- }
-
- protected static class DrawerLayout.SavedState extends android.support.v4.view.AbsSavedState {
- ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
- ctor public DrawerLayout.SavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
- }
-
- public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
- ctor public DrawerLayout.SimpleDrawerListener();
- method public void onDrawerClosed(android.view.View);
- method public void onDrawerOpened(android.view.View);
- method public void onDrawerSlide(android.view.View, float);
- method public void onDrawerStateChanged(int);
- }
-
- public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
- ctor public ExploreByTouchHelper(android.view.View);
- method public final boolean clearKeyboardFocusForVirtualView(int);
- method public final boolean dispatchHoverEvent(android.view.MotionEvent);
- method public final boolean dispatchKeyEvent(android.view.KeyEvent);
- method public final int getAccessibilityFocusedVirtualViewId();
- method public deprecated int getFocusedVirtualView();
- method public final int getKeyboardFocusedVirtualViewId();
- method protected abstract int getVirtualViewAt(float, float);
- method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
- method public final void invalidateRoot();
- method public final void invalidateVirtualView(int);
- method public final void invalidateVirtualView(int, int);
- method public final void onFocusChanged(boolean, int, android.graphics.Rect);
- method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
- method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
- method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
- method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
- method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
- method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
- method public final boolean requestKeyboardFocusForVirtualView(int);
- method public final boolean sendEventForVirtualView(int, int);
- field public static final int HOST_ID = -1; // 0xffffffff
- field public static final int INVALID_ID = -2147483648; // 0x80000000
- }
-
public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
ctor public ListViewAutoScrollHelper(android.widget.ListView);
method public boolean canTargetScrollHorizontally(int);
@@ -524,42 +98,6 @@
method public void scrollTargetBy(int, int);
}
- public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
- ctor public NestedScrollView(android.content.Context);
- ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
- ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
- method public boolean arrowScroll(int);
- method public int computeHorizontalScrollExtent();
- method public int computeHorizontalScrollOffset();
- method public int computeHorizontalScrollRange();
- method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
- method public int computeVerticalScrollExtent();
- method public int computeVerticalScrollOffset();
- method public int computeVerticalScrollRange();
- method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
- method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
- method public boolean executeKeyEvent(android.view.KeyEvent);
- method public void fling(int);
- method public boolean fullScroll(int);
- method public int getMaxScrollAmount();
- method public boolean hasNestedScrollingParent(int);
- method public boolean isFillViewport();
- method public boolean isSmoothScrollingEnabled();
- method public void onAttachedToWindow();
- method public boolean pageScroll(int);
- method public void setFillViewport(boolean);
- method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
- method public void setSmoothScrollingEnabled(boolean);
- method public final void smoothScrollBy(int, int);
- method public final void smoothScrollTo(int, int);
- method public boolean startNestedScroll(int, int);
- method public void stopNestedScroll(int);
- }
-
- public static abstract interface NestedScrollView.OnScrollChangeListener {
- method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
- }
-
public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
@@ -592,56 +130,6 @@
method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
}
- public class SlidingPaneLayout extends android.view.ViewGroup {
- ctor public SlidingPaneLayout(android.content.Context);
- ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
- ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
- method protected boolean canScroll(android.view.View, boolean, int, int, int);
- method public deprecated boolean canSlide();
- method public boolean closePane();
- method public int getCoveredFadeColor();
- method public int getParallaxDistance();
- method public int getSliderFadeColor();
- method public boolean isOpen();
- method public boolean isSlideable();
- method public boolean openPane();
- method public void setCoveredFadeColor(int);
- method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
- method public void setParallaxDistance(int);
- method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
- method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
- method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
- method public deprecated void setShadowResource(int);
- method public void setShadowResourceLeft(int);
- method public void setShadowResourceRight(int);
- method public void setSliderFadeColor(int);
- method public deprecated void smoothSlideClosed();
- method public deprecated void smoothSlideOpen();
- }
-
- public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
- ctor public SlidingPaneLayout.LayoutParams();
- ctor public SlidingPaneLayout.LayoutParams(int, int);
- ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
- ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
- ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
- ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
- field public float weight;
- }
-
- public static abstract interface SlidingPaneLayout.PanelSlideListener {
- method public abstract void onPanelClosed(android.view.View);
- method public abstract void onPanelOpened(android.view.View);
- method public abstract void onPanelSlide(android.view.View, float);
- }
-
- public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
- ctor public SlidingPaneLayout.SimplePanelSlideListener();
- method public void onPanelClosed(android.view.View);
- method public void onPanelOpened(android.view.View);
- method public void onPanelSlide(android.view.View, float);
- }
-
public deprecated class Space extends android.view.View {
ctor public deprecated Space(android.content.Context, android.util.AttributeSet, int);
ctor public deprecated Space(android.content.Context, android.util.AttributeSet);
@@ -650,101 +138,5 @@
method protected deprecated void onMeasure(int, int);
}
- public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
- ctor public SwipeRefreshLayout(android.content.Context);
- ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
- method public boolean canChildScrollUp();
- method public int getProgressCircleDiameter();
- method public int getProgressViewEndOffset();
- method public int getProgressViewStartOffset();
- method public boolean isRefreshing();
- method public void onMeasure(int, int);
- method public deprecated void setColorScheme(int...);
- method public void setColorSchemeColors(int...);
- method public void setColorSchemeResources(int...);
- method public void setDistanceToTriggerSync(int);
- method public void setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
- method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
- method public deprecated void setProgressBackgroundColor(int);
- method public void setProgressBackgroundColorSchemeColor(int);
- method public void setProgressBackgroundColorSchemeResource(int);
- method public void setProgressViewEndTarget(boolean, int);
- method public void setProgressViewOffset(boolean, int, int);
- method public void setRefreshing(boolean);
- method public void setSize(int);
- field public static final int DEFAULT = 1; // 0x1
- field public static final int LARGE = 0; // 0x0
- field protected int mFrom;
- field protected int mOriginalOffsetTop;
- }
-
- public static abstract interface SwipeRefreshLayout.OnChildScrollUpCallback {
- method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
- }
-
- public static abstract interface SwipeRefreshLayout.OnRefreshListener {
- method public abstract void onRefresh();
- }
-
- public class ViewDragHelper {
- method public void abort();
- method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
- method public void cancel();
- method public void captureChildView(android.view.View, int);
- method public boolean checkTouchSlop(int);
- method public boolean checkTouchSlop(int, int);
- method public boolean continueSettling(boolean);
- method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
- method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
- method public android.view.View findTopChildUnder(int, int);
- method public void flingCapturedView(int, int, int, int);
- method public int getActivePointerId();
- method public android.view.View getCapturedView();
- method public int getEdgeSize();
- method public float getMinVelocity();
- method public int getTouchSlop();
- method public int getViewDragState();
- method public boolean isCapturedViewUnder(int, int);
- method public boolean isEdgeTouched(int);
- method public boolean isEdgeTouched(int, int);
- method public boolean isPointerDown(int);
- method public boolean isViewUnder(android.view.View, int, int);
- method public void processTouchEvent(android.view.MotionEvent);
- method public void setEdgeTrackingEnabled(int);
- method public void setMinVelocity(float);
- method public boolean settleCapturedViewAt(int, int);
- method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
- method public boolean smoothSlideViewTo(android.view.View, int, int);
- field public static final int DIRECTION_ALL = 3; // 0x3
- field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
- field public static final int DIRECTION_VERTICAL = 2; // 0x2
- field public static final int EDGE_ALL = 15; // 0xf
- field public static final int EDGE_BOTTOM = 8; // 0x8
- field public static final int EDGE_LEFT = 1; // 0x1
- field public static final int EDGE_RIGHT = 2; // 0x2
- field public static final int EDGE_TOP = 4; // 0x4
- field public static final int INVALID_POINTER = -1; // 0xffffffff
- field public static final int STATE_DRAGGING = 1; // 0x1
- field public static final int STATE_IDLE = 0; // 0x0
- field public static final int STATE_SETTLING = 2; // 0x2
- }
-
- public static abstract class ViewDragHelper.Callback {
- ctor public ViewDragHelper.Callback();
- method public int clampViewPositionHorizontal(android.view.View, int, int);
- method public int clampViewPositionVertical(android.view.View, int, int);
- method public int getOrderedChildIndex(int);
- method public int getViewHorizontalDragRange(android.view.View);
- method public int getViewVerticalDragRange(android.view.View);
- method public void onEdgeDragStarted(int, int);
- method public boolean onEdgeLock(int);
- method public void onEdgeTouched(int, int);
- method public void onViewCaptured(android.view.View, int);
- method public void onViewDragStateChanged(int);
- method public void onViewPositionChanged(android.view.View, int, int, int, int);
- method public void onViewReleased(android.view.View, float, float);
- method public abstract boolean tryCaptureView(android.view.View, int);
- }
-
}
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 4ff27cb..dc0c81e 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -9,7 +9,15 @@
dependencies {
api(project(":support-annotations"))
api(project(":support-compat"))
- api project(':support-core-utils')
+ api(project(":support-core-utils"))
+ api(project(":customview"))
+ api(project(":viewpager"))
+ api(project(":coordinatorlayout"))
+ api(project(":drawerlayout"))
+ api(project(":slidingpanelayout"))
+ api(project(":interpolator"))
+ api(project(":swiperefreshlayout"))
+ api(project(":asynclayoutinflater"))
androidTestImplementation(TEST_RUNNER)
androidTestImplementation(ESPRESSO_CORE)
@@ -22,18 +30,6 @@
testImplementation(JUNIT)
}
-android {
- sourceSets {
- main.res.srcDirs = [
- 'res',
- 'res-public'
- ]
- }
- buildTypes.all {
- consumerProguardFiles 'proguard-rules.pro'
- }
-}
-
supportLibrary {
name = "Android Support Library core UI"
publish = true
@@ -41,5 +37,4 @@
mavenGroup = LibraryGroups.SUPPORT
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 14 or later."
- legacySourceLocation = true
}
diff --git a/core-ui/lint-baseline.xml b/core-ui/lint-baseline.xml
deleted file mode 100644
index 5869ece..0000000
--- a/core-ui/lint-baseline.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 3.0.0-alpha9">
-
- <issue
- id="WrongConstant"
- message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
- errorLine1=" + gravityToString(childGravity) + " but this " + TAG + " already has a ""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/DrawerLayout.java"
- line="1075"
- column="47"/>
- </issue>
-
-</issues>
diff --git a/core-ui/tests/AndroidManifest.xml b/core-ui/src/androidTest/AndroidManifest.xml
similarity index 78%
rename from core-ui/tests/AndroidManifest.xml
rename to core-ui/src/androidTest/AndroidManifest.xml
index 4ea7691..cb53f76 100644
--- a/core-ui/tests/AndroidManifest.xml
+++ b/core-ui/src/androidTest/AndroidManifest.xml
@@ -28,18 +28,8 @@
android:theme="@style/TestActivityTheme">
<activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
- <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
-
- <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
-
<activity android:name="android.support.v4.widget.ContentLoadingProgressBarActivity"/>
- <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
-
- <activity android:name="android.support.v4.view.ViewPagerWithTabStripActivity"/>
-
- <activity android:name="android.support.v4.view.ViewPagerTest$ViewPagerActivity"/>
-
<activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
<activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
diff --git a/core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/core-ui/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java
rename to core-ui/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/core-ui/tests/java/android/support/v4/BaseTestActivity.java b/core-ui/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/BaseTestActivity.java
rename to core-ui/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtils.java b/core-ui/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtils.java
rename to core-ui/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java b/core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
rename to core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarTest.java b/core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
rename to core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
diff --git a/core-ui/tests/res/anim/fade_in.xml b/core-ui/src/androidTest/res/anim/fade_in.xml
similarity index 100%
rename from core-ui/tests/res/anim/fade_in.xml
rename to core-ui/src/androidTest/res/anim/fade_in.xml
diff --git a/core-ui/tests/res/anim/fade_out.xml b/core-ui/src/androidTest/res/anim/fade_out.xml
similarity index 100%
rename from core-ui/tests/res/anim/fade_out.xml
rename to core-ui/src/androidTest/res/anim/fade_out.xml
diff --git a/core-ui/tests/res/anim/long_fade_in.xml b/core-ui/src/androidTest/res/anim/long_fade_in.xml
similarity index 100%
rename from core-ui/tests/res/anim/long_fade_in.xml
rename to core-ui/src/androidTest/res/anim/long_fade_in.xml
diff --git a/core-ui/tests/res/anim/long_fade_out.xml b/core-ui/src/androidTest/res/anim/long_fade_out.xml
similarity index 100%
rename from core-ui/tests/res/anim/long_fade_out.xml
rename to core-ui/src/androidTest/res/anim/long_fade_out.xml
diff --git a/core-ui/tests/res/layout/activity_content.xml b/core-ui/src/androidTest/res/layout/activity_content.xml
similarity index 100%
rename from core-ui/tests/res/layout/activity_content.xml
rename to core-ui/src/androidTest/res/layout/activity_content.xml
diff --git a/core-ui/tests/res/layout/content_loading_progress_bar_activity.xml b/core-ui/src/androidTest/res/layout/content_loading_progress_bar_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/content_loading_progress_bar_activity.xml
rename to core-ui/src/androidTest/res/layout/content_loading_progress_bar_activity.xml
diff --git a/core-ui/tests/res/layout/fragment_a.xml b/core-ui/src/androidTest/res/layout/fragment_a.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_a.xml
rename to core-ui/src/androidTest/res/layout/fragment_a.xml
diff --git a/core-ui/tests/res/layout/fragment_b.xml b/core-ui/src/androidTest/res/layout/fragment_b.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_b.xml
rename to core-ui/src/androidTest/res/layout/fragment_b.xml
diff --git a/core-ui/tests/res/layout/fragment_c.xml b/core-ui/src/androidTest/res/layout/fragment_c.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_c.xml
rename to core-ui/src/androidTest/res/layout/fragment_c.xml
diff --git a/core-ui/tests/res/layout/fragment_end.xml b/core-ui/src/androidTest/res/layout/fragment_end.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_end.xml
rename to core-ui/src/androidTest/res/layout/fragment_end.xml
diff --git a/core-ui/tests/res/layout/fragment_middle.xml b/core-ui/src/androidTest/res/layout/fragment_middle.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_middle.xml
rename to core-ui/src/androidTest/res/layout/fragment_middle.xml
diff --git a/core-ui/tests/res/layout/fragment_start.xml b/core-ui/src/androidTest/res/layout/fragment_start.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_start.xml
rename to core-ui/src/androidTest/res/layout/fragment_start.xml
diff --git a/core-ui/tests/res/layout/strict_view_fragment.xml b/core-ui/src/androidTest/res/layout/strict_view_fragment.xml
similarity index 100%
rename from core-ui/tests/res/layout/strict_view_fragment.xml
rename to core-ui/src/androidTest/res/layout/strict_view_fragment.xml
diff --git a/core-ui/tests/res/transition/change_bounds.xml b/core-ui/src/androidTest/res/transition/change_bounds.xml
similarity index 100%
rename from core-ui/tests/res/transition/change_bounds.xml
rename to core-ui/src/androidTest/res/transition/change_bounds.xml
diff --git a/core-ui/tests/res/transition/fade.xml b/core-ui/src/androidTest/res/transition/fade.xml
similarity index 100%
rename from core-ui/tests/res/transition/fade.xml
rename to core-ui/src/androidTest/res/transition/fade.xml
diff --git a/core-ui/tests/res/values/colors.xml b/core-ui/src/androidTest/res/values/colors.xml
similarity index 100%
rename from core-ui/tests/res/values/colors.xml
rename to core-ui/src/androidTest/res/values/colors.xml
diff --git a/core-ui/tests/res/values/dimens.xml b/core-ui/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from core-ui/tests/res/values/dimens.xml
rename to core-ui/src/androidTest/res/values/dimens.xml
diff --git a/core-ui/tests/res/values/strings.xml b/core-ui/src/androidTest/res/values/strings.xml
similarity index 100%
rename from core-ui/tests/res/values/strings.xml
rename to core-ui/src/androidTest/res/values/strings.xml
diff --git a/core-ui/tests/res/values/styles.xml b/core-ui/src/androidTest/res/values/styles.xml
similarity index 100%
rename from core-ui/tests/res/values/styles.xml
rename to core-ui/src/androidTest/res/values/styles.xml
diff --git a/core-ui/tests/NO_DOCS b/core-ui/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/core-ui/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/core-utils/api/27.1.0.ignore b/core-utils/api/27.1.0.ignore
new file mode 100644
index 0000000..57960fb
--- /dev/null
+++ b/core-utils/api/27.1.0.ignore
@@ -0,0 +1,3 @@
+8588484
+0261292
+d663798
diff --git a/core-utils/api/current.txt b/core-utils/api/current.txt
index d535653..2eb3482 100644
--- a/core-utils/api/current.txt
+++ b/core-utils/api/current.txt
@@ -158,14 +158,6 @@
method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
}
- public final class LocalBroadcastManager {
- method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
- method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
- method public boolean sendBroadcast(android.content.Intent);
- method public void sendBroadcastSync(android.content.Intent);
- method public void unregisterReceiver(android.content.BroadcastReceiver);
- }
-
public final class MimeTypeFilter {
method public static boolean matches(java.lang.String, java.lang.String);
method public static java.lang.String matches(java.lang.String, java.lang.String[]);
@@ -261,61 +253,3 @@
}
-package android.support.v4.print {
-
- public final class PrintHelper {
- ctor public PrintHelper(android.content.Context);
- method public int getColorMode();
- method public int getOrientation();
- method public int getScaleMode();
- method public void printBitmap(java.lang.String, android.graphics.Bitmap);
- method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
- method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
- method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
- method public void setColorMode(int);
- method public void setOrientation(int);
- method public void setScaleMode(int);
- method public static boolean systemSupportsPrint();
- field public static final int COLOR_MODE_COLOR = 2; // 0x2
- field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
- field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
- field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
- field public static final int SCALE_MODE_FILL = 2; // 0x2
- field public static final int SCALE_MODE_FIT = 1; // 0x1
- }
-
- public static abstract interface PrintHelper.OnPrintFinishCallback {
- method public abstract void onFinish();
- }
-
-}
-
-package android.support.v4.provider {
-
- public abstract class DocumentFile {
- method public abstract boolean canRead();
- method public abstract boolean canWrite();
- method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
- method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
- method public abstract boolean delete();
- method public abstract boolean exists();
- method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
- method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
- method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
- method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
- method public abstract java.lang.String getName();
- method public android.support.v4.provider.DocumentFile getParentFile();
- method public abstract java.lang.String getType();
- method public abstract android.net.Uri getUri();
- method public abstract boolean isDirectory();
- method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
- method public abstract boolean isFile();
- method public abstract boolean isVirtual();
- method public abstract long lastModified();
- method public abstract long length();
- method public abstract android.support.v4.provider.DocumentFile[] listFiles();
- method public abstract boolean renameTo(java.lang.String);
- }
-
-}
-
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index 2ab4fbb..df5daaa 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -9,6 +9,9 @@
dependencies {
api(project(":support-annotations"))
api(project(":support-compat"))
+ api(project(":documentfile"))
+ api(project(":localbroadcastmanager"))
+ api(project(":print"))
androidTestImplementation(TEST_RUNNER)
androidTestImplementation(ESPRESSO_CORE)
diff --git a/core-utils/src/androidTest/AndroidManifest.xml b/core-utils/src/androidTest/AndroidManifest.xml
index e3d060c..e3f1097 100644
--- a/core-utils/src/androidTest/AndroidManifest.xml
+++ b/core-utils/src/androidTest/AndroidManifest.xml
@@ -31,13 +31,6 @@
<activity android:name="android.support.v4.app.FrameMetricsActivity"/>
<activity android:name="android.support.v4.app.FrameMetricsSubActivity"/>
<activity android:name="android.support.v4.widget.TestActivity"/>
- <activity android:name="android.support.v4.provider.GrantActivity"
- android:label="_GrantActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="moocow"
diff --git a/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java b/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java
deleted file mode 100644
index a354201..0000000
--- a/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.provider;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.os.Bundle;
-
-/**
- * Stub activity used to request a permission grant for
- * {@link DocumentFileTest}.
- */
-public class GrantActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
- startActivityForResult(intent, 12);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == 12 && resultCode == RESULT_OK) {
- final ContentResolver resolver = getContentResolver();
- resolver.takePersistableUriPermission(data.getData(),
- Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- }
- }
-}
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index a15566a..ced95b8 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -17,12 +17,6 @@
androidTestImplementation(project(":support-testutils"))
}
-android {
- sourceSets {
- main.aidl.srcDirs = ["src/main/java"]
- }
-}
-
supportLibrary {
name = "Android Support Custom Tabs"
publish = true
@@ -30,6 +24,5 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support Custom Tabs"
- legacySourceLocation = true
minSdkVersion = 15
}
diff --git a/customtabs/tests/AndroidManifest.xml b/customtabs/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from customtabs/tests/AndroidManifest.xml
rename to customtabs/src/androidTest/AndroidManifest.xml
diff --git a/customtabs/tests/src/android/support/customtabs/CustomTabsIntentTest.java b/customtabs/src/androidTest/java/android/support/customtabs/CustomTabsIntentTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/CustomTabsIntentTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/CustomTabsIntentTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/PostMessageServiceConnectionTest.java b/customtabs/src/androidTest/java/android/support/customtabs/PostMessageServiceConnectionTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/PostMessageServiceConnectionTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/PostMessageServiceConnectionTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/PostMessageTest.java b/customtabs/src/androidTest/java/android/support/customtabs/PostMessageTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/PostMessageTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/PostMessageTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestActivity.java b/customtabs/src/androidTest/java/android/support/customtabs/TestActivity.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestActivity.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestActivity.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java b/customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsCallback.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsCallback.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java b/customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsService.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsService.java
diff --git a/customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java b/customtabs/src/androidTest/java/android/support/customtabs/TrustedWebUtilsTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TrustedWebUtilsTest.java
diff --git a/customtabs/tests/src/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java b/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
similarity index 100%
rename from customtabs/tests/src/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
rename to customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
diff --git a/customtabs/tests/src/androidx/browser/browseractions/BrowserActionsIntentTest.java b/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
similarity index 100%
rename from customtabs/tests/src/androidx/browser/browseractions/BrowserActionsIntentTest.java
rename to customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
diff --git a/customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl b/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
diff --git a/customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl b/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
diff --git a/customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl b/customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
diff --git a/customtabs/tests/NO_DOCS b/customtabs/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/customtabs/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/customview/api/current.txt b/customview/api/current.txt
new file mode 100644
index 0000000..1e8a9c1
--- /dev/null
+++ b/customview/api/current.txt
@@ -0,0 +1,105 @@
+package android.support.v4.view {
+
+ public abstract class AbsSavedState implements android.os.Parcelable {
+ ctor protected AbsSavedState(android.os.Parcelable);
+ ctor protected AbsSavedState(android.os.Parcel);
+ ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+ method public int describeContents();
+ method public final android.os.Parcelable getSuperState();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
+ field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
+ }
+
+}
+
+package android.support.v4.widget {
+
+ public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+ ctor public ExploreByTouchHelper(android.view.View);
+ method public final boolean clearKeyboardFocusForVirtualView(int);
+ method public final boolean dispatchHoverEvent(android.view.MotionEvent);
+ method public final boolean dispatchKeyEvent(android.view.KeyEvent);
+ method public final int getAccessibilityFocusedVirtualViewId();
+ method public deprecated int getFocusedVirtualView();
+ method public final int getKeyboardFocusedVirtualViewId();
+ method protected abstract int getVirtualViewAt(float, float);
+ method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
+ method public final void invalidateRoot();
+ method public final void invalidateVirtualView(int);
+ method public final void invalidateVirtualView(int, int);
+ method public final void onFocusChanged(boolean, int, android.graphics.Rect);
+ method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
+ method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
+ method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
+ method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+ method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+ method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
+ method public final boolean requestKeyboardFocusForVirtualView(int);
+ method public final boolean sendEventForVirtualView(int, int);
+ field public static final int HOST_ID = -1; // 0xffffffff
+ field public static final int INVALID_ID = -2147483648; // 0x80000000
+ }
+
+ public class ViewDragHelper {
+ method public void abort();
+ method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
+ method public void cancel();
+ method public void captureChildView(android.view.View, int);
+ method public boolean checkTouchSlop(int);
+ method public boolean checkTouchSlop(int, int);
+ method public boolean continueSettling(boolean);
+ method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
+ method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
+ method public android.view.View findTopChildUnder(int, int);
+ method public void flingCapturedView(int, int, int, int);
+ method public int getActivePointerId();
+ method public android.view.View getCapturedView();
+ method public int getEdgeSize();
+ method public float getMinVelocity();
+ method public int getTouchSlop();
+ method public int getViewDragState();
+ method public boolean isCapturedViewUnder(int, int);
+ method public boolean isEdgeTouched(int);
+ method public boolean isEdgeTouched(int, int);
+ method public boolean isPointerDown(int);
+ method public boolean isViewUnder(android.view.View, int, int);
+ method public void processTouchEvent(android.view.MotionEvent);
+ method public void setEdgeTrackingEnabled(int);
+ method public void setMinVelocity(float);
+ method public boolean settleCapturedViewAt(int, int);
+ method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
+ method public boolean smoothSlideViewTo(android.view.View, int, int);
+ field public static final int DIRECTION_ALL = 3; // 0x3
+ field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
+ field public static final int DIRECTION_VERTICAL = 2; // 0x2
+ field public static final int EDGE_ALL = 15; // 0xf
+ field public static final int EDGE_BOTTOM = 8; // 0x8
+ field public static final int EDGE_LEFT = 1; // 0x1
+ field public static final int EDGE_RIGHT = 2; // 0x2
+ field public static final int EDGE_TOP = 4; // 0x4
+ field public static final int INVALID_POINTER = -1; // 0xffffffff
+ field public static final int STATE_DRAGGING = 1; // 0x1
+ field public static final int STATE_IDLE = 0; // 0x0
+ field public static final int STATE_SETTLING = 2; // 0x2
+ }
+
+ public static abstract class ViewDragHelper.Callback {
+ ctor public ViewDragHelper.Callback();
+ method public int clampViewPositionHorizontal(android.view.View, int, int);
+ method public int clampViewPositionVertical(android.view.View, int, int);
+ method public int getOrderedChildIndex(int);
+ method public int getViewHorizontalDragRange(android.view.View);
+ method public int getViewVerticalDragRange(android.view.View);
+ method public void onEdgeDragStarted(int, int);
+ method public boolean onEdgeLock(int);
+ method public void onEdgeTouched(int, int);
+ method public void onViewCaptured(android.view.View, int);
+ method public void onViewDragStateChanged(int);
+ method public void onViewPositionChanged(android.view.View, int, int, int, int);
+ method public void onViewReleased(android.view.View, float, float);
+ method public abstract boolean tryCaptureView(android.view.View, int);
+ }
+
+}
+
diff --git a/customview/build.gradle b/customview/build.gradle
new file mode 100644
index 0000000..108ec71
--- /dev/null
+++ b/customview/build.gradle
@@ -0,0 +1,25 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+
+ androidTestImplementation(JUNIT)
+ androidTestImplementation(TEST_RUNNER)
+ androidTestImplementation(TEST_RULES)
+}
+
+supportLibrary {
+ name = "Android Support Library Custom View"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/customview/src/androidTest/AndroidManifest.xml b/customview/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..e65bd94
--- /dev/null
+++ b/customview/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.support.customview.test">
+ <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+ <application android:supportsRtl="true">
+ <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
+ </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
similarity index 88%
rename from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
rename to customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
index d78b49b..4fe9aa0 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
+++ b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
@@ -19,36 +19,40 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
import android.graphics.Rect;
-import android.os.Build;
import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.annotation.NonNull;
+import android.support.customview.test.R;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
-import android.support.v4.BaseInstrumentationTestCase;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.View;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.List;
@SmallTest
-public class ExploreByTouchHelperTest extends BaseInstrumentationTestCase<ExploreByTouchHelperTestActivity> {
+@RunWith(AndroidJUnit4.class)
+public class ExploreByTouchHelperTest {
+ @Rule
+ public final ActivityTestRule<ExploreByTouchHelperTestActivity> mActivityTestRule;
+
private View mHost;
public ExploreByTouchHelperTest() {
- super(ExploreByTouchHelperTestActivity.class);
+ mActivityTestRule = new ActivityTestRule<>(ExploreByTouchHelperTestActivity.class);
}
@Before
public void setUp() {
- // Accessibility delegates are only supported on API 14+.
- assumeTrue(Build.VERSION.SDK_INT >= 14);
mHost = mActivityTestRule.getActivity().findViewById(R.id.host_view);
}
@@ -132,7 +136,8 @@
}
@Override
- protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat node) {
+ protected void onPopulateNodeForVirtualView(int virtualViewId,
+ @NonNull AccessibilityNodeInfoCompat node) {
if (virtualViewId == 1) {
node.setContentDescription("test");
@@ -142,7 +147,8 @@
}
@Override
- protected boolean onPerformActionForVirtualView(int virtualViewId, int action, Bundle arguments) {
+ protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
+ Bundle arguments) {
return false;
}
}
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
similarity index 67%
rename from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
rename to customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
index 19d1598..16e3faa 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
+++ b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
@@ -16,12 +16,14 @@
package android.support.v4.widget;
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.customview.test.R;
-public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
+public class ExploreByTouchHelperTestActivity extends Activity {
@Override
- protected int getContentViewLayoutResId() {
- return R.layout.explore_by_touch_helper_activity;
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.explore_by_touch_helper_activity);
}
}
diff --git a/core-ui/tests/res/layout/explore_by_touch_helper_activity.xml b/customview/src/androidTest/res/layout/explore_by_touch_helper_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/explore_by_touch_helper_activity.xml
rename to customview/src/androidTest/res/layout/explore_by_touch_helper_activity.xml
diff --git a/customview/src/main/AndroidManifest.xml b/customview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..30bedbe
--- /dev/null
+++ b/customview/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.customview"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/AbsSavedState.java b/customview/src/main/java/android/support/v4/view/AbsSavedState.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/AbsSavedState.java
rename to customview/src/main/java/android/support/v4/view/AbsSavedState.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java b/customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
similarity index 99%
rename from core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
rename to customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
index 2b5ed0a..d7de9be 100644
--- a/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
+++ b/customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
@@ -1251,8 +1251,8 @@
@Override
public AccessibilityNodeInfoCompat findFocus(int focusType) {
- int focusedId = (focusType == AccessibilityNodeInfoCompat.FOCUS_ACCESSIBILITY) ?
- mAccessibilityFocusedVirtualViewId : mKeyboardFocusedVirtualViewId;
+ int focusedId = (focusType == AccessibilityNodeInfoCompat.FOCUS_ACCESSIBILITY)
+ ? mAccessibilityFocusedVirtualViewId : mKeyboardFocusedVirtualViewId;
if (focusedId == INVALID_ID) {
return null;
}
diff --git a/core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java b/customview/src/main/java/android/support/v4/widget/FocusStrategy.java
similarity index 98%
rename from core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
rename to customview/src/main/java/android/support/v4/widget/FocusStrategy.java
index 77353c5..cf112bf 100644
--- a/core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
+++ b/customview/src/main/java/android/support/v4/widget/FocusStrategy.java
@@ -19,10 +19,9 @@
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.view.View;
-
import android.support.v4.view.ViewCompat.FocusRealDirection;
import android.support.v4.view.ViewCompat.FocusRelativeDirection;
+import android.view.View;
import java.util.ArrayList;
import java.util.Collections;
@@ -430,8 +429,7 @@
case View.FOCUS_DOWN:
// the distance between the center horizontals
return Math.abs(
- ((source.left + source.width() / 2) -
- ((dest.left + dest.width() / 2))));
+ ((source.left + source.width() / 2) - ((dest.left + dest.width() / 2))));
}
throw new IllegalArgumentException("direction must be one of "
+ "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
diff --git a/core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java b/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java
rename to customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
diff --git a/documentfile/api/current.txt b/documentfile/api/current.txt
new file mode 100644
index 0000000..6d7790b
--- /dev/null
+++ b/documentfile/api/current.txt
@@ -0,0 +1,29 @@
+package android.support.v4.provider {
+
+ public abstract class DocumentFile {
+ method public abstract boolean canRead();
+ method public abstract boolean canWrite();
+ method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
+ method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
+ method public abstract boolean delete();
+ method public abstract boolean exists();
+ method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
+ method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
+ method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
+ method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
+ method public abstract java.lang.String getName();
+ method public android.support.v4.provider.DocumentFile getParentFile();
+ method public abstract java.lang.String getType();
+ method public abstract android.net.Uri getUri();
+ method public abstract boolean isDirectory();
+ method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
+ method public abstract boolean isFile();
+ method public abstract boolean isVirtual();
+ method public abstract long lastModified();
+ method public abstract long length();
+ method public abstract android.support.v4.provider.DocumentFile[] listFiles();
+ method public abstract boolean renameTo(java.lang.String);
+ }
+
+}
+
diff --git a/documentfile/build.gradle b/documentfile/build.gradle
new file mode 100644
index 0000000..2f59518
--- /dev/null
+++ b/documentfile/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+}
+
+supportLibrary {
+ name = "Android Support Library Document File"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/documentfile/src/main/AndroidManifest.xml b/documentfile/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7602dd7
--- /dev/null
+++ b/documentfile/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.documentfile"/>
diff --git a/core-utils/src/main/java/android/support/v4/provider/DocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/DocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/DocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/DocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java b/documentfile/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
rename to documentfile/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/RawDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/RawDocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/SingleDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/SingleDocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/TreeDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/TreeDocumentFile.java
diff --git a/drawerlayout/api/current.txt b/drawerlayout/api/current.txt
new file mode 100644
index 0000000..c1a0b4c
--- /dev/null
+++ b/drawerlayout/api/current.txt
@@ -0,0 +1,81 @@
+package android.support.v4.widget {
+
+ public class DrawerLayout extends android.view.ViewGroup {
+ ctor public DrawerLayout(android.content.Context);
+ ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
+ ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
+ method public void addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+ method public void closeDrawer(android.view.View);
+ method public void closeDrawer(android.view.View, boolean);
+ method public void closeDrawer(int);
+ method public void closeDrawer(int, boolean);
+ method public void closeDrawers();
+ method public float getDrawerElevation();
+ method public int getDrawerLockMode(int);
+ method public int getDrawerLockMode(android.view.View);
+ method public java.lang.CharSequence getDrawerTitle(int);
+ method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
+ method public boolean isDrawerOpen(android.view.View);
+ method public boolean isDrawerOpen(int);
+ method public boolean isDrawerVisible(android.view.View);
+ method public boolean isDrawerVisible(int);
+ method public void onDraw(android.graphics.Canvas);
+ method public void openDrawer(android.view.View);
+ method public void openDrawer(android.view.View, boolean);
+ method public void openDrawer(int);
+ method public void openDrawer(int, boolean);
+ method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+ method public void setDrawerElevation(float);
+ method public deprecated void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+ method public void setDrawerLockMode(int);
+ method public void setDrawerLockMode(int, int);
+ method public void setDrawerLockMode(int, android.view.View);
+ method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
+ method public void setDrawerShadow(int, int);
+ method public void setDrawerTitle(int, java.lang.CharSequence);
+ method public void setScrimColor(int);
+ method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+ method public void setStatusBarBackground(int);
+ method public void setStatusBarBackgroundColor(int);
+ field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
+ field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
+ field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
+ field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
+ field public static final int STATE_DRAGGING = 1; // 0x1
+ field public static final int STATE_IDLE = 0; // 0x0
+ field public static final int STATE_SETTLING = 2; // 0x2
+ }
+
+ public static abstract interface DrawerLayout.DrawerListener {
+ method public abstract void onDrawerClosed(android.view.View);
+ method public abstract void onDrawerOpened(android.view.View);
+ method public abstract void onDrawerSlide(android.view.View, float);
+ method public abstract void onDrawerStateChanged(int);
+ }
+
+ public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor public DrawerLayout.LayoutParams(int, int);
+ ctor public DrawerLayout.LayoutParams(int, int, int);
+ ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
+ ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+ field public int gravity;
+ }
+
+ protected static class DrawerLayout.SavedState extends android.support.v4.view.AbsSavedState {
+ ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+ ctor public DrawerLayout.SavedState(android.os.Parcelable);
+ field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
+ }
+
+ public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
+ ctor public DrawerLayout.SimpleDrawerListener();
+ method public void onDrawerClosed(android.view.View);
+ method public void onDrawerOpened(android.view.View);
+ method public void onDrawerSlide(android.view.View, float);
+ method public void onDrawerStateChanged(int);
+ }
+
+}
+
diff --git a/drawerlayout/build.gradle b/drawerlayout/build.gradle
new file mode 100644
index 0000000..1d1476b
--- /dev/null
+++ b/drawerlayout/build.gradle
@@ -0,0 +1,21 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+ api(project(":customview"))
+}
+
+supportLibrary {
+ name = "Android Support Library Drawer Layout"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/drawerlayout/src/main/AndroidManifest.xml b/drawerlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..154538c
--- /dev/null
+++ b/drawerlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.drawerlayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java b/drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
similarity index 99%
rename from core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
rename to drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
index aa2077d..66104ea 100644
--- a/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
+++ b/drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
@@ -19,6 +19,7 @@
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
@@ -964,6 +965,7 @@
mFirstLayout = true;
}
+ @SuppressLint("WrongConstant")
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index 10e49e0..451e874 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -22,5 +22,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2017"
description = "Physics-based animation in support library, where the animations are driven by physics force. You can use this Animation library to create smooth and realistic animations."
- legacySourceLocation = true
}
\ No newline at end of file
diff --git a/dynamic-animation/tests/AndroidManifest.xml b/dynamic-animation/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from dynamic-animation/tests/AndroidManifest.xml
rename to dynamic-animation/src/androidTest/AndroidManifest.xml
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/AnimationActivity.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/AnimationActivity.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/AnimationActivity.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/AnimationActivity.java
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/FlingTests.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/FlingTests.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/FlingTests.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/FlingTests.java
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/SpringTests.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/SpringTests.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/SpringTests.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/SpringTests.java
diff --git a/dynamic-animation/tests/res/layout/anim_layout.xml b/dynamic-animation/src/androidTest/res/layout/anim_layout.xml
similarity index 100%
rename from dynamic-animation/tests/res/layout/anim_layout.xml
rename to dynamic-animation/src/androidTest/res/layout/anim_layout.xml
diff --git a/dynamic-animation/tests/NO_DOCS b/dynamic-animation/tests/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/dynamic-animation/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index a4aaff2..8a75f66 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -33,5 +33,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2017"
description = "EmojiCompat Widgets for AppCompat integration"
- legacySourceLocation = true
}
\ No newline at end of file
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index a2760d3..7c3a76a 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -36,5 +36,4 @@
name = "Unicode, Inc. License"
url = "http://www.unicode.org/copyright.html#License"
}
- legacySourceLocation = true
}
\ No newline at end of file
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 8d470f0..449ebb1 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -44,11 +44,6 @@
}
androidTest {
- // We use a non-standard test directory structure.
- root 'tests'
- java.srcDir 'tests/src'
- res.srcDir 'tests/res'
- manifest.srcFile 'tests/AndroidManifest.xml'
assets {
srcDirs = [new File(fontDir, "font").getAbsolutePath(),
new File(fontDir, "supported-emojis").getAbsolutePath()]
diff --git a/emoji/core/tests/AndroidManifest.xml b/emoji/core/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from emoji/core/tests/AndroidManifest.xml
rename to emoji/core/src/androidTest/AndroidManifest.xml
diff --git a/emoji/core/tests/java/android/support/text/emoji/AllEmojisTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/AllEmojisTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/AllEmojisTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/AllEmojisTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/ConfigTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/ConfigTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/ConfigTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
similarity index 99%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
index 654da41..5d14876 100644
--- a/emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java
+++ b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
@@ -552,7 +552,7 @@
EmojiCompat.reset(config);
final String string = new TestString(EMOJI_SINGLE_CODEPOINT).append(
- EMOJI_FLAG).toString();
+ EMOJI_SINGLE_CODEPOINT).toString();
CharSequence processed = EmojiCompat.get().process(string, 0, string.length(),
Integer.MAX_VALUE, EmojiCompat.REPLACE_STRATEGY_ALL);
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiKeyboardTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiKeyboardTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiKeyboardTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiKeyboardTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiSpanTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiSpanTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/HardDeleteTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/HardDeleteTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/HardDeleteTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/HardDeleteTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/InitCallbackTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/InitCallbackTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/MetadataRepoTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/MetadataRepoTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/MetadataRepoTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/MetadataRepoTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/SoftDeleteTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/SoftDeleteTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/SoftDeleteTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/SoftDeleteTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestActivity.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestActivity.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestActivity.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestActivity.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestConfigBuilder.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestConfigBuilder.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestEmojiMetadata.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestEmojiMetadata.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestEmojiMetadata.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestEmojiMetadata.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/UninitializedStateTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/UninitializedStateTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/UninitializedStateTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/UninitializedStateTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/Emoji.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/Emoji.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/Emoji.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/Emoji.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/EmojiMatcher.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/EmojiMatcher.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/KeyboardUtil.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/KeyboardUtil.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/KeyboardUtil.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/KeyboardUtil.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/TestString.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/TestString.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/TestString.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/TestString.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputFilterTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/SpannableBuilderTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/SpannableBuilderTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/SpannableBuilderTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/SpannableBuilderTest.java
diff --git a/emoji/core/tests/res/layout/activity_default.xml b/emoji/core/src/androidTest/res/layout/activity_default.xml
similarity index 100%
rename from emoji/core/tests/res/layout/activity_default.xml
rename to emoji/core/src/androidTest/res/layout/activity_default.xml
diff --git a/emoji/core/tests/res/layout/extract_view.xml b/emoji/core/src/androidTest/res/layout/extract_view.xml
similarity index 100%
rename from emoji/core/tests/res/layout/extract_view.xml
rename to emoji/core/src/androidTest/res/layout/extract_view.xml
diff --git a/emoji/core/tests/res/layout/extract_view_with_attrs.xml b/emoji/core/src/androidTest/res/layout/extract_view_with_attrs.xml
similarity index 100%
rename from emoji/core/tests/res/layout/extract_view_with_attrs.xml
rename to emoji/core/src/androidTest/res/layout/extract_view_with_attrs.xml
diff --git a/exifinterface/src/androidTest/NO_DOCS b/exifinterface/src/androidTest/NO_DOCS
deleted file mode 100644
index bd77b1a..0000000
--- a/exifinterface/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/fragment/api/current.txt b/fragment/api/current.txt
index 5df18f8..6e452a8 100644
--- a/fragment/api/current.txt
+++ b/fragment/api/current.txt
@@ -388,9 +388,11 @@
method public abstract void destroyLoader(int);
method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public static void enableDebugLogging(boolean);
+ method public static <T extends android.arch.lifecycle.LifecycleOwner & android.arch.lifecycle.ViewModelStoreOwner> android.support.v4.app.LoaderManager getInstance(T);
method public abstract <D> android.support.v4.content.Loader<D> getLoader(int);
method public boolean hasRunningLoaders();
method public abstract <D> android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+ method public abstract void markForRedelivery();
method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
}
diff --git a/fragment/src/androidTest/AndroidManifest.xml b/fragment/src/androidTest/AndroidManifest.xml
index 57ff953..dc58993 100644
--- a/fragment/src/androidTest/AndroidManifest.xml
+++ b/fragment/src/androidTest/AndroidManifest.xml
@@ -32,6 +32,7 @@
<activity android:name="android.support.v4.app.test.FragmentResultActivity"/>
+ <activity android:name="android.support.v4.app.test.EmptyActivity"/>
<activity android:name="android.support.v4.app.test.LoaderActivity"/>
<activity android:name="android.support.v4.app.test.NewIntentActivity"
diff --git a/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
index 89433df..f816dd8 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -1098,8 +1098,8 @@
}
/**
- * When there are no retained instance fragments, the FragmentManagerNonConfig should be
- * null
+ * When there are no retained instance fragments, the FragmentManagerNonConfig's fragments
+ * should be null
*/
@Test
@UiThreadTest
@@ -1116,7 +1116,7 @@
fm.executePendingTransactions();
Pair<Parcelable, FragmentManagerNonConfig> savedState =
FragmentTestUtil.destroy(mActivityRule, fc);
- assertNull(savedState.second);
+ assertNull(savedState.second.getFragments());
}
/**
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
index 799b6ab..5df61dc 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
@@ -18,14 +18,17 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import android.content.Context;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.app.test.LoaderActivity;
+import android.support.v4.app.test.DummyLoaderCallbacks;
+import android.support.v4.app.test.EmptyActivity;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
@@ -41,15 +44,14 @@
public class LoaderInfoTest {
@Rule
- public ActivityTestRule<LoaderActivity> mActivityRule =
- new ActivityTestRule<>(LoaderActivity.class);
+ public ActivityTestRule<EmptyActivity> mActivityRule =
+ new ActivityTestRule<>(EmptyActivity.class);
@Test
public void testIsCallbackWaitingForData() throws Throwable {
- final LoaderTest.DummyLoaderCallbacks loaderCallback =
- new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+ final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
final CountDownLatch deliverResultLatch = new CountDownLatch(1);
- Loader<Boolean> delayLoader = new AsyncTaskLoader<Boolean>(mActivityRule.getActivity()) {
+ Loader<Boolean> delayLoader = new AsyncTaskLoader<Boolean>(mock(Context.class)) {
@Override
public Boolean loadInBackground() {
SystemClock.sleep(50);
@@ -93,8 +95,7 @@
@UiThreadTest
@Test
public void testSetCallback() throws Throwable {
- final LoaderTest.DummyLoaderCallbacks loaderCallback =
- new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+ final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
Loader<Boolean> loader = loaderCallback.onCreateLoader(0, null);
final LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
0, null, loader);
@@ -109,8 +110,7 @@
@UiThreadTest
@Test
public void testSetCallback_replace() throws Throwable {
- LoaderTest.DummyLoaderCallbacks initialCallback =
- new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+ final DummyLoaderCallbacks initialCallback = new DummyLoaderCallbacks(mock(Context.class));
Loader<Boolean> loader = initialCallback.onCreateLoader(0, null);
LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
0, null, loader);
@@ -121,8 +121,8 @@
assertTrue("onLoadFinished for initial should be called after setCallback initial",
initialCallback.mOnLoadFinished);
- final LoaderTest.DummyLoaderCallbacks replacementCallback =
- new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+ final DummyLoaderCallbacks replacementCallback =
+ new DummyLoaderCallbacks(mActivityRule.getActivity());
initialCallback.mOnLoadFinished = false;
loaderInfo.setCallback(mActivityRule.getActivity(), replacementCallback);
@@ -137,8 +137,7 @@
@UiThreadTest
@Test
public void testDestroy() throws Throwable {
- final LoaderTest.DummyLoaderCallbacks loaderCallback =
- new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+ final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
final Loader<Boolean> loader = loaderCallback.onCreateLoader(0, null);
final LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
0, null, loader);
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java
new file mode 100644
index 0000000..3b55565
--- /dev/null
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.ViewModelStore;
+import android.arch.lifecycle.ViewModelStoreOwner;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.test.DummyLoaderCallbacks;
+import android.support.v4.app.test.EmptyActivity;
+import android.support.v4.content.Loader;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LoaderManagerTest {
+
+ @Rule
+ public ActivityTestRule<EmptyActivity> mActivityRule =
+ new ActivityTestRule<>(EmptyActivity.class);
+
+ @Test
+ public void testDestroyFromOnCreateLoader() throws Throwable {
+ final LoaderOwner loaderOwner = new LoaderOwner();
+ final CountDownLatch onCreateLoaderLatch = new CountDownLatch(1);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ LoaderManager.getInstance(loaderOwner).initLoader(65, null,
+ new DummyLoaderCallbacks(mock(Context.class)) {
+ @NonNull
+ @Override
+ public Loader<Boolean> onCreateLoader(int id, Bundle args) {
+ try {
+ LoaderManager.getInstance(loaderOwner).destroyLoader(65);
+ fail("Calling destroyLoader in onCreateLoader should throw an "
+ + "IllegalStateException");
+ } catch (IllegalStateException e) {
+ // Expected
+ onCreateLoaderLatch.countDown();
+ }
+ return super.onCreateLoader(id, args);
+ }
+ });
+ }
+ });
+ onCreateLoaderLatch.await(1, TimeUnit.SECONDS);
+ }
+
+ /**
+ * Test to ensure that loader operations, such as destroyLoader, can safely be called
+ * in onLoadFinished
+ */
+ @Test
+ public void testDestroyFromOnLoadFinished() throws Throwable {
+ final LoaderOwner loaderOwner = new LoaderOwner();
+ final CountDownLatch onLoadFinishedLatch = new CountDownLatch(1);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ LoaderManager.getInstance(loaderOwner).initLoader(43, null,
+ new DummyLoaderCallbacks(mock(Context.class)) {
+ @Override
+ public void onLoadFinished(@NonNull Loader<Boolean> loader,
+ Boolean data) {
+ super.onLoadFinished(loader, data);
+ LoaderManager.getInstance(loaderOwner).destroyLoader(43);
+ }
+ });
+ }
+ });
+ onLoadFinishedLatch.await(1, TimeUnit.SECONDS);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void enforceOnMainThread_initLoader() {
+ LoaderOwner loaderOwner = new LoaderOwner();
+ LoaderManager.getInstance(loaderOwner).initLoader(-1, null,
+ new DummyLoaderCallbacks(mock(Context.class)));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void enforceOnMainThread_restartLoader() {
+ LoaderOwner loaderOwner = new LoaderOwner();
+ LoaderManager.getInstance(loaderOwner).restartLoader(-1, null,
+ new DummyLoaderCallbacks(mock(Context.class)));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void enforceOnMainThread_destroyLoader() {
+ LoaderOwner loaderOwner = new LoaderOwner();
+ LoaderManager.getInstance(loaderOwner).destroyLoader(-1);
+ }
+
+ class LoaderOwner implements LifecycleOwner, ViewModelStoreOwner {
+
+ private LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
+ private ViewModelStore mViewModelStore = new ViewModelStore();
+
+ LoaderOwner() {
+ mLifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);
+ }
+
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycle;
+ }
+
+ @NonNull
+ @Override
+ public ViewModelStore getViewModelStore() {
+ return mViewModelStore;
+ }
+ }
+}
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
index 14c2321..2fb27f7 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.support.test.filters.SmallTest;
+import android.support.v4.app.test.DummyLoaderCallbacks;
import android.support.v4.content.Loader;
import org.junit.Test;
@@ -34,8 +35,7 @@
@Test
public void testOnChanged() {
- LoaderTest.DummyLoaderCallbacks callback =
- new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+ DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
@SuppressWarnings("unchecked")
LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
mock(Loader.class), callback);
@@ -54,8 +54,7 @@
@Test
public void testReset() {
- LoaderTest.DummyLoaderCallbacks callback =
- new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+ DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
@SuppressWarnings("unchecked")
LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
mock(Loader.class), callback);
@@ -69,8 +68,7 @@
@Test
public void testResetWithOnChanged() {
- LoaderTest.DummyLoaderCallbacks callback =
- new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+ DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
@SuppressWarnings("unchecked")
LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
mock(Loader.class), callback);
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
index 5a29135..1d89e27 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
@@ -142,52 +142,6 @@
}
/**
- * Test to ensure that loader operations, such as destroyLoader, can safely be called
- * in onLoadFinished
- */
- @Test
- public void testDestroyFromOnLoadFinished() throws Throwable {
- final LoaderActivity activity = mActivityRule.getActivity();
- final CountDownLatch onLoadFinishedLatch = new CountDownLatch(1);
- mActivityRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- final LoaderManager loaderManager = activity.getSupportLoaderManager();
- activity.getSupportLoaderManager().initLoader(43, null,
- new DummyLoaderCallbacks(activity) {
- @Override
- public void onLoadFinished(@NonNull Loader<Boolean> loader,
- Boolean data) {
- super.onLoadFinished(loader, data);
- loaderManager.destroyLoader(43);
- }
- });
- }
- });
- onLoadFinishedLatch.await(1, TimeUnit.SECONDS);
- }
-
- @Test(expected = IllegalStateException.class)
- public void enforceOnMainThread_initLoader() {
- LoaderActivity activity = mActivityRule.getActivity();
- activity.getSupportLoaderManager().initLoader(-1, null,
- new DummyLoaderCallbacks(activity));
- }
-
- @Test(expected = IllegalStateException.class)
- public void enforceOnMainThread_restartLoader() {
- LoaderActivity activity = mActivityRule.getActivity();
- activity.getSupportLoaderManager().restartLoader(-1, null,
- new DummyLoaderCallbacks(activity));
- }
-
- @Test(expected = IllegalStateException.class)
- public void enforceOnMainThread_destroyLoader() {
- LoaderActivity activity = mActivityRule.getActivity();
- activity.getSupportLoaderManager().destroyLoader(-1);
- }
-
- /**
* When a change is interrupted with stop, the data in the LoaderManager remains stale.
*/
//@Test
@@ -201,7 +155,7 @@
@Override
public void run() {
final Loader<String> loader =
- activity.getSupportLoaderManager().initLoader(DELAY_LOADER, null,
+ LoaderManager.getInstance(activity).initLoader(DELAY_LOADER, null,
new LoaderManager.LoaderCallbacks<String>() {
@NonNull
@Override
@@ -272,54 +226,41 @@
assertEquals("Second Value", activity.textViewB.getText().toString());
}
-
- public static class LoaderFragment extends Fragment {
+ public static class LoaderFragment extends Fragment implements
+ LoaderManager.LoaderCallbacks<Boolean> {
private static final int LOADER_ID = 1;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- getLoaderManager().initLoader(LOADER_ID, null,
- new DummyLoaderCallbacks(getContext()));
- }
- }
-
- static class DummyLoaderCallbacks implements LoaderManager.LoaderCallbacks<Boolean> {
- private final Context mContext;
-
- boolean mOnLoadFinished;
- boolean mOnLoaderReset;
-
- DummyLoaderCallbacks(Context context) {
- mContext = context;
+ LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this);
}
@NonNull
@Override
- public Loader<Boolean> onCreateLoader(int id, Bundle args) {
- return new DummyLoader(mContext);
+ public Loader<Boolean> onCreateLoader(int id, @Nullable Bundle args) {
+ return new SimpleLoader(requireContext());
}
@Override
public void onLoadFinished(@NonNull Loader<Boolean> loader, Boolean data) {
- mOnLoadFinished = true;
}
@Override
public void onLoaderReset(@NonNull Loader<Boolean> loader) {
- mOnLoaderReset = true;
- }
- }
-
- static class DummyLoader extends Loader<Boolean> {
- DummyLoader(Context context) {
- super(context);
}
- @Override
- protected void onStartLoading() {
- deliverResult(true);
+ static class SimpleLoader extends Loader<Boolean> {
+
+ SimpleLoader(@NonNull Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onStartLoading() {
+ deliverResult(true);
+ }
}
}
}
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
index 911e169..36384ce 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
@@ -19,32 +19,27 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
import android.content.Context;
import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.app.test.LoaderActivity;
+import android.support.v4.app.test.DummyLoader;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
-@RunWith(AndroidJUnit4.class)
+@RunWith(JUnit4.class)
@SmallTest
public class LoaderViewModelTest {
- @Rule
- public ActivityTestRule<LoaderActivity> mActivityRule =
- new ActivityTestRule<>(LoaderActivity.class);
-
@Test
public void testHasRunningLoaders() {
LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
assertFalse("LoaderViewModel should not be running with before putLoader",
loaderViewModel.hasRunningLoaders());
- AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mActivityRule.getActivity());
+ AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
loaderViewModel.putLoader(0, info);
assertTrue("LoaderViewModel should be running after a running LoaderInfo is added",
loaderViewModel.hasRunningLoaders());
@@ -57,8 +52,7 @@
@Test
public void testOnCleared() {
LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
- AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(
- mActivityRule.getActivity());
+ AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
loaderViewModel.putLoader(0, info);
assertFalse("LoaderInfo shouldn't be destroyed before onCleared", info.mDestroyed);
@@ -72,7 +66,7 @@
boolean mDestroyed = false;
AlwaysRunningLoaderInfo(Context context) {
- super(0, null, new LoaderTest.DummyLoader(context));
+ super(0, null, new DummyLoader(context));
}
@Override
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
similarity index 65%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
index ac61704..1668397 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
@@ -14,16 +14,18 @@
* limitations under the License.
*/
-package android.support.design.widget;
+package android.support.v4.app.test;
-import android.support.coreui.test.R;
+import android.content.Context;
+import android.support.v4.content.Loader;
-/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
- */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
+public class DummyLoader extends Loader<Boolean> {
+ public DummyLoader(Context context) {
+ super(context);
+ }
+
@Override
- protected int getContentViewLayoutResId() {
- return R.layout.dynamic_coordinator_layout;
+ protected void onStartLoading() {
+ deliverResult(true);
}
}
diff --git a/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java
new file mode 100644
index 0000000..2c09a2c
--- /dev/null
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app.test;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.Loader;
+
+public class DummyLoaderCallbacks implements LoaderManager.LoaderCallbacks<Boolean> {
+ private final Context mContext;
+
+ public boolean mOnLoadFinished;
+ public boolean mOnLoaderReset;
+
+ public DummyLoaderCallbacks(Context context) {
+ mContext = context;
+ }
+
+ @NonNull
+ @Override
+ public Loader<Boolean> onCreateLoader(int id, Bundle args) {
+ return new DummyLoader(mContext);
+ }
+
+ @Override
+ public void onLoadFinished(@NonNull Loader<Boolean> loader, Boolean data) {
+ mOnLoadFinished = true;
+ }
+
+ @Override
+ public void onLoaderReset(@NonNull Loader<Boolean> loader) {
+ mOnLoaderReset = true;
+ }
+}
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
similarity index 63%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
index ac61704..7c069f4 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
@@ -14,16 +14,9 @@
* limitations under the License.
*/
-package android.support.design.widget;
+package android.support.v4.app.test;
-import android.support.coreui.test.R;
+import android.support.v4.app.SupportActivity;
-/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
- */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
- @Override
- protected int getContentViewLayoutResId() {
- return R.layout.dynamic_coordinator_layout;
- }
+public class EmptyActivity extends SupportActivity {
}
diff --git a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
index 3ae5bab..f6ddf9c 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
@@ -57,7 +57,7 @@
@Override
protected void onResume() {
super.onResume();
- getSupportLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
+ LoaderManager.getInstance(this).initLoader(TEXT_LOADER_ID, null, this);
}
@NonNull
@@ -98,7 +98,7 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- getLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
+ LoaderManager.getInstance(this).initLoader(TEXT_LOADER_ID, null, this);
}
@Nullable
diff --git a/fragment/src/main/java/android/support/v4/app/Fragment.java b/fragment/src/main/java/android/support/v4/app/Fragment.java
index b15c49f..9eade40 100644
--- a/fragment/src/main/java/android/support/v4/app/Fragment.java
+++ b/fragment/src/main/java/android/support/v4/app/Fragment.java
@@ -209,8 +209,6 @@
// Hint provided by the app that this fragment is currently visible to the user.
boolean mUserVisibleHint = true;
- LoaderManagerImpl mLoaderManager;
-
// The animation and transition information for the fragment. This will be null
// unless the elements are explicitly accessed and should remain null for Fragments
// without Views.
@@ -971,14 +969,10 @@
}
/**
- * Return the LoaderManager for this fragment, creating it if needed.
+ * Return the LoaderManager for this fragment.
*/
public LoaderManager getLoaderManager() {
- if (mLoaderManager != null) {
- return mLoaderManager;
- }
- mLoaderManager = new LoaderManagerImpl(this, getViewModelStore());
- return mLoaderManager;
+ return LoaderManager.getInstance(this);
}
/**
@@ -2272,10 +2266,7 @@
writer.print("mStateAfterAnimating=");
writer.println(getStateAfterAnimating());
}
- if (mLoaderManager != null) {
- writer.print(prefix); writer.println("Loader Manager:");
- mLoaderManager.dump(prefix + " ", fd, writer, args);
- }
+ LoaderManager.getInstance(this).dump(prefix, fd, writer, args);
if (mChildFragmentManager != null) {
writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
mChildFragmentManager.dump(prefix + " ", fd, writer, args);
@@ -2564,13 +2555,11 @@
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onDestroyView()");
}
- if (mLoaderManager != null) {
- // Handles the detach/reattach case where the view hierarchy
- // is destroyed and recreated and an additional call to
- // onLoadFinished may be needed to ensure the new view
- // hierarchy is populated from data from the Loaders
- mLoaderManager.markForRedelivery();
- }
+ // Handles the detach/reattach case where the view hierarchy
+ // is destroyed and recreated and an additional call to
+ // onLoadFinished may be needed to ensure the new view
+ // hierarchy is populated from data from the Loaders
+ LoaderManager.getInstance(this).markForRedelivery();
mPerformedCreateView = false;
}
diff --git a/fragment/src/main/java/android/support/v4/app/FragmentActivity.java b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
index 18ac597..e47c505 100644
--- a/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
@@ -100,7 +100,6 @@
};
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
- LoaderManager mLoaderManager;
private ViewModelStore mViewModelStore;
@@ -678,9 +677,7 @@
writer.print(mResumed); writer.print(" mStopped=");
writer.print(mStopped); writer.print(" mReallyStopped=");
writer.println(mReallyStopped);
- if (mLoaderManager != null) {
- mLoaderManager.dump(innerPrefix, fd, writer, args);
- }
+ LoaderManager.getInstance(this).dump(innerPrefix, fd, writer, args);
mFragments.getSupportFragmentManager().dump(prefix, fd, writer, args);
}
@@ -728,11 +725,7 @@
}
public LoaderManager getSupportLoaderManager() {
- if (mLoaderManager != null) {
- return mLoaderManager;
- }
- mLoaderManager = new LoaderManagerImpl(this, getViewModelStore());
- return mLoaderManager;
+ return LoaderManager.getInstance(this);
}
/**
diff --git a/fragment/src/main/java/android/support/v4/app/FragmentManager.java b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
index f53bc32..dc99333 100644
--- a/fragment/src/main/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
@@ -1819,8 +1819,8 @@
for (int i = 0; i < numAdded; i++) {
Fragment f = mAdded.get(i);
moveFragmentToExpectedState(f);
- if (f.mLoaderManager != null) {
- loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+ if (f.mHost != null) {
+ loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
}
}
@@ -1831,8 +1831,8 @@
Fragment f = mActive.valueAt(i);
if (f != null && (f.mRemoving || f.mDetached) && !f.mIsNewlyAdded) {
moveFragmentToExpectedState(f);
- if (f.mLoaderManager != null) {
- loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+ if (f.mHost != null) {
+ loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
}
}
}
@@ -2695,8 +2695,8 @@
boolean loadersRunning = false;
for (int i = 0; i < mActive.size(); i++) {
Fragment f = mActive.valueAt(i);
- if (f != null && f.mLoaderManager != null) {
- loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+ if (f != null && f.mHost != null) {
+ loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
}
}
if (!loadersRunning) {
diff --git a/fragment/src/main/java/android/support/v4/app/LoaderManager.java b/fragment/src/main/java/android/support/v4/app/LoaderManager.java
index 4b08aec..4774b7b 100644
--- a/fragment/src/main/java/android/support/v4/app/LoaderManager.java
+++ b/fragment/src/main/java/android/support/v4/app/LoaderManager.java
@@ -16,6 +16,8 @@
package android.support.v4.app;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.ViewModelStoreOwner;
import android.os.Bundle;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
@@ -110,6 +112,22 @@
}
/**
+ * Gets a LoaderManager associated with the given owner, such as a {@link FragmentActivity} or
+ * {@link Fragment}.
+ *
+ * @param owner The owner that should be used to create the returned LoaderManager
+ * @param <T> A class that maintains its own {@link android.arch.lifecycle.Lifecycle} and
+ * {@link android.arch.lifecycle.ViewModelStore}. For instance,
+ * {@link FragmentActivity} or {@link Fragment}.
+ * @return A valid LoaderManager
+ */
+ @NonNull
+ public static <T extends LifecycleOwner & ViewModelStoreOwner> LoaderManager getInstance(
+ @NonNull T owner) {
+ return new LoaderManagerImpl(owner, owner.getViewModelStore());
+ }
+
+ /**
* Ensures a loader is initialized and active. If the loader doesn't
* already exist, one is created and (if the activity/fragment is currently
* started) starts the loader. Otherwise the last created
@@ -179,6 +197,22 @@
public abstract <D> Loader<D> getLoader(int id);
/**
+ * Mark all Loaders associated with this LoaderManager for redelivery of their current
+ * data (if any), waiting for the next time the Loader is started if it is currently stopped.
+ * In cases where no data has yet been delivered, this is effectively a no-op. In cases where
+ * data has already been delivered via {@link LoaderCallbacks#onLoadFinished(Loader, Object)},
+ * this will ensure that {@link LoaderCallbacks#onLoadFinished(Loader, Object)} is called again
+ * with the same data.
+ * <p>
+ * Call this only if you are implementing a {@link LifecycleOwner} where the views/elements that
+ * developers are likely to use in {@link LoaderCallbacks#onLoadFinished(Loader, Object)} can be
+ * created and destroyed multiple times without the {@link LifecycleOwner} itself being
+ * destroyed. Call this when the views/elements are being destroyed to ensure that the data
+ * is redelivered upon recreation.
+ */
+ public abstract void markForRedelivery();
+
+ /**
* Print the LoaderManager's state into the given stream.
*
* @param prefix Text to print at the front of each line.
diff --git a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
index 17687ff..fbda089 100644
--- a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
+++ b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
@@ -264,6 +264,19 @@
}
private SparseArrayCompat<LoaderInfo> mLoaders = new SparseArrayCompat<>();
+ private boolean mCreatingLoader = false;
+
+ void startCreatingLoader() {
+ mCreatingLoader = true;
+ }
+
+ boolean isCreatingLoader() {
+ return mCreatingLoader;
+ }
+
+ void finishCreatingLoader() {
+ mCreatingLoader = false;
+ }
void putLoader(int id, @NonNull LoaderInfo info) {
mLoaders.put(id, info);
@@ -325,8 +338,6 @@
private final @NonNull LifecycleOwner mLifecycleOwner;
private final @NonNull LoaderViewModel mLoaderViewModel;
- private boolean mCreatingLoader;
-
LoaderManagerImpl(@NonNull LifecycleOwner lifecycleOwner,
@NonNull ViewModelStore viewModelStore) {
mLifecycleOwner = lifecycleOwner;
@@ -339,7 +350,7 @@
@NonNull LoaderCallbacks<D> callback) {
LoaderInfo<D> info;
try {
- mCreatingLoader = true;
+ mLoaderViewModel.startCreatingLoader();
Loader<D> loader = callback.onCreateLoader(id, args);
if (loader.getClass().isMemberClass()
&& !Modifier.isStatic(loader.getClass().getModifiers())) {
@@ -351,7 +362,7 @@
if (DEBUG) Log.v(TAG, " Created new loader " + info);
mLoaderViewModel.putLoader(id, info);
} finally {
- mCreatingLoader = false;
+ mLoaderViewModel.finishCreatingLoader();
}
return info.setCallback(mLifecycleOwner, callback);
}
@@ -361,7 +372,7 @@
@Override
public <D> Loader<D> initLoader(int id, @Nullable Bundle args,
@NonNull LoaderCallbacks<D> callback) {
- if (mCreatingLoader) {
+ if (mLoaderViewModel.isCreatingLoader()) {
throw new IllegalStateException("Called while creating a loader");
}
if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -386,7 +397,7 @@
@Override
public <D> Loader<D> restartLoader(int id, @Nullable Bundle args,
@NonNull LoaderCallbacks<D> callback) {
- if (mCreatingLoader) {
+ if (mLoaderViewModel.isCreatingLoader()) {
throw new IllegalStateException("Called while creating a loader");
}
if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -403,7 +414,7 @@
@MainThread
@Override
public void destroyLoader(int id) {
- if (mCreatingLoader) {
+ if (mLoaderViewModel.isCreatingLoader()) {
throw new IllegalStateException("Called while creating a loader");
}
if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -421,7 +432,7 @@
@Nullable
@Override
public <D> Loader<D> getLoader(int id) {
- if (mCreatingLoader) {
+ if (mLoaderViewModel.isCreatingLoader()) {
throw new IllegalStateException("Called while creating a loader");
}
@@ -429,15 +440,8 @@
return info != null ? info.getLoader() : null;
}
- /**
- * Mark all Loaders associated with this LoaderManager for redelivery of their current
- * data (if any) the next time the LifecycleOwner is started. In cases where no data has
- * yet been delivered, this is effectively a no-op. In cases where data has already been
- * delivered via {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, this will ensure
- * that {@link LoaderCallbacks#onLoadFinished(Loader, Object)} is called again with the
- * same data.
- */
- void markForRedelivery() {
+ @Override
+ public void markForRedelivery() {
mLoaderViewModel.markForRedelivery();
}
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 30827a9..2f18053 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -36,5 +36,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support AnimatedVectorDrawable"
- legacySourceLocation = true
}
\ No newline at end of file
diff --git a/graphics/drawable/animated/tests/AndroidManifest.xml b/graphics/drawable/animated/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from graphics/drawable/animated/tests/AndroidManifest.xml
rename to graphics/drawable/animated/src/androidTest/AndroidManifest.xml
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableStubActivity.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableStubActivity.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableUtils.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableUtils.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableUtils.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableUtils.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_grouping_1_01.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_grouping_1_01.xml
diff --git a/graphics/drawable/animated/tests/res/anim/animation_rect.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_rect.xml
diff --git a/graphics/drawable/animated/tests/res/anim/animation_rect_exception.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_rect_exception.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_rect_exception.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_rect_exception.xml
diff --git a/graphics/drawable/animated/tests/res/anim/color_anim.xml b/graphics/drawable/animated/src/androidTest/res/anim/color_anim.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/color_anim.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/color_anim.xml
diff --git a/graphics/drawable/animated/tests/res/anim/path_motion_object.xml b/graphics/drawable/animated/src/androidTest/res/anim/path_motion_object.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/path_motion_object.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/path_motion_object.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_1.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_1.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_1.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_2.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_2.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_2.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_1.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_1.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_1.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_2.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_2.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_2.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_3.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_3.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_3.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_4.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_4.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_4.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_4.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_5.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_5.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_5.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_5.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animated_color_fill.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animated_color_fill.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animated_color_fill_copy.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill_copy.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animated_color_fill_copy.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill_copy.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_3.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_3.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_3.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_4.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_4.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_4.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_4.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_5.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_5.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_5.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_5.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect_exception.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect_exception.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect_exception.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect_exception.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_motion_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_motion_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_circle.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_circle.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_circle.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_circle.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_grouping_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/small_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/small_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/small_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/small_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/vector_drawable_circle.xml b/graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_circle.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/vector_drawable_circle.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_circle.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_grouping_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_grouping_1.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/control_points_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/control_points_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/control_points_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/control_points_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/path_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/path_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/path_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/path_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/single_control_point_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/single_control_point_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/single_control_point_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/single_control_point_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_control_point_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_point_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_control_point_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_point_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_control_points_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_points_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_control_points_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_points_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_1.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_1.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_1.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_2.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_2.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_2.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_3.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_3.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_3.xml
diff --git a/graphics/drawable/animated/tests/res/layout/avd_layout.xml b/graphics/drawable/animated/src/androidTest/res/layout/avd_layout.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/layout/avd_layout.xml
rename to graphics/drawable/animated/src/androidTest/res/layout/avd_layout.xml
diff --git a/graphics/drawable/animated/tests/NO_DOCS b/graphics/drawable/animated/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/graphics/drawable/animated/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index f0ac9f0..9388480 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -31,5 +31,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support VectorDrawable"
- legacySourceLocation = true
}
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/AndroidManifest.xml b/graphics/drawable/static/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from graphics/drawable/static/tests/AndroidManifest.xml
rename to graphics/drawable/static/src/androidTest/AndroidManifest.xml
diff --git a/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java b/graphics/drawable/static/src/androidTest/java/android/support/graphics/drawable/tests/VectorDrawableTest.java
similarity index 100%
rename from graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
rename to graphics/drawable/static/src/androidTest/java/android/support/graphics/drawable/tests/VectorDrawableTest.java
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml b/graphics/drawable/static/src/androidTest/res/color/vector_icon_fill_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/color/vector_icon_fill_state_list.xml
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml b/graphics/drawable/static/src/androidTest/res/color/vector_icon_stroke_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/color/vector_icon_stroke_state_list.xml
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_create_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_create_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_delete_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_delete_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_five_bars_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_five_bars_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_five_bars_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_five_bars_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_group_clip_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_group_clip_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_group_clip_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_group_clip_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_heart_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_heart_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_st_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_schedule_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_schedule_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_settings_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_settings_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_share_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_share_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_share_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_share_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_3_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_3_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_4_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_4_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_5_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_5_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_6_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_6_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_wishlist_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_wishlist_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_wishlist_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_wishlist_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_clip_path_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_clip_path_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_create.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_create.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_create.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_create.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_delete.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_delete.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_evenodd.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_evenodd.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_nonzero.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_nonzero.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_five_bars.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_five_bars.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_five_bars.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_five_bars.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_group_clip.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_group_clip.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_group_clip.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_group_clip.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_heart.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_heart.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_cq.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_cq.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_st.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_st.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_schedule.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_schedule.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_settings.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_settings.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_share.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_share.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_share.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_share.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_state_list.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_3.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_3.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_3.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_3.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_4.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_4.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_5.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_5.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_6.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_6.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_wishlist.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_wishlist.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_wishlist.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_wishlist.xml
diff --git a/graphics/drawable/static/tests/res/values/colors.xml b/graphics/drawable/static/src/androidTest/res/values/colors.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/values/colors.xml
rename to graphics/drawable/static/src/androidTest/res/values/colors.xml
diff --git a/graphics/drawable/static/tests/res/values/strings.xml b/graphics/drawable/static/src/androidTest/res/values/strings.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/values/strings.xml
rename to graphics/drawable/static/src/androidTest/res/values/strings.xml
diff --git a/graphics/drawable/static/tests/NO_DOCS b/graphics/drawable/static/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/graphics/drawable/static/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/heifwriter/api/current.txt b/heifwriter/api/current.txt
new file mode 100644
index 0000000..3fbb5b8
--- /dev/null
+++ b/heifwriter/api/current.txt
@@ -0,0 +1,19 @@
+package androidx.media.heifwriter {
+
+ public final class HeifWriter implements java.lang.AutoCloseable {
+ ctor public HeifWriter(java.lang.String, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
+ ctor public HeifWriter(java.io.FileDescriptor, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
+ method public void addBitmap(android.graphics.Bitmap);
+ method public void addYuvBuffer(int, byte[]);
+ method public void close();
+ method public android.view.Surface getInputSurface();
+ method public void setInputEndOfStreamTimestamp(long);
+ method public void start();
+ method public void stop(long) throws java.lang.Exception;
+ field public static final int INPUT_MODE_BITMAP = 2; // 0x2
+ field public static final int INPUT_MODE_BUFFER = 0; // 0x0
+ field public static final int INPUT_MODE_SURFACE = 1; // 0x1
+ }
+
+}
+
diff --git a/heifwriter/build.gradle b/heifwriter/build.gradle
new file mode 100644
index 0000000..b66d8a8
--- /dev/null
+++ b/heifwriter/build.gradle
@@ -0,0 +1,29 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+android {
+ defaultConfig {
+ targetSdkVersion = 'P'
+ }
+}
+
+dependencies {
+ api(project(":support-annotations"))
+
+ androidTestImplementation(TEST_RUNNER)
+}
+
+supportLibrary {
+ name = "Android Support HeifWriter"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ minSdkVersion = 'P'
+ description = "Android Support HeifWriter for writing HEIF still images"
+}
diff --git a/heifwriter/src/androidTest/AndroidManifest.xml b/heifwriter/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..755ac70
--- /dev/null
+++ b/heifwriter/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.media.heifwriter.test">
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+</manifest>
diff --git a/textclassifier/src/androidTest/NO_DOCS b/heifwriter/src/androidTest/NO_DOCS
similarity index 100%
rename from textclassifier/src/androidTest/NO_DOCS
rename to heifwriter/src/androidTest/NO_DOCS
diff --git a/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java b/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java
new file mode 100644
index 0000000..8673c5c
--- /dev/null
+++ b/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import static android.support.test.InstrumentationRegistry.getContext;
+
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_BITMAP;
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_BUFFER;
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_SURFACE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.media.MediaMetadataRetriever;
+import android.opengl.GLES20;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
+import androidx.media.heifwriter.test.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+/**
+ * Test {@link HeifWriter}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class HeifWriterTest {
+ private static final String TAG = HeifWriterTest.class.getSimpleName();
+ private static final boolean DEBUG = false;
+ private static final boolean DUMP_YUV_INPUT = false;
+
+ private static byte[][] TEST_COLORS = {
+ {(byte) 255, (byte) 0, (byte) 0},
+ {(byte) 255, (byte) 0, (byte) 255},
+ {(byte) 255, (byte) 255, (byte) 255},
+ {(byte) 255, (byte) 255, (byte) 0},
+ };
+
+ private static final String TEST_HEIC = "test.heic";
+ private static final int[] IMAGE_RESOURCES = new int[] {
+ R.raw.test
+ };
+ private static final String[] IMAGE_FILENAMES = new String[] {
+ TEST_HEIC
+ };
+ private static final String OUTPUT_FILENAME = "output.heic";
+
+ private EglWindowSurface mInputEglSurface;
+ private Handler mHandler;
+ private int mInputIndex;
+
+ @Before
+ public void setUp() throws Exception {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String outputPath = new File(Environment.getExternalStorageDirectory(),
+ IMAGE_FILENAMES[i]).getAbsolutePath();
+
+ InputStream inputStream = null;
+ FileOutputStream outputStream = null;
+ try {
+ inputStream = getContext().getResources().openRawResource(IMAGE_RESOURCES[i]);
+ outputStream = new FileOutputStream(outputPath);
+ copy(inputStream, outputStream);
+ } finally {
+ closeQuietly(inputStream);
+ closeQuietly(outputStream);
+ }
+ }
+
+ HandlerThread handlerThread = new HandlerThread(
+ "HeifEncoderThread", Process.THREAD_PRIORITY_FOREGROUND);
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String imageFilePath =
+ new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAMES[i])
+ .getAbsolutePath();
+ File imageFile = new File(imageFilePath);
+ if (imageFile.exists()) {
+ imageFile.delete();
+ }
+ }
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBuffer_NoGrid_NoHandler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_BUFFER, false, false));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBuffer_Grid_NoHandler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_BUFFER, true, false));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBuffer_NoGrid_Handler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_BUFFER, false, true));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBuffer_Grid_Handler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_BUFFER, true, true));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputSurface_NoGrid_NoHandler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_SURFACE, false, false));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputSurface_Grid_NoHandler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_SURFACE, true, false));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputSurface_NoGrid_Handler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_SURFACE, false, true));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputSurface_Grid_Handler() throws Throwable {
+ doTest(new TestConfig(INPUT_MODE_SURFACE, true, true));
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBitmap_NoGrid_NoHandler() throws Throwable {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String inputPath = new File(Environment.getExternalStorageDirectory(),
+ IMAGE_FILENAMES[i]).getAbsolutePath();
+ doTest(new TestConfig(
+ INPUT_MODE_BITMAP, false, false, inputPath));
+ }
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBitmap_Grid_NoHandler() throws Throwable {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String inputPath = new File(Environment.getExternalStorageDirectory(),
+ IMAGE_FILENAMES[i]).getAbsolutePath();
+ doTest(new TestConfig(
+ INPUT_MODE_BITMAP, true, false, inputPath));
+ }
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBitmap_NoGrid_Handler() throws Throwable {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String inputPath = new File(Environment.getExternalStorageDirectory(),
+ IMAGE_FILENAMES[i]).getAbsolutePath();
+ doTest(new TestConfig(
+ INPUT_MODE_BITMAP, false, true, inputPath));
+ }
+ }
+
+ @Test
+ @LargeTest
+ public void testInputBitmap_Grid_Handler() throws Throwable {
+ for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+ String inputPath = new File(Environment.getExternalStorageDirectory(),
+ IMAGE_FILENAMES[i]).getAbsolutePath();
+ doTest(new TestConfig(
+ INPUT_MODE_BITMAP, true, true, inputPath));
+ }
+ }
+
+ private void closeQuietly(Closeable closeable) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (RuntimeException rethrown) {
+ throw rethrown;
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ private int copy(InputStream in, OutputStream out) throws IOException {
+ int total = 0;
+ byte[] buffer = new byte[8192];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
+ }
+ return total;
+ }
+
+ private static class TestConfig {
+ int inputMode;
+ boolean useGrid;
+ boolean useHandler;
+ int numImages;
+ int width;
+ int height;
+ int quality;
+ String inputPath;
+ String outputPath;
+ Bitmap[] bitmaps;
+
+ TestConfig(int _inputMode, boolean _useGrids, boolean _useHandler) {
+ this(_inputMode, _useGrids, _useHandler, null);
+ }
+
+ TestConfig(int _inputMode, boolean _useGrids, boolean _useHandler, String _inputPath) {
+ inputMode = _inputMode;
+ useGrid = _useGrids;
+ useHandler = _useHandler;
+ numImages = 4;
+ width = 1920;
+ height = 1080;
+ quality = 100;
+ inputPath = (inputMode == INPUT_MODE_BITMAP) ? _inputPath : null;
+ outputPath = new File(Environment.getExternalStorageDirectory(),
+ OUTPUT_FILENAME).getAbsolutePath();;
+
+ cleanupStaleOutputs();
+ loadBitmapInputs();
+ }
+
+ private void loadBitmapInputs() {
+ if (inputMode != INPUT_MODE_BITMAP) {
+ return;
+ }
+ MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+ retriever.setDataSource(inputPath);
+ String hasImage = retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
+ if (!"yes".equals(hasImage)) {
+ throw new IllegalArgumentException("no bitmap found!");
+ }
+ width = Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH));
+ height = Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT));
+ numImages = Math.min(numImages, Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
+ bitmaps = new Bitmap[numImages];
+ for (int i = 0; i < bitmaps.length; i++) {
+ bitmaps[i] = retriever.getImageAtIndex(i);
+ }
+ retriever.release();
+ }
+
+ private void cleanupStaleOutputs() {
+ File outputFile = new File(outputPath);
+ if (outputFile.exists()) {
+ outputFile.delete();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "TestConfig" +
+ ": inputMode " + inputMode +
+ ", useGrid " + useGrid +
+ ", useHandler " + useHandler +
+ ", numImages " + numImages +
+ ", width " + width +
+ ", height " + height +
+ ", quality " + quality +
+ ", inputPath " + inputPath +
+ ", outputPath " + outputPath;
+ }
+ }
+
+ private void doTest(TestConfig testConfig) {
+ int width = testConfig.width;
+ int height = testConfig.height;
+ int numImages = testConfig.numImages;
+
+ mInputIndex = 0;
+ HeifWriter heifWriter = null;
+ FileInputStream inputStream = null;
+ FileOutputStream outputStream = null;
+ try {
+ if (DEBUG) Log.d(TAG, "started: " + testConfig);
+
+ heifWriter = new HeifWriter(testConfig.outputPath,
+ width, height, testConfig.useGrid, testConfig.quality,
+ numImages, numImages - 1
+ , testConfig.inputMode,
+ testConfig.useHandler ? mHandler : null);
+
+ if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+ mInputEglSurface = new EglWindowSurface(heifWriter.getInputSurface());
+ }
+
+ heifWriter.start();
+
+ if (testConfig.inputMode == INPUT_MODE_BUFFER) {
+ byte[] data = new byte[width * height * 3 / 2];
+
+ if (testConfig.inputPath != null) {
+ inputStream = new FileInputStream(testConfig.inputPath);
+ }
+
+ if (DUMP_YUV_INPUT) {
+ File outputFile = new File("/sdcard/input.yuv");
+ outputFile.createNewFile();
+ outputStream = new FileOutputStream(outputFile);
+ }
+
+ for (int i = 0; i < numImages; i++) {
+ if (DEBUG) Log.d(TAG, "fillYuvBuffer: " + i);
+ fillYuvBuffer(i, data, width, height, inputStream);
+ if (DUMP_YUV_INPUT) {
+ Log.d(TAG, "@@@ dumping input YUV");
+ outputStream.write(data);
+ }
+ heifWriter.addYuvBuffer(ImageFormat.YUV_420_888, data);
+ }
+ } else if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+ // The input surface is a surface texture using single buffer mode, draws will be
+ // blocked until onFrameAvailable is done with the buffer, which is dependant on
+ // how fast MediaCodec processes them, which is further dependent on how fast the
+ // MediaCodec callbacks are handled. We can't put draws on the same looper that
+ // handles MediaCodec callback, it will cause deadlock.
+ for (int i = 0; i < numImages; i++) {
+ if (DEBUG) Log.d(TAG, "drawFrame: " + i);
+ drawFrame(width, height);
+ }
+ heifWriter.setInputEndOfStreamTimestamp(
+ 1000 * computePresentationTime(numImages - 1));
+ } else if (testConfig.inputMode == INPUT_MODE_BITMAP) {
+ Bitmap[] bitmaps = testConfig.bitmaps;
+ for (int i = 0; i < Math.min(bitmaps.length, numImages); i++) {
+ if (DEBUG) Log.d(TAG, "addBitmap: " + i);
+ heifWriter.addBitmap(bitmaps[i]);
+ bitmaps[i].recycle();
+ }
+ }
+
+ heifWriter.stop(3000);
+ verifyResult(testConfig.outputPath, width, height, testConfig.useGrid, numImages);
+ if (DEBUG) Log.d(TAG, "finished: PASS");
+ } catch (Exception e) {
+ fail("finished: FAIL " + e.toString());
+ } finally {
+ try {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {}
+
+ if (heifWriter != null) {
+ heifWriter.close();
+ heifWriter = null;
+ }
+ if (mInputEglSurface != null) {
+ // This also releases the surface from encoder.
+ mInputEglSurface.release();
+ mInputEglSurface = null;
+ }
+ }
+ }
+
+ private long computePresentationTime(int frameIndex) {
+ return 132 + (long)frameIndex * 1000000;
+ }
+
+ private void fillYuvBuffer(int frameIndex, @NonNull byte[] data, int width, int height,
+ @Nullable FileInputStream inputStream) throws IOException {
+ if (inputStream != null) {
+ inputStream.read(data);
+ } else {
+ byte[] color = TEST_COLORS[frameIndex % TEST_COLORS.length];
+ int sizeY = width * height;
+ Arrays.fill(data, 0, sizeY, color[0]);
+ Arrays.fill(data, sizeY, sizeY * 5 / 4, color[1]);
+ Arrays.fill(data, sizeY * 5 / 4, sizeY * 3 / 2, color[2]);
+ }
+ }
+
+ private void drawFrame(int width, int height) {
+ mInputEglSurface.makeCurrent();
+ generateSurfaceFrame(mInputIndex, width, height);
+ mInputEglSurface.setPresentationTime(1000 * computePresentationTime(mInputIndex));
+ mInputEglSurface.swapBuffers();
+ mInputIndex++;
+ }
+
+ private void generateSurfaceFrame(int frameIndex, int width, int height) {
+ frameIndex %= 4;
+
+ GLES20.glViewport(0, 0, width, height);
+ GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
+ GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+ GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
+
+ int startX, startY;
+ int borderWidth = 16;
+ for (int i = 0; i < 7; i++) {
+ startX = (width - borderWidth * 2) * i / 7 + borderWidth;
+ GLES20.glScissor(startX, borderWidth,
+ (width - borderWidth * 2) / 7, height - borderWidth * 2);
+ GLES20.glClearColor(((7 - i) & 0x4) * 0.16f,
+ ((7 - i) & 0x2) * 0.32f,
+ ((7 - i) & 0x1) * 0.64f,
+ 1.0f);
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+ }
+
+ startX = (width / 6) + (width / 6) * frameIndex;
+ startY = height / 4;
+ GLES20.glScissor(startX, startY, width / 6, height / 3);
+ GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+ GLES20.glScissor(startX + borderWidth, startY + borderWidth,
+ width / 6 - borderWidth * 2, height / 3 - borderWidth * 2);
+ GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+ }
+
+ private void verifyResult(
+ String filename, int width, int height, boolean useGrid, int numImages)
+ throws Exception {
+ MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+ retriever.setDataSource(filename);
+ String hasImage = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
+ if (!"yes".equals(hasImage)) {
+ throw new Exception("No images found in file " + filename);
+ }
+ assertEquals("Wrong image count", numImages,
+ Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
+ assertEquals("Wrong width", width,
+ Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH)));
+ assertEquals("Wrong height", height,
+ Integer.parseInt(retriever.extractMetadata(
+ MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT)));
+ retriever.release();
+
+ if (useGrid) {
+ MediaExtractor extractor = new MediaExtractor();
+ extractor.setDataSource(filename);
+ MediaFormat format = extractor.getTrackFormat(0);
+ int gridWidth = format.getInteger(MediaFormat.KEY_GRID_WIDTH);
+ int gridHeight = format.getInteger(MediaFormat.KEY_GRID_HEIGHT);
+ assertEquals("Wrong grid width", 512, gridWidth);
+ assertEquals("Wrong grid height", 512, gridHeight);
+ extractor.release();
+ }
+ }
+}
diff --git a/heifwriter/src/androidTest/res/raw/test.heic b/heifwriter/src/androidTest/res/raw/test.heic
new file mode 100644
index 0000000..ceaff92
--- /dev/null
+++ b/heifwriter/src/androidTest/res/raw/test.heic
Binary files differ
diff --git a/heifwriter/src/main/AndroidManifest.xml b/heifwriter/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b4d86af
--- /dev/null
+++ b/heifwriter/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.media.heifwriter">
+</manifest>
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java b/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java
new file mode 100644
index 0000000..f70d01c
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import android.graphics.Rect;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * This class represents a viewport-sized sprite that will be rendered with
+ * a subrect from a texture.
+ *
+ * @hide
+ */
+public class EglRectBlt {
+ private static final int SIZEOF_FLOAT = 4;
+
+ /**
+ * A "full" square, extending from -1 to +1 in both dimensions. When the
+ * model/view/projection matrix is identity, this will exactly cover the viewport.
+ */
+ private static final float FULL_RECTANGLE_COORDS[] = {
+ -1.0f, -1.0f, // 0 bottom left
+ 1.0f, -1.0f, // 1 bottom right
+ -1.0f, 1.0f, // 2 top left
+ 1.0f, 1.0f, // 3 top right
+ };
+
+ private static final FloatBuffer FULL_RECTANGLE_BUF =
+ createFloatBuffer(FULL_RECTANGLE_COORDS);
+
+ private final float mTexCoords[] = new float[8];
+ private final FloatBuffer mTexCoordArray = createFloatBuffer(mTexCoords);
+ private final int mTexWidth;
+ private final int mTexHeight;
+
+ private Texture2dProgram mProgram;
+
+ /**
+ * Allocates a direct float buffer, and populates it with the float array data.
+ */
+ public static FloatBuffer createFloatBuffer(float[] coords) {
+ // Allocate a direct ByteBuffer, using 4 bytes per float, and copy coords into it.
+ ByteBuffer bb = ByteBuffer.allocateDirect(coords.length * SIZEOF_FLOAT);
+ bb.order(ByteOrder.nativeOrder());
+ FloatBuffer fb = bb.asFloatBuffer();
+ fb.put(coords);
+ fb.position(0);
+ return fb;
+ }
+
+ /**
+ * Prepares the object.
+ *
+ * @param program The program to use. EglRectBlitter takes ownership, and will release
+ * the program when no longer needed.
+ */
+ public EglRectBlt(Texture2dProgram program, int texWidth, int texHeight) {
+ mProgram = program;
+
+ mTexWidth = texWidth;
+ mTexHeight = texHeight;
+ }
+
+ /**
+ * Releases resources.
+ * <p>
+ * This must be called with the appropriate EGL context current (i.e. the one that was
+ * current when the constructor was called). If we're about to destroy the EGL context,
+ * there's no value in having the caller make it current just to do this cleanup, so you
+ * can pass a flag that will tell this function to skip any EGL-context-specific cleanup.
+ */
+ public void release(boolean doEglCleanup) {
+ if (mProgram != null) {
+ if (doEglCleanup) {
+ mProgram.release();
+ }
+ mProgram = null;
+ }
+ }
+
+ /**
+ * Creates a texture object suitable for use with drawFrame().
+ */
+ public int createTextureObject() {
+ return mProgram.createTextureObject();
+ }
+
+ /**
+ * Draws a viewport-filling rect, texturing it with the specified texture object and rect.
+ */
+ public void copyRect(int textureId, float[] texMatrix, Rect texRect) {
+ setTexRect(texRect);
+
+ // Use the identity matrix for MVP so our 2x2 FULL_RECTANGLE covers the viewport.
+ mProgram.draw(Texture2dProgram.IDENTITY_MATRIX, FULL_RECTANGLE_BUF, 0,
+ 4, 2, 2 * SIZEOF_FLOAT,
+ texMatrix, mTexCoordArray, textureId, 2 * SIZEOF_FLOAT);
+ }
+
+ void setTexRect(Rect rect) {
+ mTexCoords[0] = rect.left / (float)mTexWidth;
+ mTexCoords[1] = 1.0f - rect.bottom / (float)mTexHeight;
+ mTexCoords[2] = rect.right / (float)mTexWidth;
+ mTexCoords[3] = 1.0f - rect.bottom / (float)mTexHeight;
+ mTexCoords[4] = rect.left / (float)mTexWidth;
+ mTexCoords[5] = 1.0f - rect.top / (float)mTexHeight;
+ mTexCoords[6] = rect.right / (float)mTexWidth;
+ mTexCoords[7] = 1.0f - rect.top / (float)mTexHeight;
+
+ mTexCoordArray.put(mTexCoords);
+ mTexCoordArray.position(0);
+ }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java b/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java
new file mode 100644
index 0000000..a73aac4
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLExt;
+import android.opengl.EGLSurface;
+import android.util.Log;
+import android.view.Surface;
+
+/**
+ * Holds state associated with a Surface used for MediaCodec encoder input.
+ * <p>
+ * The constructor takes a Surface obtained from MediaCodec.createInputSurface(), and uses that
+ * to create an EGL window surface. Calls to eglSwapBuffers() cause a frame of data to be sent
+ * to the video encoder.
+ *
+ * @hide
+ */
+public class EglWindowSurface {
+ private static final String TAG = "EglWindowSurface";
+
+ private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+ private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+ private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+ private EGLConfig[] mConfigs = new EGLConfig[1];
+
+ private Surface mSurface;
+ private int mWidth;
+ private int mHeight;
+
+ /**
+ * Creates an EglWindowSurface from a Surface.
+ */
+ public EglWindowSurface(Surface surface) {
+ if (surface == null) {
+ throw new NullPointerException();
+ }
+ mSurface = surface;
+
+ eglSetup();
+ }
+
+ /**
+ * Prepares EGL. We want a GLES 2.0 context and a surface that supports recording.
+ */
+ private void eglSetup() {
+ mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+ if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+ throw new RuntimeException("unable to get EGL14 display");
+ }
+ int[] version = new int[2];
+ if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+ mEGLDisplay = null;
+ throw new RuntimeException("unable to initialize EGL14");
+ }
+
+ // Configure EGL for recordable and OpenGL ES 2.0. We want enough RGB bits
+ // to minimize artifacts from possible YUV conversion.
+ int[] attribList = {
+ EGL14.EGL_RED_SIZE, 8,
+ EGL14.EGL_GREEN_SIZE, 8,
+ EGL14.EGL_BLUE_SIZE, 8,
+ EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+ EGLExt.EGL_RECORDABLE_ANDROID, 1,
+ EGL14.EGL_NONE
+ };
+ int[] numConfigs = new int[1];
+ if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, mConfigs, 0, mConfigs.length,
+ numConfigs, 0)) {
+ throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
+ }
+
+ // Configure context for OpenGL ES 2.0.
+ int[] attrib_list = {
+ EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
+ EGL14.EGL_NONE
+ };
+ mEGLContext = EGL14.eglCreateContext(mEGLDisplay, mConfigs[0], EGL14.EGL_NO_CONTEXT,
+ attrib_list, 0);
+ checkEglError("eglCreateContext");
+ if (mEGLContext == null) {
+ throw new RuntimeException("null context");
+ }
+
+ // Create a window surface, and attach it to the Surface we received.
+ createEGLSurface();
+
+ mWidth = getWidth();
+ mHeight = getHeight();
+ }
+
+ public void updateSize(int width, int height) {
+ if (width != mWidth || height != mHeight) {
+ Log.d(TAG, "re-create EGLSurface");
+ releaseEGLSurface();
+ createEGLSurface();
+ mWidth = getWidth();
+ mHeight = getHeight();
+ }
+ }
+
+ private void createEGLSurface() {
+ int[] surfaceAttribs = {
+ EGL14.EGL_NONE
+ };
+ mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, mConfigs[0], mSurface,
+ surfaceAttribs, 0);
+ checkEglError("eglCreateWindowSurface");
+ if (mEGLSurface == null) {
+ throw new RuntimeException("surface was null");
+ }
+ }
+
+ private void releaseEGLSurface() {
+ if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+ EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+ mEGLSurface = EGL14.EGL_NO_SURFACE;
+ }
+ }
+
+ /**
+ * Discard all resources held by this class, notably the EGL context. Also releases the
+ * Surface that was passed to our constructor.
+ */
+ public void release() {
+ if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+ EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+ EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+ EGL14.eglReleaseThread();
+ EGL14.eglTerminate(mEGLDisplay);
+ }
+
+ mSurface.release();
+
+ mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+ mEGLContext = EGL14.EGL_NO_CONTEXT;
+ mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+ mSurface = null;
+ }
+
+ /**
+ * Makes our EGL context and surface current.
+ */
+ public void makeCurrent() {
+ if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+ throw new RuntimeException("eglMakeCurrent failed");
+ }
+ }
+
+ /**
+ * Makes our EGL context and surface not current.
+ */
+ public void makeUnCurrent() {
+ if (!EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
+ EGL14.EGL_NO_CONTEXT)) {
+ throw new RuntimeException("eglMakeCurrent failed");
+ }
+ }
+
+ /**
+ * Calls eglSwapBuffers. Use this to "publish" the current frame.
+ */
+ public boolean swapBuffers() {
+ return EGL14.eglSwapBuffers(mEGLDisplay, mEGLSurface);
+ }
+
+ /**
+ * Returns the Surface that the MediaCodec receives buffers from.
+ */
+ public Surface getSurface() {
+ return mSurface;
+ }
+
+ /**
+ * Queries the surface's width.
+ */
+ public int getWidth() {
+ int[] value = new int[1];
+ EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_WIDTH, value, 0);
+ return value[0];
+ }
+
+ /**
+ * Queries the surface's height.
+ */
+ public int getHeight() {
+ int[] value = new int[1];
+ EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_HEIGHT, value, 0);
+ return value[0];
+ }
+
+ /**
+ * Sends the presentation time stamp to EGL. Time is expressed in nanoseconds.
+ */
+ public void setPresentationTime(long nsecs) {
+ EGLExt.eglPresentationTimeANDROID(mEGLDisplay, mEGLSurface, nsecs);
+ }
+
+ /**
+ * Checks for EGL errors.
+ */
+ private void checkEglError(String msg) {
+ int error;
+ if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+ throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
+ }
+ }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java b/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java
new file mode 100644
index 0000000..92fcbf4
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java
@@ -0,0 +1,832 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES20;
+import android.opengl.GLUtils;
+import android.os.Looper;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.media.Image;
+import android.media.MediaCodec;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodec.CodecException;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaFormat;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.util.Log;
+import android.util.Range;
+import android.view.Surface;
+
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+/**
+ * This class encodes images into HEIF-compatible samples using HEVC encoder.
+ *
+ * It currently supports three input modes: {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ *
+ * The output format and samples are sent back in {@link
+ * Callback#onOutputFormatChanged(HeifEncoder, MediaFormat)} and {@link
+ * Callback#onDrainOutputBuffer(HeifEncoder, ByteBuffer)}. If the client
+ * requests to use grid, each tile will be sent back individually.
+ *
+ * HeifEncoder is made a separate class from {@link HeifWriter}, as some more
+ * advanced use cases might want to build solutions on top of the HeifEncoder directly.
+ * (eg. mux still images and video tracks into a single container).
+ *
+ * @hide
+ */
+public final class HeifEncoder implements AutoCloseable,
+ SurfaceTexture.OnFrameAvailableListener {
+ private static final String TAG = "HeifEncoder";
+ private static final boolean DEBUG = false;
+
+ private static final int GRID_WIDTH = 512;
+ private static final int GRID_HEIGHT = 512;
+ private static final double MAX_COMPRESS_RATIO = 0.25f;
+ private static final int INPUT_BUFFER_POOL_SIZE = 2;
+
+ private MediaCodec mEncoder;
+
+ private final Callback mCallback;
+ private final HandlerThread mHandlerThread;
+ private final Handler mHandler;
+ private final @InputMode int mInputMode;
+
+ private final int mWidth;
+ private final int mHeight;
+ private final int mGridWidth;
+ private final int mGridHeight;
+ private final int mGridRows;
+ private final int mGridCols;
+ private final int mNumTiles;
+
+ private int mInputIndex;
+ private boolean mInputEOS;
+ private final Rect mSrcRect;
+ private final Rect mDstRect;
+ private ByteBuffer mCurrentBuffer;
+ private final ArrayList<ByteBuffer> mEmptyBuffers = new ArrayList<>();
+ private final ArrayList<ByteBuffer> mFilledBuffers = new ArrayList<>();
+ private final ArrayList<Integer> mCodecInputBuffers = new ArrayList<>();
+
+ // Helper for tracking EOS when surface is used
+ private SurfaceEOSTracker mEOSTracker;
+
+ // Below variables are to handle GL copy from client's surface
+ // to encoder surface when tiles are used.
+ private SurfaceTexture mInputTexture;
+ private Surface mInputSurface;
+ private Surface mEncoderSurface;
+ private EglWindowSurface mEncoderEglSurface;
+ private EglRectBlt mRectBlt;
+ private int mTextureId;
+ private final float[] mTmpMatrix = new float[16];
+
+ public static final int INPUT_MODE_BUFFER = HeifWriter.INPUT_MODE_BUFFER;
+ public static final int INPUT_MODE_SURFACE = HeifWriter.INPUT_MODE_SURFACE;
+ public static final int INPUT_MODE_BITMAP = HeifWriter.INPUT_MODE_BITMAP;
+ @IntDef({
+ INPUT_MODE_BUFFER,
+ INPUT_MODE_SURFACE,
+ INPUT_MODE_BITMAP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface InputMode {}
+
+ public static abstract class Callback {
+ /**
+ * Called when the output format has changed.
+ *
+ * @param encoder The HeifEncoder object.
+ * @param format The new output format.
+ */
+ public abstract void onOutputFormatChanged(
+ @NonNull HeifEncoder encoder, @NonNull MediaFormat format);
+
+ /**
+ * Called when an output buffer becomes available.
+ *
+ * @param encoder The HeifEncoder object.
+ * @param byteBuffer the available output buffer.
+ */
+ public abstract void onDrainOutputBuffer(
+ @NonNull HeifEncoder encoder, @NonNull ByteBuffer byteBuffer);
+
+ /**
+ * Called when encoding reached the end of stream without error.
+ *
+ * @param encoder The HeifEncoder object.
+ */
+ public abstract void onComplete(@NonNull HeifEncoder encoder);
+
+ /**
+ * Called when encoding hits an error.
+ *
+ * @param encoder The HeifEncoder object.
+ * @param e The exception that the codec reported.
+ */
+ public abstract void onError(@NonNull HeifEncoder encoder, @NonNull CodecException e);
+ }
+
+ /**
+ * Configure the heif encoding session. Should only be called once.
+ *
+ * @param width Width of the image.
+ * @param height Height of the image.
+ * @param useGrid Whether to encode image into tiles. If enabled, tile size will be
+ * automatically chosen.
+ * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+ * supported by this implementation (which often results in larger file size).
+ * @param inputMode The input type of this encoding session.
+ * @param handler If not null, client will receive all callbacks on the handler's looper.
+ * Otherwise, client will receive callbacks on a looper created by us.
+ * @param cb The callback to receive various messages from the heif encoder.
+ */
+ public HeifEncoder(int width, int height, boolean useGrid,
+ int quality, @InputMode int inputMode,
+ @Nullable Handler handler, @NonNull Callback cb) throws IOException {
+ if (DEBUG) Log.d(TAG, "width: " + width + ", height: " + height +
+ ", useGrid: " + useGrid + ", quality: " + quality + ", inputMode: " + inputMode);
+
+ if (width < 0 || height < 0 || quality < 0 || quality > 100) {
+ throw new IllegalArgumentException("invalid encoder inputs");
+ }
+
+ mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+
+ mWidth = width;
+ mHeight = height;
+
+ if (useGrid) {
+ mGridWidth = GRID_WIDTH;
+ mGridHeight = GRID_HEIGHT;
+ mGridRows = (height + GRID_HEIGHT - 1) / GRID_HEIGHT;
+ mGridCols = (width + GRID_WIDTH - 1) / GRID_WIDTH;
+ } else {
+ mGridWidth = mWidth;
+ mGridHeight = mHeight;
+ mGridRows = 1;
+ mGridCols = 1;
+ }
+
+ mNumTiles = mGridRows * mGridCols;
+
+ mInputMode = inputMode;
+
+ mCallback = cb;
+
+ Looper looper = (handler != null) ? handler.getLooper() : null;
+ if (looper == null) {
+ mHandlerThread = new HandlerThread("HeifEncoderThread",
+ Process.THREAD_PRIORITY_FOREGROUND);
+ mHandlerThread.start();
+ looper = mHandlerThread.getLooper();
+ } else {
+ mHandlerThread = null;
+ }
+ mHandler = new Handler(looper);
+ boolean useSurfaceInternally =
+ (inputMode == INPUT_MODE_SURFACE) || (inputMode == INPUT_MODE_BITMAP);
+ int colorFormat = useSurfaceInternally ? CodecCapabilities.COLOR_FormatSurface :
+ CodecCapabilities.COLOR_FormatYUV420Flexible;
+
+ // TODO: determine how to set bitrate and framerate, or use constant quality
+ MediaFormat codecFormat = MediaFormat.createVideoFormat(
+ MediaFormat.MIMETYPE_VIDEO_HEVC, mGridWidth, mGridHeight);
+ codecFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
+ codecFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
+
+ MediaCodecInfo.CodecCapabilities caps =
+ mEncoder.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+ MediaCodecInfo.EncoderCapabilities encoderCaps = caps.getEncoderCapabilities();
+
+ codecFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mNumTiles);
+ codecFormat.setInteger(MediaFormat.KEY_CAPTURE_RATE, mNumTiles * 30);
+ if (encoderCaps.isBitrateModeSupported(
+ MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
+ Log.d(TAG, "Setting bitrate mode to constant quality");
+ Range<Integer> qualityRange = encoderCaps.getQualityRange();
+ Log.d(TAG, "Quality range: " + qualityRange);
+ codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+ MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ);
+ codecFormat.setInteger(MediaFormat.KEY_QUALITY, (int) (qualityRange.getLower() +
+ (qualityRange.getUpper() - qualityRange.getLower()) * quality / 100.0));
+ } else {
+ if (encoderCaps.isBitrateModeSupported(
+ MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
+ Log.d(TAG, "Setting bitrate mode to variable bitrate");
+ codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+ MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
+ } else { // assume CBR
+ Log.d(TAG, "Setting bitrate mode to constant bitrate");
+ codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+ MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
+ }
+ // Calculate the bitrate based on image dimension, max compression ratio and quality.
+ // Note that we set the frame rate to the number of tiles, so the bitrate would be the
+ // intended bits for one image.
+ int bitrate = (int) (width * height * 1.5 * 8 * MAX_COMPRESS_RATIO * quality / 100.0f);
+ codecFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
+ }
+
+ mEncoder.setCallback(new EncoderCallback(), mHandler);
+ mEncoder.configure(codecFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+
+ if (useSurfaceInternally) {
+ mEncoderSurface = mEncoder.createInputSurface();
+
+ boolean useGLCopy = (mNumTiles > 1) || (inputMode == INPUT_MODE_BITMAP);
+ mEOSTracker = new SurfaceEOSTracker(useGLCopy);
+
+ if (useGLCopy) {
+ mEncoderEglSurface = new EglWindowSurface(mEncoderSurface);
+ mEncoderEglSurface.makeCurrent();
+
+ mRectBlt = new EglRectBlt(
+ new Texture2dProgram((inputMode == INPUT_MODE_BITMAP) ?
+ Texture2dProgram.TEXTURE_2D :
+ Texture2dProgram.TEXTURE_EXT),
+ mWidth, mHeight);
+
+ mTextureId = mRectBlt.createTextureObject();
+
+ if (inputMode == INPUT_MODE_SURFACE) {
+ // use single buffer mode to block on input
+ mInputTexture = new SurfaceTexture(mTextureId, true);
+ mInputTexture.setOnFrameAvailableListener(this);
+ mInputTexture.setDefaultBufferSize(mWidth, mHeight);
+ mInputSurface = new Surface(mInputTexture);
+ }
+
+ // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+ // making the context current on a different thread will cause error.
+ mEncoderEglSurface.makeUnCurrent();
+ } else {
+ mInputSurface = mEncoderSurface;
+ }
+ } else {
+ for (int i = 0; i < INPUT_BUFFER_POOL_SIZE; i++) {
+ mEmptyBuffers.add(ByteBuffer.allocateDirect(mWidth * mHeight * 3 / 2));
+ }
+ }
+
+ mDstRect = new Rect(0, 0, mGridWidth, mGridHeight);
+ mSrcRect = new Rect();
+ }
+
+ @Override
+ public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+ mEncoderEglSurface.makeCurrent();
+
+ surfaceTexture.updateTexImage();
+ surfaceTexture.getTransformMatrix(mTmpMatrix);
+
+ long timestampNs = surfaceTexture.getTimestamp();
+
+ if (DEBUG) Log.d(TAG, "onFrameAvailable: timestampUs " + (timestampNs / 1000));
+
+ boolean takeFrame = mEOSTracker.updateLastInputAndEncoderTime(timestampNs,
+ computePresentationTime(mInputIndex + mNumTiles - 1));
+
+ if (takeFrame) {
+ copyTilesGL(mTmpMatrix);
+ }
+
+ surfaceTexture.releaseTexImage();
+
+ // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+ // making the context current on a different thread will cause error.
+ mEncoderEglSurface.makeUnCurrent();
+ }
+
+ /**
+ * Start the encoding process.
+ */
+ public void start() {
+ mEncoder.start();
+ }
+
+ /**
+ * Add one YUV buffer to be encoded. This might block if the encoder can't process the input
+ * buffers fast enough.
+ *
+ * After the call returns, the client can reuse the data array.
+ *
+ * @param format The YUV format as defined in {@link android.graphics.ImageFormat}, currently
+ * only support YUV_420_888.
+ *
+ * @param data byte array containing the YUV data. If the format has more than one planes,
+ * they must be concatenated.
+ */
+ public void addYuvBuffer(int format, @NonNull byte[] data) {
+ if (mInputMode != INPUT_MODE_BUFFER) {
+ throw new IllegalStateException(
+ "addYuvBuffer is only allowed in buffer input mode");
+ }
+ if (data == null || data.length != mWidth * mHeight * 3 / 2) {
+ throw new IllegalArgumentException("invalid data");
+ }
+ addYuvBufferInternal(data);
+ }
+
+ /**
+ * Retrieves the input surface for encoding.
+ *
+ * Will only return valid value if configured to use surface input.
+ */
+ public @NonNull Surface getInputSurface() {
+ if (mInputMode != INPUT_MODE_SURFACE) {
+ throw new IllegalStateException(
+ "getInputSurface is only allowed in surface input mode");
+ }
+ return mInputSurface;
+ }
+
+ /**
+ * Sets the timestamp (in nano seconds) of the last input frame to encode. Frames with
+ * timestamps larger than the specified value will not be encoded. However, if a frame
+ * already started encoding when this is set, all tiles within that frame will be encoded.
+ *
+ * This method only applies when surface is used.
+ */
+ public void setEndOfInputStreamTimestamp(long timestampNs) {
+ if (mInputMode != INPUT_MODE_SURFACE) {
+ throw new IllegalStateException(
+ "setEndOfInputStreamTimestamp is only allowed in surface input mode");
+ }
+ if (mEOSTracker != null) {
+ mEOSTracker.updateInputEOSTime(timestampNs);
+ }
+ }
+
+ /**
+ * Adds one bitmap to be encoded.
+ */
+ public void addBitmap(@NonNull Bitmap bitmap) {
+ if (mInputMode != INPUT_MODE_BITMAP) {
+ throw new IllegalStateException("addBitmap is only allowed in bitmap input mode");
+ }
+
+ boolean takeFrame = mEOSTracker.updateLastInputAndEncoderTime(
+ computePresentationTime(mInputIndex),
+ computePresentationTime(mInputIndex + mNumTiles - 1));
+
+ if (takeFrame) {
+ mEncoderEglSurface.makeCurrent();
+
+ // load the bitmap to texture
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
+ GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
+
+ copyTilesGL(Texture2dProgram.V_FLIP_MATRIX);
+
+ // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+ // making the context current on a different thread will cause error.
+ mEncoderEglSurface.makeUnCurrent();
+ }
+ }
+
+ /**
+ * Sends input EOS to the encoder. Result will be notified asynchronously via
+ * {@link Callback#onComplete(HeifEncoder)} if encoder reaches EOS without error, or
+ * {@link Callback#onError(HeifEncoder, CodecException)} otherwise.
+ */
+ public void stopAsync() {
+ if (mInputMode == INPUT_MODE_BITMAP) {
+ // here we simply set the EOS timestamp to 0, so that the cut off will be the last
+ // bitmap ever added.
+ mEOSTracker.updateInputEOSTime(0);
+ } else if (mInputMode == INPUT_MODE_BUFFER) {
+ addYuvBufferInternal(null);
+ }
+ }
+
+ /**
+ * Generates the presentation time for input frame N, in microseconds.
+ * The timestamp advances 1 sec for every whole frame.
+ */
+ private long computePresentationTime(int frameIndex) {
+ return 132 + (long)frameIndex * 1000000 / mNumTiles;
+ }
+
+ /**
+ * Obtains one empty input buffer and copies the data into it. Before input
+ * EOS is sent, this would block until the data is copied. After input EOS
+ * is sent, this would return immediately.
+ */
+ private void addYuvBufferInternal(@Nullable byte[] data) {
+ ByteBuffer buffer = acquireEmptyBuffer();
+ if (buffer == null) {
+ return;
+ }
+ buffer.clear();
+ if (data != null) {
+ buffer.put(data);
+ }
+ buffer.flip();
+ synchronized (mFilledBuffers) {
+ mFilledBuffers.add(buffer);
+ }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ maybeCopyOneTileYUV();
+ }
+ });
+ }
+
+ /**
+ * Routine to copy one tile if we have both input and codec buffer available.
+ *
+ * Must be called on the handler looper that also handles the MediaCodec callback.
+ */
+ private void maybeCopyOneTileYUV() {
+ ByteBuffer currentBuffer;
+ while ((currentBuffer = getCurrentBuffer()) != null && !mCodecInputBuffers.isEmpty()) {
+ int index = mCodecInputBuffers.remove(0);
+
+ // 0-length input means EOS.
+ boolean inputEOS = (mInputIndex % mNumTiles == 0) && (currentBuffer.remaining() == 0);
+
+ if (!inputEOS) {
+ Image image = mEncoder.getInputImage(index);
+ int left = mGridWidth * (mInputIndex % mGridCols);
+ int top = mGridHeight * (mInputIndex / mGridCols % mGridRows);
+ mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+ copyOneTileYUV(currentBuffer, image, mWidth, mHeight, mSrcRect, mDstRect);
+ }
+
+ mEncoder.queueInputBuffer(index, 0,
+ inputEOS ? 0 : mEncoder.getInputBuffer(index).capacity(),
+ computePresentationTime(mInputIndex++),
+ inputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+ if (inputEOS || mInputIndex % mNumTiles == 0) {
+ returnEmptyBufferAndNotify(inputEOS);
+ }
+ }
+ }
+
+ /**
+ * Copies from a rect from src buffer to dst image.
+ * TOOD: This will be replaced by JNI.
+ */
+ private static void copyOneTileYUV(
+ ByteBuffer srcBuffer, Image dstImage,
+ int srcWidth, int srcHeight,
+ Rect srcRect, Rect dstRect) {
+ if (srcRect.width() != dstRect.width() || srcRect.height() != dstRect.height()) {
+ throw new IllegalArgumentException("src and dst rect size are different!");
+ }
+ if (srcWidth % 2 != 0 || srcHeight % 2 != 0 ||
+ srcRect.left % 2 != 0 || srcRect.top % 2 != 0 ||
+ srcRect.right % 2 != 0 || srcRect.bottom % 2 != 0 ||
+ dstRect.left % 2 != 0 || dstRect.top % 2 != 0 ||
+ dstRect.right % 2 != 0 || dstRect.bottom % 2 != 0) {
+ throw new IllegalArgumentException("src or dst are not aligned!");
+ }
+
+ Image.Plane[] planes = dstImage.getPlanes();
+ for (int n = 0; n < planes.length; n++) {
+ ByteBuffer dstBuffer = planes[n].getBuffer();
+ int colStride = planes[n].getPixelStride();
+ int copyWidth = Math.min(srcRect.width(), srcWidth - srcRect.left);
+ int copyHeight = Math.min(srcRect.height(), srcHeight - srcRect.top);
+ int srcPlanePos = 0, div = 1;
+ if (n > 0) {
+ div = 2;
+ srcPlanePos = srcWidth * srcHeight * (n + 3) / 4;
+ }
+ for (int i = 0; i < copyHeight / div; i++) {
+ srcBuffer.position(srcPlanePos +
+ (i + srcRect.top / div) * srcWidth / div + srcRect.left / div);
+ dstBuffer.position((i + dstRect.top / div) * planes[n].getRowStride()
+ + dstRect.left * colStride / div);
+
+ for (int j = 0; j < copyWidth / div; j++) {
+ dstBuffer.put(srcBuffer.get());
+ if (colStride > 1 && j != copyWidth / div - 1) {
+ dstBuffer.position(dstBuffer.position() + colStride - 1);
+ }
+ }
+ }
+ }
+ }
+
+ private ByteBuffer acquireEmptyBuffer() {
+ synchronized (mEmptyBuffers) {
+ // wait for an empty input buffer first
+ while (!mInputEOS && mEmptyBuffers.isEmpty()) {
+ try {
+ mEmptyBuffers.wait();
+ } catch (InterruptedException e) {}
+ }
+
+ // if already EOS, return null to stop further encoding.
+ return mInputEOS ? null : mEmptyBuffers.remove(0);
+ }
+ }
+
+ /**
+ * Routine to get the current input buffer to copy from.
+ * Only called on callback handler thread.
+ */
+ private ByteBuffer getCurrentBuffer() {
+ if (!mInputEOS && mCurrentBuffer == null) {
+ synchronized (mFilledBuffers) {
+ mCurrentBuffer = mFilledBuffers.isEmpty() ?
+ null : mFilledBuffers.remove(0);
+ }
+ }
+ return mInputEOS ? null : mCurrentBuffer;
+ }
+
+ /**
+ * Routine to put the consumed input buffer back into the empty buffer pool.
+ * Only called on callback handler thread.
+ */
+ private void returnEmptyBufferAndNotify(boolean inputEOS) {
+ synchronized (mEmptyBuffers) {
+ mInputEOS |= inputEOS;
+ mEmptyBuffers.add(mCurrentBuffer);
+ mEmptyBuffers.notifyAll();
+ }
+ mCurrentBuffer = null;
+ }
+
+ /**
+ * Copies from source frame to encoder inputs using GL. The source could be either
+ * client's input surface, or the input bitmap loaded to texture.
+ *
+ * @param texMatrix The texture matrix to use. See the shader program in
+ * {@link Texture2dProgram} as well as {@link SurfaceTexture} for more details.
+ */
+ private void copyTilesGL(float[] texMatrix) {
+ GLES20.glViewport(0, 0, mGridWidth, mGridHeight);
+
+ for (int row = 0; row < mGridRows; row++) {
+ for (int col = 0; col < mGridCols; col++) {
+ int left = col * mGridWidth;
+ int top = row * mGridHeight;
+ mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+ mRectBlt.copyRect(mTextureId, texMatrix, mSrcRect);
+ mEncoderEglSurface.setPresentationTime(1000 * computePresentationTime(mInputIndex++));
+ mEncoderEglSurface.swapBuffers();
+ }
+ }
+ }
+
+ /**
+ * Routine to release all resources. Must be run on the same looper that
+ * handles the MediaCodec callbacks.
+ */
+ private void stopInternal() {
+ if (DEBUG) Log.d(TAG, "stopInternal");
+
+ if (mEncoder != null) {
+ mEncoder.stop();
+ mEncoder.release();
+ mEncoder = null;
+ }
+
+ // unblock the addBuffer() if we're tearing down before EOS is sent.
+ synchronized (mEmptyBuffers) {
+ mInputEOS = true;
+ mEmptyBuffers.notifyAll();
+ }
+
+ if (mRectBlt != null) {
+ mRectBlt.release(false);
+ mRectBlt = null;
+ }
+ if (mEncoderEglSurface != null) {
+ // Note that this frees mEncoderSurface too. If mEncoderEglSurface is not
+ // there, client is responsible to release the input surface it got from us,
+ // we don't release mEncoderSurface here.
+ mEncoderEglSurface.release();
+ mEncoderEglSurface = null;
+ }
+ if (mInputTexture != null) {
+ mInputTexture.release();
+ mInputTexture = null;
+ }
+ }
+
+ /**
+ * This class handles EOS for surface or bitmap inputs.
+ *
+ * When encoding from surface or bitmap, we can't call {@link MediaCodec#signalEndOfInputStream()}
+ * immediately after input is drawn, since this could drop all pending frames in the
+ * buffer queue. When there are tiles, this could leave us a partially encoded image.
+ *
+ * So here we track the EOS status by timestamps, and only signal EOS to the encoder
+ * when we collected all images we need.
+ *
+ * Since this is updated from multiple threads ({@link #setEndOfInputStreamTimestamp(long)},
+ * {@link EncoderCallback#onOutputBufferAvailable(MediaCodec, int, BufferInfo)},
+ * {@link #addBitmap(Bitmap)} and {@link #onFrameAvailable(SurfaceTexture)}), it must be fully
+ * synchronized.
+ *
+ * Note that when buffer input is used, the EOS flag is set in
+ * {@link EncoderCallback#onInputBufferAvailable(MediaCodec, int)} and this class is not used.
+ */
+ private class SurfaceEOSTracker {
+ private static final boolean DEBUG_EOS = false;
+
+ final boolean mUseGLCopy;
+ long mInputEOSTimeNs = -1;
+ long mLastInputTimeNs = -1;
+ long mEncoderEOSTimeUs = -1;
+ long mLastEncoderTimeUs = -1;
+ long mLastOutputTimeUs = -1;
+ boolean mSignaled;
+
+ SurfaceEOSTracker(boolean useGLCopy) {
+ mUseGLCopy = useGLCopy;
+ }
+
+ synchronized void updateInputEOSTime(long timestampNs) {
+ if (DEBUG_EOS) Log.d(TAG, "updateInputEOSTime: " + timestampNs);
+
+ if (mUseGLCopy) {
+ if (mInputEOSTimeNs < 0) {
+ mInputEOSTimeNs = timestampNs;
+ }
+ } else {
+ if (mEncoderEOSTimeUs < 0) {
+ mEncoderEOSTimeUs = timestampNs / 1000;
+ }
+ }
+ updateEOSLocked();
+ }
+
+ synchronized boolean updateLastInputAndEncoderTime(long inputTimeNs, long encoderTimeUs) {
+ if (DEBUG_EOS) Log.d(TAG,
+ "updateLastInputAndEncoderTime: " + inputTimeNs + ", " + encoderTimeUs);
+
+ boolean shouldTakeFrame = mInputEOSTimeNs < 0 || inputTimeNs <= mInputEOSTimeNs;
+ if (shouldTakeFrame) {
+ mLastEncoderTimeUs = encoderTimeUs;
+ }
+ mLastInputTimeNs = inputTimeNs;
+ updateEOSLocked();
+ return shouldTakeFrame;
+ }
+
+ synchronized void updateLastOutputTime(long outputTimeUs) {
+ if (DEBUG_EOS) Log.d(TAG, "updateLastOutputTime: " + outputTimeUs);
+
+ mLastOutputTimeUs = outputTimeUs;
+ updateEOSLocked();
+ }
+
+ private void updateEOSLocked() {
+ if (mSignaled) {
+ return;
+ }
+ if (mEncoderEOSTimeUs < 0) {
+ if (mInputEOSTimeNs >= 0 && mLastInputTimeNs >= mInputEOSTimeNs) {
+ if (mLastEncoderTimeUs < 0) {
+ doSignalEOSLocked();
+ return;
+ }
+ // mEncoderEOSTimeUs tracks the timestamp of the last output buffer we
+ // will wait for. When that buffer arrives, encoder will be signalled EOS.
+ mEncoderEOSTimeUs = mLastEncoderTimeUs;
+ if (DEBUG_EOS) Log.d(TAG,
+ "updateEOSLocked: mEncoderEOSTimeUs " + mEncoderEOSTimeUs);
+ }
+ }
+ if (mEncoderEOSTimeUs >= 0 && mEncoderEOSTimeUs <= mLastOutputTimeUs) {
+ doSignalEOSLocked();
+ }
+ }
+
+ private void doSignalEOSLocked() {
+ if (DEBUG_EOS) Log.d(TAG, "doSignalEOSLocked");
+
+ mEncoder.signalEndOfInputStream();
+ mSignaled = true;
+ }
+ }
+
+ /**
+ * MediaCodec callback for HEVC encoding.
+ */
+ private class EncoderCallback extends MediaCodec.Callback {
+ private boolean mOutputEOS;
+
+ @Override
+ public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+ if (codec != mEncoder) return;
+
+ if (DEBUG) Log.d(TAG, "onOutputFormatChanged: " + format);
+
+ format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
+ format.setInteger(MediaFormat.KEY_WIDTH, mWidth);
+ format.setInteger(MediaFormat.KEY_HEIGHT, mHeight);
+
+ if (mNumTiles > 1) {
+ format.setInteger(MediaFormat.KEY_GRID_WIDTH, mGridWidth);
+ format.setInteger(MediaFormat.KEY_GRID_HEIGHT, mGridHeight);
+ format.setInteger(MediaFormat.KEY_GRID_ROWS, mGridRows);
+ format.setInteger(MediaFormat.KEY_GRID_COLS, mGridCols);
+ }
+
+ mCallback.onOutputFormatChanged(HeifEncoder.this, format);
+ }
+
+ @Override
+ public void onInputBufferAvailable(MediaCodec codec, int index) {
+ if (codec != mEncoder || mInputEOS) return;
+
+ if (DEBUG) Log.d(TAG, "onInputBufferAvailable: " + index);
+ mCodecInputBuffers.add(index);
+ maybeCopyOneTileYUV();
+ }
+
+ @Override
+ public void onOutputBufferAvailable(MediaCodec codec, int index, BufferInfo info) {
+ if (codec != mEncoder || mOutputEOS) return;
+
+ if (DEBUG) Log.d(TAG, "onInputBufferAvailable: " + index + ", time "
+ + info.presentationTimeUs + ", size " + info.size + ", flags " + info.flags);
+
+ if ((info.size > 0) && ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0)) {
+ ByteBuffer outputBuffer = codec.getOutputBuffer(index);
+
+ // reset position as addBuffer() modifies it
+ outputBuffer.position(info.offset);
+ outputBuffer.limit(info.offset + info.size);
+
+ if (mEOSTracker != null) {
+ mEOSTracker.updateLastOutputTime(info.presentationTimeUs);
+ }
+
+ mCallback.onDrainOutputBuffer(HeifEncoder.this, outputBuffer);
+ }
+
+ mOutputEOS |= ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0);
+
+ codec.releaseOutputBuffer(index, false);
+
+ if (mOutputEOS) {
+ stopAndNotify(null);
+ }
+ }
+
+ @Override
+ public void onError(MediaCodec codec, CodecException e) {
+ if (codec != mEncoder) return;
+
+ Log.e(TAG, "onError: " + e);
+ stopAndNotify(e);
+ }
+
+ private void stopAndNotify(@Nullable CodecException e) {
+ stopInternal();
+ if (e == null) {
+ mCallback.onComplete(HeifEncoder.this);
+ } else {
+ mCallback.onError(HeifEncoder.this, e);
+ }
+ }
+ }
+
+ @Override
+ public void close() {
+ mHandler.postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ stopInternal();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java b/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java
new file mode 100644
index 0000000..b9c1959
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java
@@ -0,0 +1,521 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import android.annotation.SuppressLint;
+import android.graphics.Bitmap;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.Surface;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeoutException;
+
+import static android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_HEIF;
+
+/**
+ * This class writes one or more still images (of the same dimensions) into
+ * a heif file.
+ *
+ * It currently supports three input modes: {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ *
+ * The general sequence (in pseudo-code) to write a heif file using this class is as follows:
+ *
+ * 1) Construct the writer:
+ * HeifWriter heifwriter = new HeifWriter(...);
+ *
+ * 2) If using surface input mode, obtain the input surface:
+ * Surface surface = heifwriter.getInputSurface();
+ *
+ * 3) Call start:
+ * heifwriter.start();
+ *
+ * 4) Depending on the chosen input mode, add one or more images using one of these methods:
+ * heifwriter.addYuvBuffer(...); Or
+ * heifwriter.addBitmap(...); Or
+ * render to the previously obtained surface
+ *
+ * 5) Call stop:
+ * heifwriter.stop(...);
+ *
+ * 6) Close the writer:
+ * heifwriter.close();
+ *
+ * Please refer to the documentations on individual methods for the exact usage.
+ */
+public final class HeifWriter implements AutoCloseable {
+ private static final String TAG = "HeifWriter";
+ private static final boolean DEBUG = false;
+
+ private final @InputMode int mInputMode;
+ private final HandlerThread mHandlerThread;
+ private final Handler mHandler;
+ private int mNumTiles;
+ private final int mNumImages;
+ private final int mPrimaryIndex;
+ private final ResultWaiter mResultWaiter = new ResultWaiter();
+
+ private MediaMuxer mMuxer;
+ private HeifEncoder mHeifEncoder;
+ private int[] mTrackIndexArray;
+ private int mOutputIndex;
+ private boolean mStarted;
+
+ /**
+ * The input mode where the client adds input buffers with YUV data.
+ *
+ * @see #addYuvBuffer(int, byte[])
+ */
+ public static final int INPUT_MODE_BUFFER = 0;
+
+ /**
+ * The input mode where the client renders the images to an input Surface
+ * created by the writer.
+ *
+ * @see #getInputSurface()
+ */
+ public static final int INPUT_MODE_SURFACE = 1;
+
+ /**
+ * The input mode where the client adds bitmaps.
+ *
+ * @see #addBitmap(Bitmap)
+ */
+ public static final int INPUT_MODE_BITMAP = 2;
+
+ /** @hide */
+ @IntDef({
+ INPUT_MODE_BUFFER, INPUT_MODE_SURFACE, INPUT_MODE_BITMAP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface InputMode {}
+
+ /**
+ * Construct a heif writer that writes to a file specified by its path.
+ *
+ * @param path Path of the file to be written.
+ * @param width Width of the image.
+ * @param height Height of the image.
+ * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
+ * automatically chosen.
+ * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+ * supported by this implementation (which often results in larger file size).
+ * @param numImages Max number of images to write. Frames exceeding this number will not be
+ * written to file. The writing can be stopped earlier before this number of
+ * images are written by {@link #stop(long)}, except for the input mode of
+ * {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
+ * {@link #setInputEndOfStreamTimestamp(long)} and reached.
+ * @param primaryIndex Index of the image that should be marked as primary, must be within range
+ * [0, numImages - 1] inclusive.
+ * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ * @param handler If not null, client will receive all callbacks on the handler's looper.
+ * Otherwise, client will receive callbacks on a looper created by the writer.
+ *
+ * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
+ */
+ @SuppressLint("WrongConstant")
+ public HeifWriter(@NonNull String path,
+ int width, int height, boolean useGrid,
+ int quality, int numImages, int primaryIndex,
+ @InputMode int inputMode,
+ @Nullable Handler handler) throws IOException {
+ this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
+ new MediaMuxer(path, MUXER_OUTPUT_HEIF));
+ }
+
+ /**
+ * Construct a heif writer that writes to a file specified by file descriptor.
+ *
+ * @param fd File descriptor of the file to be written.
+ * @param width Width of the image.
+ * @param height Height of the image.
+ * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
+ * automatically chosen.
+ * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+ * supported by this implementation (which often results in larger file size).
+ * @param numImages Max number of images to write. Frames exceeding this number will not be
+ * written to file. The writing can be stopped earlier before this number of
+ * images are written by {@link #stop(long)}, except for the input mode of
+ * {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
+ * {@link #setInputEndOfStreamTimestamp(long)} and reached.
+ * @param primaryIndex Index of the image that should be marked as primary, must be within range
+ * [0, numImages - 1] inclusive.
+ * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ * @param handler If not null, client will receive all callbacks on the handler's looper.
+ * Otherwise, client will receive callbacks on a looper created by the writer.
+ *
+ * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
+ */
+ @SuppressLint("WrongConstant")
+ public HeifWriter(@NonNull FileDescriptor fd,
+ int width, int height, boolean useGrid,
+ int quality, int numImages, int primaryIndex,
+ @InputMode int inputMode,
+ @Nullable Handler handler) throws IOException {
+ this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
+ new MediaMuxer(fd, MUXER_OUTPUT_HEIF));
+ }
+
+ private HeifWriter(int width, int height, boolean useGrid,
+ int quality, int numImages, int primaryIndex,
+ @InputMode int inputMode,
+ @Nullable Handler handler,
+ @NonNull MediaMuxer muxer) throws IOException {
+ if (numImages <= 0 || primaryIndex < 0 || primaryIndex >= numImages) {
+ throw new IllegalArgumentException(
+ "Invalid numImages (" + numImages + ") or primaryIndex (" + primaryIndex + ")");
+ }
+
+ MediaFormat format = MediaFormat.createVideoFormat(
+ MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC, width, height);
+
+ if (DEBUG) {
+ Log.d(TAG, "format: " + format + ", inputMode: " + inputMode +
+ ", numImage: " + numImages + ", primaryIndex: " + primaryIndex);
+ }
+
+ // set to 1 initially, and wait for output format to know for sure
+ mNumTiles = 1;
+
+ mInputMode = inputMode;
+ mNumImages = numImages;
+ mPrimaryIndex = primaryIndex;
+
+ Looper looper = (handler != null) ? handler.getLooper() : null;
+ if (looper == null) {
+ mHandlerThread = new HandlerThread("HeifEncoderThread",
+ Process.THREAD_PRIORITY_FOREGROUND);
+ mHandlerThread.start();
+ looper = mHandlerThread.getLooper();
+ } else {
+ mHandlerThread = null;
+ }
+ mHandler = new Handler(looper);
+
+ mMuxer = muxer;
+
+ mHeifEncoder = new HeifEncoder(width, height, useGrid, quality,
+ mInputMode, mHandler, new HeifCallback());
+ }
+
+ /**
+ * Start the heif writer. Can only be called once.
+ *
+ * @throws IllegalStateException if called more than once.
+ */
+ public void start() {
+ checkStarted(false);
+ mStarted = true;
+ mHeifEncoder.start();
+ }
+
+ /**
+ * Add one YUV buffer to the heif file.
+ *
+ * @param format The YUV format as defined in {@link android.graphics.ImageFormat}, currently
+ * only support YUV_420_888.
+ *
+ * @param data byte array containing the YUV data. If the format has more than one planes,
+ * they must be concatenated.
+ *
+ * @throws IllegalStateException if not started or not configured to use buffer input.
+ */
+ public void addYuvBuffer(int format, @NonNull byte[] data) {
+ checkStartedAndMode(INPUT_MODE_BUFFER);
+ mHeifEncoder.addYuvBuffer(format, data);
+ }
+
+ /**
+ * Retrieves the input surface for encoding.
+ *
+ * @return the input surface if configured to use surface input.
+ *
+ * @throws IllegalStateException if called after start or not configured to use surface input.
+ */
+ public @NonNull Surface getInputSurface() {
+ checkStarted(false);
+ checkMode(INPUT_MODE_SURFACE);
+ return mHeifEncoder.getInputSurface();
+ }
+
+ /**
+ * Set the timestamp (in nano seconds) of the last input frame to encode.
+ *
+ * This call is only valid for surface input. Client can use this to stop the heif writer
+ * earlier before the maximum number of images are written. If not called, the writer will
+ * only stop when the maximum number of images are written.
+ *
+ * @param timestampNs timestamp (in nano seconds) of the last frame that will be written to the
+ * heif file. Frames with timestamps larger than the specified value will not
+ * be written. However, if a frame already started encoding when this is set,
+ * all tiles within that frame will be encoded.
+ *
+ * @throws IllegalStateException if not started or not configured to use surface input.
+ */
+ public void setInputEndOfStreamTimestamp(long timestampNs) {
+ checkStartedAndMode(INPUT_MODE_SURFACE);
+ mHeifEncoder.setEndOfInputStreamTimestamp(timestampNs);
+ }
+
+ /**
+ * Add one bitmap to the heif file.
+ *
+ * @param bitmap the bitmap to be added to the file.
+ * @throws IllegalStateException if not started or not configured to use bitmap input.
+ */
+ public void addBitmap(@NonNull Bitmap bitmap) {
+ checkStartedAndMode(INPUT_MODE_BITMAP);
+ mHeifEncoder.addBitmap(bitmap);
+ }
+
+ /**
+ * Stop the heif writer synchronously. Throws exception if the writer didn't finish writing
+ * successfully. Upon a success return:
+ *
+ * - For buffer and bitmap inputs, all images sent before stop will be written.
+ *
+ * - For surface input, images with timestamp on or before that specified in
+ * {@link #setInputEndOfStreamTimestamp(long)} will be written. In case where
+ * {@link #setInputEndOfStreamTimestamp(long)} was never called, stop will block
+ * until maximum number of images are received.
+ *
+ * @param timeoutMs Maximum time (in microsec) to wait for the writer to complete, with zero
+ * indicating waiting indefinitely.
+ * @see #setInputEndOfStreamTimestamp(long)
+ * @throws Exception if encountered error, in which case the output file may not be valid. In
+ * particular, {@link TimeoutException} is thrown when timed out, and {@link
+ * MediaCodec.CodecException} is thrown when encountered codec error.
+ */
+ public void stop(long timeoutMs) throws Exception {
+ checkStarted(true);
+ mHeifEncoder.stopAsync();
+ mResultWaiter.waitForResult(timeoutMs);
+ }
+
+ private void checkStarted(boolean requiredStarted) {
+ if (mStarted != requiredStarted) {
+ throw new IllegalStateException("Already started");
+ }
+ }
+
+ private void checkMode(@InputMode int requiredMode) {
+ if (mInputMode != requiredMode) {
+ throw new IllegalStateException("Not valid in input mode " + mInputMode);
+ }
+ }
+
+ private void checkStartedAndMode(@InputMode int requiredMode) {
+ checkStarted(true);
+ checkMode(requiredMode);
+ }
+
+ /**
+ * Routine to stop and release writer, must be called on the same looper
+ * that receives heif encoder callbacks.
+ */
+ private void closeInternal() {
+ if (DEBUG) Log.d(TAG, "closeInternal");
+
+ if (mMuxer != null) {
+ mMuxer.stop();
+ mMuxer.release();
+ mMuxer = null;
+ }
+
+ if (mHeifEncoder != null) {
+ mHeifEncoder.close();
+ mHeifEncoder = null;
+ }
+ }
+
+ /**
+ * Callback from the heif encoder.
+ */
+ private class HeifCallback extends HeifEncoder.Callback {
+ /**
+ * Upon receiving output format from the encoder, add the requested number of
+ * image tracks to the muxer and start the muxer.
+ */
+ @Override
+ public void onOutputFormatChanged(
+ @NonNull HeifEncoder encoder, @NonNull MediaFormat format) {
+ if (encoder != mHeifEncoder) return;
+
+ if (DEBUG) {
+ Log.d(TAG, "onOutputFormatChanged: " + format);
+ }
+ if (mTrackIndexArray != null) {
+ stopAndNotify(new IllegalStateException(
+ "Output format changed after muxer started"));
+ return;
+ }
+
+ try {
+ int gridRows = format.getInteger(MediaFormat.KEY_GRID_ROWS);
+ int gridCols = format.getInteger(MediaFormat.KEY_GRID_COLS);
+ mNumTiles = gridRows * gridCols;
+ } catch (NullPointerException | ClassCastException e) {
+ mNumTiles = 1;
+ }
+
+ // add mNumImages image tracks of the same format
+ mTrackIndexArray = new int[mNumImages];
+ for (int i = 0; i < mTrackIndexArray.length; i++) {
+ // mark primary
+ if (i == mPrimaryIndex) {
+ format.setInteger(MediaFormat.KEY_IS_DEFAULT, 1);
+ }
+ mTrackIndexArray[i] = mMuxer.addTrack(format);
+ }
+ mMuxer.start();
+ }
+
+ /**
+ * Upon receiving an output buffer from the encoder (which is one image when
+ * grid is not used, or one tile if grid is used), add that sample to the muxer.
+ */
+ @Override
+ public void onDrainOutputBuffer(
+ @NonNull HeifEncoder encoder, @NonNull ByteBuffer byteBuffer) {
+ if (encoder != mHeifEncoder) return;
+
+ if (DEBUG) {
+ Log.d(TAG, "onDrainOutputBuffer: " + mOutputIndex);
+ }
+ if (mTrackIndexArray == null) {
+ stopAndNotify(new IllegalStateException(
+ "Output buffer received before format info"));
+ return;
+ }
+
+ if (mOutputIndex < mNumImages * mNumTiles) {
+ MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+ info.set(byteBuffer.position(), byteBuffer.remaining(), 0, 0);
+ mMuxer.writeSampleData(
+ mTrackIndexArray[mOutputIndex / mNumTiles], byteBuffer, info);
+ }
+
+ mOutputIndex++;
+
+ // post EOS if reached max number of images allowed.
+ if (mOutputIndex == mNumImages * mNumTiles) {
+ stopAndNotify(null);
+ }
+ }
+
+ @Override
+ public void onComplete(@NonNull HeifEncoder encoder) {
+ if (encoder != mHeifEncoder) return;
+
+ stopAndNotify(null);
+ }
+
+ @Override
+ public void onError(@NonNull HeifEncoder encoder, @NonNull MediaCodec.CodecException e) {
+ if (encoder != mHeifEncoder) return;
+
+ stopAndNotify(e);
+ }
+
+ private void stopAndNotify(@Nullable Exception error) {
+ try {
+ closeInternal();
+ } catch (Exception e) {
+ // if there is an error during muxer stop, that must be propagated,
+ // unless error exists already.
+ if (error == null) {
+ error = e;
+ }
+ }
+ mResultWaiter.signalResult(error);
+ }
+ }
+
+ private static class ResultWaiter {
+ private boolean mDone;
+ private Exception mException;
+
+ synchronized void waitForResult(long timeoutMs) throws Exception {
+ if (timeoutMs < 0) {
+ throw new IllegalArgumentException("timeoutMs is negative");
+ }
+ if (timeoutMs == 0) {
+ while (!mDone) {
+ try {
+ wait();
+ } catch (InterruptedException ex) {}
+ }
+ } else {
+ final long startTimeMs = System.currentTimeMillis();
+ long remainingWaitTimeMs = timeoutMs;
+ // avoid early termination by "spurious" wakeup.
+ while (!mDone && remainingWaitTimeMs > 0) {
+ try {
+ wait(remainingWaitTimeMs);
+ } catch (InterruptedException ex) {}
+ remainingWaitTimeMs -= (System.currentTimeMillis() - startTimeMs);
+ }
+ }
+ if (!mDone) {
+ mDone = true;
+ mException = new TimeoutException("timed out waiting for result");
+ }
+ if (mException != null) {
+ throw mException;
+ }
+ }
+
+ synchronized void signalResult(@Nullable Exception e) {
+ if (!mDone) {
+ mDone = true;
+ mException = e;
+ notifyAll();
+ }
+ }
+ }
+
+ @Override
+ public void close() {
+ mHandler.postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ closeInternal();
+ } catch (Exception e) {
+ // If the client called stop() properly, any errors would have been
+ // reported there. We don't want to crash when closing.
+ }
+ }
+ });
+ }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java b/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java
new file mode 100644
index 0000000..b6e720d
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java
@@ -0,0 +1,337 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.media.heifwriter;
+
+import android.support.annotation.IntDef;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.util.Log;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.FloatBuffer;
+
+/**
+ * GL program and supporting functions for textured 2D shapes.
+ *
+ * (Contains mostly code borrowed from Grafika)
+ *
+ * @hide
+ */
+public class Texture2dProgram {
+ private static final String TAG = "Texture2dProgram";
+
+ /** Identity matrix for general use. Don't modify or life will get weird. */
+ public static final float[] IDENTITY_MATRIX;
+
+ /**
+ * Following matrix is for texturing from bitmap. We set up the frame rects
+ * to work with SurfaceTexture's texcoords and texmatrix, but then the bitmap
+ * texturing must flip it vertically. (Don't modify or life gets weird too.)
+ */
+ public static final float[] V_FLIP_MATRIX;
+
+ static {
+ IDENTITY_MATRIX = new float[16];
+ Matrix.setIdentityM(IDENTITY_MATRIX, 0);
+
+ V_FLIP_MATRIX = new float[16];
+ Matrix.setIdentityM(V_FLIP_MATRIX, 0);
+ Matrix.translateM(V_FLIP_MATRIX, 0, 0.0f, 1.0f, 0.0f);
+ Matrix.scaleM(V_FLIP_MATRIX, 0, 1.0f, -1.0f, 1.0f);
+ }
+
+ public static final int TEXTURE_2D = 0;
+ public static final int TEXTURE_EXT = 1;
+
+ /** @hide */
+ @IntDef({
+ TEXTURE_2D,
+ TEXTURE_EXT,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProgramType {}
+
+ // Simple vertex shader, used for all programs.
+ private static final String VERTEX_SHADER =
+ "uniform mat4 uMVPMatrix;\n" +
+ "uniform mat4 uTexMatrix;\n" +
+ "attribute vec4 aPosition;\n" +
+ "attribute vec4 aTextureCoord;\n" +
+ "varying vec2 vTextureCoord;\n" +
+ "void main() {\n" +
+ " gl_Position = uMVPMatrix * aPosition;\n" +
+ " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" +
+ "}\n";
+
+ // Simple fragment shader for use with "normal" 2D textures.
+ private static final String FRAGMENT_SHADER_2D =
+ "precision mediump float;\n" +
+ "varying vec2 vTextureCoord;\n" +
+ "uniform sampler2D sTexture;\n" +
+ "void main() {\n" +
+ " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+ "}\n";
+
+ // Simple fragment shader for use with external 2D textures (e.g. what we get from
+ // SurfaceTexture).
+ private static final String FRAGMENT_SHADER_EXT =
+ "#extension GL_OES_EGL_image_external : require\n" +
+ "precision mediump float;\n" +
+ "varying vec2 vTextureCoord;\n" +
+ "uniform samplerExternalOES sTexture;\n" +
+ "void main() {\n" +
+ " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+ "}\n";
+
+ private @ProgramType int mProgramType;
+
+ // Handles to the GL program and various components of it.
+ private int mProgramHandle;
+ private int muMVPMatrixLoc;
+ private int muTexMatrixLoc;
+ private int maPositionLoc;
+ private int maTextureCoordLoc;
+ private int mTextureTarget;
+
+ /**
+ * Prepares the program in the current EGL context.
+ */
+ public Texture2dProgram(@ProgramType int programType) {
+ mProgramType = programType;
+
+ switch (programType) {
+ case TEXTURE_2D:
+ mTextureTarget = GLES20.GL_TEXTURE_2D;
+ mProgramHandle = createProgram(VERTEX_SHADER, FRAGMENT_SHADER_2D);
+ break;
+ case TEXTURE_EXT:
+ mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
+ mProgramHandle = createProgram(VERTEX_SHADER, FRAGMENT_SHADER_EXT);
+ break;
+ default:
+ throw new RuntimeException("Unhandled type " + programType);
+ }
+ if (mProgramHandle == 0) {
+ throw new RuntimeException("Unable to create program");
+ }
+ Log.d(TAG, "Created program " + mProgramHandle + " (" + programType + ")");
+
+ // get locations of attributes and uniforms
+
+ maPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "aPosition");
+ checkLocation(maPositionLoc, "aPosition");
+ maTextureCoordLoc = GLES20.glGetAttribLocation(mProgramHandle, "aTextureCoord");
+ checkLocation(maTextureCoordLoc, "aTextureCoord");
+ muMVPMatrixLoc = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix");
+ checkLocation(muMVPMatrixLoc, "uMVPMatrix");
+ muTexMatrixLoc = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix");
+ checkLocation(muTexMatrixLoc, "uTexMatrix");
+ }
+
+ /**
+ * Releases the program.
+ * <p>
+ * The appropriate EGL context must be current (i.e. the one that was used to create
+ * the program).
+ */
+ public void release() {
+ Log.d(TAG, "deleting program " + mProgramHandle);
+ GLES20.glDeleteProgram(mProgramHandle);
+ mProgramHandle = -1;
+ }
+
+ /**
+ * Returns the program type.
+ */
+ public @ProgramType int getProgramType() {
+ return mProgramType;
+ }
+
+ /**
+ * Creates a texture object suitable for use with this program.
+ * <p>
+ * On exit, the texture will be bound.
+ */
+ public int createTextureObject() {
+ int[] textures = new int[1];
+ GLES20.glGenTextures(1, textures, 0);
+ checkGlError("glGenTextures");
+
+ int texId = textures[0];
+ GLES20.glBindTexture(mTextureTarget, texId);
+ checkGlError("glBindTexture " + texId);
+
+ GLES20.glTexParameterf(mTextureTarget, GLES20.GL_TEXTURE_MIN_FILTER,
+ GLES20.GL_NEAREST);
+ GLES20.glTexParameterf(mTextureTarget, GLES20.GL_TEXTURE_MAG_FILTER,
+ (mTextureTarget == GLES20.GL_TEXTURE_2D) ? GLES20.GL_NEAREST : GLES20.GL_LINEAR);
+ GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_S,
+ GLES20.GL_CLAMP_TO_EDGE);
+ GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_T,
+ GLES20.GL_CLAMP_TO_EDGE);
+ checkGlError("glTexParameter");
+
+ return texId;
+ }
+
+ /**
+ * Issues the draw call. Does the full setup on every call.
+ *
+ * @param mvpMatrix The 4x4 projection matrix.
+ * @param vertexBuffer Buffer with vertex position data.
+ * @param firstVertex Index of first vertex to use in vertexBuffer.
+ * @param vertexCount Number of vertices in vertexBuffer.
+ * @param coordsPerVertex The number of coordinates per vertex (e.g. x,y is 2).
+ * @param vertexStride Width, in bytes, of the position data for each vertex (often
+ * vertexCount * sizeof(float)).
+ * @param texMatrix A 4x4 transformation matrix for texture coords. (Primarily intended
+ * for use with SurfaceTexture.)
+ * @param texBuffer Buffer with vertex texture data.
+ * @param texStride Width, in bytes, of the texture data for each vertex.
+ */
+ public void draw(float[] mvpMatrix, FloatBuffer vertexBuffer, int firstVertex,
+ int vertexCount, int coordsPerVertex, int vertexStride,
+ float[] texMatrix, FloatBuffer texBuffer, int textureId, int texStride) {
+ checkGlError("draw start");
+
+ // Select the program.
+ GLES20.glUseProgram(mProgramHandle);
+ checkGlError("glUseProgram");
+
+ // Set the texture.
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+ GLES20.glBindTexture(mTextureTarget, textureId);
+
+ // Copy the model / view / projection matrix over.
+ GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, mvpMatrix, 0);
+ checkGlError("glUniformMatrix4fv");
+
+ // Copy the texture transformation matrix over.
+ GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, texMatrix, 0);
+ checkGlError("glUniformMatrix4fv");
+
+ // Enable the "aPosition" vertex attribute.
+ GLES20.glEnableVertexAttribArray(maPositionLoc);
+ checkGlError("glEnableVertexAttribArray");
+
+ // Connect vertexBuffer to "aPosition".
+ GLES20.glVertexAttribPointer(maPositionLoc, coordsPerVertex,
+ GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
+ checkGlError("glVertexAttribPointer");
+
+ // Enable the "aTextureCoord" vertex attribute.
+ GLES20.glEnableVertexAttribArray(maTextureCoordLoc);
+ checkGlError("glEnableVertexAttribArray");
+
+ // Connect texBuffer to "aTextureCoord".
+ GLES20.glVertexAttribPointer(maTextureCoordLoc, 2,
+ GLES20.GL_FLOAT, false, texStride, texBuffer);
+ checkGlError("glVertexAttribPointer");
+
+ // Draw the rect.
+ GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, firstVertex, vertexCount);
+ checkGlError("glDrawArrays");
+
+ // Done -- disable vertex array, texture, and program.
+ GLES20.glDisableVertexAttribArray(maPositionLoc);
+ GLES20.glDisableVertexAttribArray(maTextureCoordLoc);
+ GLES20.glBindTexture(mTextureTarget, 0);
+ GLES20.glUseProgram(0);
+ }
+
+ /**
+ * Creates a new program from the supplied vertex and fragment shaders.
+ *
+ * @return A handle to the program, or 0 on failure.
+ */
+ public static int createProgram(String vertexSource, String fragmentSource) {
+ int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+ if (vertexShader == 0) {
+ return 0;
+ }
+ int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+ if (pixelShader == 0) {
+ return 0;
+ }
+
+ int program = GLES20.glCreateProgram();
+ checkGlError("glCreateProgram");
+ if (program == 0) {
+ Log.e(TAG, "Could not create program");
+ }
+ GLES20.glAttachShader(program, vertexShader);
+ checkGlError("glAttachShader");
+ GLES20.glAttachShader(program, pixelShader);
+ checkGlError("glAttachShader");
+ GLES20.glLinkProgram(program);
+ int[] linkStatus = new int[1];
+ GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+ if (linkStatus[0] != GLES20.GL_TRUE) {
+ Log.e(TAG, "Could not link program: ");
+ Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+ GLES20.glDeleteProgram(program);
+ program = 0;
+ }
+ return program;
+ }
+
+ /**
+ * Compiles the provided shader source.
+ *
+ * @return A handle to the shader, or 0 on failure.
+ */
+ public static int loadShader(int shaderType, String source) {
+ int shader = GLES20.glCreateShader(shaderType);
+ checkGlError("glCreateShader type=" + shaderType);
+ GLES20.glShaderSource(shader, source);
+ GLES20.glCompileShader(shader);
+ int[] compiled = new int[1];
+ GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+ if (compiled[0] == 0) {
+ Log.e(TAG, "Could not compile shader " + shaderType + ":");
+ Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+ GLES20.glDeleteShader(shader);
+ shader = 0;
+ }
+ return shader;
+ }
+
+ /**
+ * Checks to see if the location we obtained is valid. GLES returns -1 if a label
+ * could not be found, but does not set the GL error.
+ * <p>
+ * Throws a RuntimeException if the location is invalid.
+ */
+ public static void checkLocation(int location, String label) {
+ if (location < 0) {
+ throw new RuntimeException("Unable to locate '" + label + "' in program");
+ }
+ }
+
+ /**
+ * Checks to see if a GLES error has been raised.
+ */
+ public static void checkGlError(String op) {
+ int error = GLES20.glGetError();
+ if (error != GLES20.GL_NO_ERROR) {
+ String msg = op + ": glError 0x" + Integer.toHexString(error);
+ Log.e(TAG, msg);
+ throw new RuntimeException(msg);
+ }
+ }
+}
diff --git a/interpolator/api/current.txt b/interpolator/api/current.txt
new file mode 100644
index 0000000..7de1883
--- /dev/null
+++ b/interpolator/api/current.txt
@@ -0,0 +1,16 @@
+package android.support.v4.view.animation {
+
+ public class FastOutLinearInInterpolator implements android.view.animation.Interpolator {
+ ctor public FastOutLinearInInterpolator();
+ }
+
+ public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
+ ctor public FastOutSlowInInterpolator();
+ }
+
+ public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
+ ctor public LinearOutSlowInInterpolator();
+ }
+
+}
+
diff --git a/interpolator/build.gradle b/interpolator/build.gradle
new file mode 100644
index 0000000..6bc6e04
--- /dev/null
+++ b/interpolator/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+}
+
+supportLibrary {
+ name = "Android Support Library Interpolators"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/interpolator/src/main/AndroidManifest.xml b/interpolator/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7d63897
--- /dev/null
+++ b/interpolator/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.interpolator"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
diff --git a/jetifier/jetifier/core/build.gradle b/jetifier/jetifier/core/build.gradle
index 2bf4d08..683a020 100644
--- a/jetifier/jetifier/core/build.gradle
+++ b/jetifier/jetifier/core/build.gradle
@@ -30,7 +30,7 @@
compile("org.jdom:jdom2:2.0.6")
compile(KOTLIN_STDLIB)
testCompile("junit:junit:4.12")
- testCompile("com.google.truth:truth:0.31")
+ testCompile("com.google.truth:truth:0.34")
}
supportLibrary {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
index aa2e1e3..1f0b901 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
@@ -74,9 +74,10 @@
/**
* Creates a new instance of the [Processor].
- * [config] Transformation configuration
- * [reversedMode] Whether the processor should run in reversed mode
- * [rewritingSupportLib] Whether we are rewriting the support library itself
+ *
+ * @param config Transformation configuration
+ * @param reversedMode Whether the processor should run in reversed mode
+ * @param rewritingSupportLib Whether we are rewriting the support library itself
*/
fun createProcessor(
config: Config,
@@ -110,17 +111,26 @@
/**
* Transforms the input libraries given in [inputLibraries] using all the registered
- * [Transformer]s and returns new libraries stored in [outputPath].
+ * [Transformer]s and returns a list of replacement libraries (the newly created libraries are
+ * get stored into [outputPath]).
*
* Currently we have the following transformers:
* - [ByteCodeTransformer] for java native code
* - [XmlResourcesTransformer] for java native code
* - [ProGuardTransformer] for PorGuard files
+ *
+ * @param outputPath Path where to save the generated library / libraries.
+ * @param outputIsDir Whether the [outputPath] represents a single file or a directory. In case
+ * of a single file, only one library can be given as input.
+ * @param copyUnmodifiedLibsAlso Whether archives that were not modified should be also copied
+ * to the given [outputPath]
+ * @return List of files (existing and generated) that should replace the given [inputLibraries]
*/
fun transform(inputLibraries: Set<File>,
outputPath: Path,
- outputIsDir: Boolean
- ): TransformationResult {
+ outputIsDir: Boolean,
+ copyUnmodifiedLibsAlso: Boolean = true
+ ): Set<File> {
// 0) Validate arguments
if (!outputIsDir && inputLibraries.size > 1) {
throw IllegalArgumentException("Cannot process more than 1 library (" + inputLibraries +
@@ -148,19 +158,29 @@
// 4) Transform the previously discovered POM files
transformPomFiles(pomFiles)
- // 5) Repackage the libraries back to archives
- val outputLibraries = libraries.map {
- if (outputIsDir) {
- it.writeSelfToDir(outputPath)
- } else {
- it.writeSelfToFile(outputPath)
+ // 5) Repackage the libraries back to archive files
+ val generatedLibraries = libraries
+ .filter { copyUnmodifiedLibsAlso || it.wasChanged }
+ .map {
+ if (outputIsDir) {
+ it.writeSelfToDir(outputPath)
+ } else {
+ it.writeSelfToFile(outputPath)
+ }
}
- }.toSet()
+ .toSet()
- // TODO: Filter out only the libraries that have been really changed
- return TransformationResult(
- filesToRemove = inputLibraries,
- filesToAdd = outputLibraries)
+ if (copyUnmodifiedLibsAlso) {
+ return generatedLibraries
+ }
+
+ // 6) Create a set of files that should be removed (because they've been changed).
+ val filesToRemove = libraries
+ .filter { it.wasChanged }
+ .map { it.relativePath.toFile() }
+ .toSet()
+
+ return inputLibraries.minus(filesToRemove).plus(generatedLibraries)
}
private fun loadLibraries(inputLibraries: Iterable<File>): List<Archive> {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
index bac2ffb..38d810b 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
@@ -48,6 +48,9 @@
override val fileName: String = relativePath.fileName.toString()
+ override val wasChanged: Boolean
+ get() = files.any { it.wasChanged }
+
override fun accept(visitor: ArchiveItemVisitor) {
visitor.visit(this)
}
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
index 8443773..81c166e 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
@@ -23,7 +23,7 @@
/**
* Represents a file in the archive that is not an archive.
*/
-class ArchiveFile(relativePath: Path, var data: ByteArray) : ArchiveItem {
+class ArchiveFile(relativePath: Path, data: ByteArray) : ArchiveItem {
override var relativePath = relativePath
private set
@@ -31,6 +31,12 @@
override var fileName: String = relativePath.fileName.toString()
private set
+ override var wasChanged: Boolean = false
+ private set
+
+ var data: ByteArray = data
+ private set
+
override fun accept(visitor: ArchiveItemVisitor) {
visitor.visit(this)
}
@@ -41,7 +47,16 @@
}
fun updateRelativePath(newRelativePath: Path) {
- this.relativePath = newRelativePath
- this.fileName = relativePath.fileName.toString()
+ if (relativePath != newRelativePath) {
+ wasChanged = true
+ }
+
+ relativePath = newRelativePath
+ fileName = relativePath.fileName.toString()
+ }
+
+ fun setNewData(newData: ByteArray) {
+ data = newData
+ wasChanged = true
}
}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
index 2d35e13..63c795a 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
@@ -20,7 +20,8 @@
import java.nio.file.Path
/**
- * Abstraction to represent archive and its files as a one thing.
+ * Abstraction to represent archive and its files as a one thing before and after transformation
+ * together with information if any changes happened during the transformation.
*/
interface ArchiveItem {
@@ -30,12 +31,17 @@
* Files in a nested archive have a path relative to that archive not to the parent of
* the archive. The root archive has the file system path set as its relative path.
*/
- val relativePath : Path
+ val relativePath: Path
/**
* Name of the file.
*/
- val fileName : String
+ val fileName: String
+
+ /**
+ * Whether the item's content or its children were changed by Jetifier.
+ */
+ val wasChanged: Boolean
/**
* Accepts visitor.
@@ -47,7 +53,6 @@
*/
fun writeSelfTo(outputStream: OutputStream)
-
fun isPomFile() = fileName.equals("pom.xml", ignoreCase = true)
fun isClassFile() = fileName.endsWith(".class", ignoreCase = true)
@@ -55,5 +60,4 @@
fun isXmlFile() = fileName.endsWith(".xml", ignoreCase = true)
fun isProGuardFile () = fileName.equals("proguard.txt", ignoreCase = true)
-
}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
index 0c6c8aa..51335e2 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
@@ -32,5 +32,4 @@
* Runs transformation of the given file.
*/
fun runTransform(file: ArchiveFile)
-
-}
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
index 296ce49..9024ff1 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
@@ -25,9 +25,9 @@
/**
* The [Transformer] responsible for java byte code refactoring.
*/
-class ByteCodeTransformer internal constructor(context: TransformationContext) : Transformer {
-
- private val remapper: CoreRemapperImpl = CoreRemapperImpl(context)
+class ByteCodeTransformer internal constructor(
+ private val context: TransformationContext
+) : Transformer {
override fun canTransform(file: ArchiveFile) = file.isClassFile()
@@ -35,11 +35,14 @@
val reader = ClassReader(file.data)
val writer = ClassWriter(0 /* flags */)
- val visitor = remapper.createClassRemapper(writer)
+ val remapper = CoreRemapperImpl(context, writer)
+ reader.accept(remapper.classRemapper, 0 /* flags */)
- reader.accept(visitor, 0 /* flags */)
+ if (!remapper.changesDone) {
+ return
+ }
- file.data = writer.toByteArray()
+ file.setNewData(writer.toByteArray())
file.updateRelativePath(remapper.rewritePath(file.relativePath))
}
}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
index 2ff0081..4603ae0 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
@@ -28,7 +28,10 @@
/**
* Applies mappings defined in [TypesMap] during the remapping process.
*/
-class CoreRemapperImpl(private val context: TransformationContext) : CoreRemapper {
+class CoreRemapperImpl(
+ private val context: TransformationContext,
+ visitor: ClassVisitor
+) : CoreRemapper {
companion object {
const val TAG = "CoreRemapperImpl"
@@ -36,9 +39,10 @@
private val typesMap = context.config.typesMap
- fun createClassRemapper(visitor: ClassVisitor): ClassRemapper {
- return ClassRemapper(visitor, CustomRemapper(this))
- }
+ var changesDone = false
+ private set
+
+ val classRemapper = ClassRemapper(visitor, CustomRemapper(this))
override fun rewriteType(type: JavaType): JavaType {
if (!context.isEligibleForRewrite(type)) {
@@ -47,6 +51,7 @@
val result = typesMap.types[type]
if (result != null) {
+ changesDone = changesDone || result != type
Log.i(TAG, " map: %s -> %s", type, result)
return result
}
@@ -64,6 +69,7 @@
val result = typesMap.types[type]
if (result != null) {
+ changesDone = changesDone || result != type
Log.i(TAG, " map string: %s -> %s", type, result)
return result.toDotNotation()
}
@@ -85,6 +91,7 @@
val result = rewriteType(type)
if (result != type) {
+ changesDone = true
return path.fileSystem.getPath(result.fullName + ".class")
}
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
index 3220dae..333d776 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
@@ -61,6 +61,6 @@
return
}
- file.data = to.toByteArray()
+ file.setNewData(to.toByteArray())
}
}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
index d5bdc3a..7dcd826 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
@@ -29,7 +29,7 @@
companion object {
private const val TAG = "Pom"
- fun loadFrom(file: ArchiveFile) : PomDocument {
+ fun loadFrom(file: ArchiveFile): PomDocument {
val document = XmlUtils.createDocumentFromByteArray(file.data)
val pomDoc = PomDocument(file, document)
pomDoc.initialize()
@@ -37,10 +37,10 @@
}
}
- val dependencies : MutableSet<PomDependency> = mutableSetOf()
- private val properties : MutableMap<String, String> = mutableMapOf()
- private var dependenciesGroup : Element? = null
- private var hasChanged : Boolean = false
+ val dependencies: MutableSet<PomDependency> = mutableSetOf()
+ private val properties: MutableMap<String, String> = mutableMapOf()
+ private var dependenciesGroup: Element? = null
+ private var hasChanged: Boolean = false
private fun initialize() {
val propertiesGroup = document.rootElement
@@ -64,7 +64,7 @@
* Currently it checks that all the dependencies that are going to be rewritten by the given
* rules satisfy the minimal version requirements defined by the rules.
*/
- fun validate(rules: List<PomRewriteRule>) : Boolean {
+ fun validate(rules: List<PomRewriteRule>): Boolean {
if (dependenciesGroup == null) {
// Nothing to validate as this file has no dependencies section
return true
@@ -96,7 +96,7 @@
newDependencies.add(dependency)
} else {
// Replace with new dependencies
- newDependencies.addAll(rule.to.mapTo(newDependencies){ it.rewrite(dependency) })
+ newDependencies.addAll(rule.to.mapTo(newDependencies) { it.rewrite(dependency) })
}
}
@@ -118,7 +118,7 @@
return
}
- file.data = XmlUtils.convertDocumentToByteArray(document)
+ file.setNewData(XmlUtils.convertDocumentToByteArray(document))
}
/**
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
index 423bf05..b7536c7 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
@@ -39,9 +39,14 @@
}
override fun runTransform(file: ArchiveFile) {
- val sb = StringBuilder(file.data.toString(StandardCharsets.UTF_8))
- val result = replacer.applyReplacers(sb.toString())
- file.data = result.toByteArray()
+ val content = StringBuilder(file.data.toString(StandardCharsets.UTF_8)).toString()
+ val result = replacer.applyReplacers(content)
+
+ if (result == content) {
+ return
+ }
+
+ file.setNewData(result.toByteArray())
}
}
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
index 4f81c71..18c8994 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
@@ -89,7 +89,7 @@
}
if (changesDone) {
- file.data = sb.toString().toByteArray(charset)
+ file.setNewData(sb.toString().toByteArray(charset))
}
}
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
new file mode 100644
index 0000000..1eeabdc
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.support.tools.jetifier.core
+
+import android.support.tools.jetifier.core.archive.Archive
+import android.support.tools.jetifier.core.archive.ArchiveFile
+import android.support.tools.jetifier.core.config.Config
+import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.RewriteRule
+import android.support.tools.jetifier.core.transform.PackageMap
+import android.support.tools.jetifier.core.transform.pom.PomDependency
+import android.support.tools.jetifier.core.transform.pom.PomRewriteRule
+import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.io.File
+import java.nio.file.Files
+import java.nio.file.Paths
+
+/**
+ * Tests that transformed artifacts are properly marked as changed / unchanged base on whether there
+ * was something to rewrite or not.
+ */
+class ChangeDetectionTest {
+ private val emptyConfig = Config(
+ restrictToPackagePrefixes = emptyList(),
+ rewriteRules = emptyList(),
+ slRules = emptyList(),
+ pomRewriteRules = emptyList(),
+ typesMap = TypesMap.EMPTY,
+ proGuardMap = ProGuardTypesMap.EMPTY,
+ packageMap = PackageMap.EMPTY
+ )
+
+ private val prefRewriteConfig = Config(
+ restrictToPackagePrefixes = listOf("android/support/v7/preference"),
+ rewriteRules =
+ listOf(
+ RewriteRule(from = "android/support/v7/preference/Preference(.+)", to = "ignore"),
+ RewriteRule(from = "(.*)/R(.*)", to = "ignore")
+ ),
+ slRules = emptyList(),
+ pomRewriteRules = listOf(
+ PomRewriteRule(
+ PomDependency(
+ groupId = "supportGroup", artifactId = "supportArtifact", version = "4.0"),
+ listOf(
+ PomDependency(
+ groupId = "testGroup", artifactId = "testArtifact", version = "1.0")
+ )
+ )),
+ typesMap = TypesMap(mapOf(
+ JavaType("android/support/v7/preference/Preference")
+ to JavaType("android/test/pref/Preference")
+ )),
+ proGuardMap = ProGuardTypesMap.EMPTY,
+ packageMap = PackageMap.EMPTY
+ )
+
+ @Test
+ fun xmlRewrite_archiveChanged() {
+ testChange(
+ config = prefRewriteConfig,
+ fileContent =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+ "<android.support.v7.preference.Preference/>",
+ fileName = "test.xml",
+ areChangesExpected = true
+ )
+ }
+
+ @Test
+ fun xmlRewrite_archiveNotChanged() {
+ testChange(
+ config = emptyConfig,
+ fileContent =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+ "<android.support.v7.preference.Preference/>",
+ fileName = "test.xml",
+ areChangesExpected = false
+ )
+ }
+
+ @Test
+ fun proGuard_archiveChanged() {
+ testChange(
+ config = prefRewriteConfig,
+ fileContent =
+ "-keep public class * extends android.support.v7.preference.Preference { \n" +
+ " <fields>; \n" +
+ "}",
+ fileName = "proguard.txt",
+ areChangesExpected = true
+ )
+ }
+
+ @Test
+ fun proGuard_archiveNotChanged() {
+ testChange(
+ config = emptyConfig,
+ fileContent =
+ "-keep public class * extends android.support.v7.preference.Preference { \n" +
+ " <fields>; \n" +
+ "}",
+ fileName = "test.xml",
+ areChangesExpected = false
+ )
+ }
+
+ @Test
+ fun pom_archiveChanged() {
+ testChange(
+ config = prefRewriteConfig,
+ fileContent =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
+ " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0" +
+ " http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
+ " <dependencies>\n" +
+ " <dependency>\n" +
+ " <groupId>supportGroup</groupId>\n" +
+ " <artifactId>supportArtifact</artifactId>\n" +
+ " <version>4.0</version>\n" +
+ " </dependency>\n" +
+ " </dependencies>" +
+ "</project>\n",
+ fileName = "pom.xml",
+ areChangesExpected = true
+ )
+ }
+
+ @Test
+ fun pom_archiveNotChanged() {
+ testChange(
+ config = emptyConfig,
+ fileContent =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
+ " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0" +
+ " http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
+ " <dependencies>\n" +
+ " <dependency>\n" +
+ " <groupId>supportGroup</groupId>\n" +
+ " <artifactId>supportArtifact</artifactId>\n" +
+ " <version>4.0</version>\n" +
+ " </dependency>\n" +
+ " </dependencies>" +
+ "</project>\n",
+ fileName = "pom.xml",
+ areChangesExpected = true
+ )
+ }
+
+ @Test
+ fun javaClass_archiveChanged() {
+ val inputClassPath = "/changeDetectionTest/testPreference.class"
+ val inputFile = File(javaClass.getResource(inputClassPath).file)
+
+ testChange(
+ config = prefRewriteConfig,
+ file = ArchiveFile(Paths.get("/", "preference.class"), inputFile.readBytes()),
+ areChangesExpected = true
+ )
+ }
+
+ @Test
+ fun javaClass_archiveNotChanged() {
+ val inputClassPath = "/changeDetectionTest/testPreference.class"
+ val inputFile = File(javaClass.getResource(inputClassPath).file)
+
+ testChange(
+ config = emptyConfig,
+ file = ArchiveFile(Paths.get("/", "preference.class"), inputFile.readBytes()),
+ areChangesExpected = false
+ )
+ }
+
+ private fun testChange(
+ config: Config,
+ fileContent: String,
+ fileName: String,
+ areChangesExpected: Boolean
+ ) {
+ testChange(
+ config = config,
+ file = ArchiveFile(Paths.get("/", fileName), fileContent.toByteArray()),
+ areChangesExpected = areChangesExpected)
+ }
+
+ /**
+ * Runs the whole transformation process over the given file and verifies if the parent
+ * artifacts was properly marked as changed / unchanged base on [areChangesExpected] param.
+ */
+ private fun testChange(
+ config: Config,
+ file: ArchiveFile,
+ areChangesExpected: Boolean
+ ) {
+ val archive = Archive(Paths.get("some/path"), listOf(file))
+ val sourceArchive = archive.writeSelfToFile(Files.createTempFile("test", ".zip"))
+
+ val expectedFileIfRefactored = Files.createTempFile("testRefactored", ".zip")
+ val processor = Processor.createProcessor(config)
+ val resultFiles = processor.transform(
+ setOf(sourceArchive),
+ outputPath = expectedFileIfRefactored,
+ outputIsDir = false,
+ copyUnmodifiedLibsAlso = false)
+
+ if (areChangesExpected) {
+ Truth.assertThat(resultFiles).containsExactly(expectedFileIfRefactored.toFile())
+ } else {
+ Truth.assertThat(resultFiles).containsExactly(sourceArchive)
+ }
+ }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
index 3b189e6..6876976 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
package android.support.tools.jetifier.core.transform.bytecode
import android.support.tools.jetifier.core.Processor
@@ -85,10 +101,10 @@
val inputFile = File(javaClass.getResource(inputZipPath).file)
val tempDir = createTempDir()
- val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+ val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
- Truth.assertThat(result.filesToAdd).hasSize(1)
- testArchivesAreSame(result.filesToAdd.first(),
+ Truth.assertThat(resultFiles).hasSize(1)
+ testArchivesAreSame(resultFiles.first(),
File(javaClass.getResource(expectedZipPath).file))
tempDir.delete()
@@ -106,10 +122,10 @@
val inputFile = File(javaClass.getResource(inputZipPath).file)
val tempDir = createTempDir()
- val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+ val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
- Truth.assertThat(result.filesToAdd).hasSize(1)
- testArchivesAreSame(result.filesToAdd.first(),
+ Truth.assertThat(resultFiles).hasSize(1)
+ testArchivesAreSame(resultFiles.first(),
File(javaClass.getResource(expectedZipPath).file))
tempDir.delete()
@@ -129,15 +145,15 @@
rewritingSupportLib = true)
val inputFile = File(javaClass.getResource(inputZipPath).file)
val tempDir = createTempDir()
- val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+ val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
// Take previous result & reverse it
val processor2 = Processor.createProcessor(TEST_CONFIG,
rewritingSupportLib = true,
reversedMode = true)
- val result2 = processor2.transform(setOf(result.filesToAdd.first()), tempDir.toPath(), true)
+ val resultFiles2 = processor2.transform(setOf(resultFiles.first()), tempDir.toPath(), true)
- testArchivesAreSame(result2.filesToAdd.first(),
+ testArchivesAreSame(resultFiles2.first(),
File(javaClass.getResource(inputZipPath).file))
tempDir.delete()
@@ -154,10 +170,10 @@
val inputFile = File(javaClass.getResource(inputZipPath).file)
val tempDir = createTempDir()
- val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+ val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
- Truth.assertThat(result.filesToAdd).hasSize(1)
- testArchivesAreSame(result.filesToAdd.first(),
+ Truth.assertThat(resultFiles).hasSize(1)
+ testArchivesAreSame(resultFiles.first(),
File(javaClass.getResource(inputZipPath).file))
tempDir.delete()
diff --git a/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class b/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class
new file mode 100644
index 0000000..50d7d11
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class
Binary files differ
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
index 4d35625..22f4308 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
@@ -48,7 +48,7 @@
const val OUTPUT_DIR_APPENDIX = "jetifier"
- fun resolveTask(project: Project) : JetifyGlobalTask {
+ fun resolveTask(project: Project): JetifyGlobalTask {
val task = project.tasks.findByName(TASK_NAME) as? JetifyGlobalTask
if (task != null) {
return task
@@ -61,7 +61,6 @@
private val outputDir = File(project.buildDir, OUTPUT_DIR_APPENDIX)
-
override fun getGroup() = GROUP_ID
override fun getDescription() = DESCRIPTION
@@ -93,7 +92,7 @@
if (fileDep != null) {
fileDep.files.forEach {
dependenciesMap
- .getOrPut(it, { mutableSetOf<Dependency>() } )
+ .getOrPut(it, { mutableSetOf<Dependency>() })
.add(fileDep)
}
} else {
@@ -108,7 +107,7 @@
detached.dependencies.add(dep)
detached.resolvedConfiguration.resolvedArtifacts.forEach {
dependenciesMap
- .getOrPut(it.file, { mutableSetOf<Dependency>() } )
+ .getOrPut(it.file, { mutableSetOf<Dependency>() })
.add(dep)
}
}
@@ -116,21 +115,27 @@
}
// Process the files using Jetifier
- val result = TasksCommon.processFiles(config, dependenciesMap.keys, project.logger, outputDir)
+ val result = TasksCommon.processFiles(config, dependenciesMap.keys, project.logger,
+ outputDir)
- // Apply changes
configurationsToProcess.forEach { conf ->
- // Apply that on our set
- result.filesToRemove.forEach { file ->
- dependenciesMap[file]!!.forEach {
- conf.dependencies.remove(it)
+ // Remove files that we don't need anymore
+ dependenciesMap.keys
+ .toTypedArray()
+ .forEach { file ->
+ if (!result.contains(file)) {
+ dependenciesMap[file]!!.forEach {
+ conf.dependencies.remove(it)
+ }
+ }
}
- }
- result.filesToAdd.forEach {
- project.dependencies.add(conf.name, project.files(it))
+ // Add new generated files
+ result.forEach { file ->
+ if (!dependenciesMap.contains(file)) {
+ project.dependencies.add(conf.name, project.files(file))
+ }
}
}
}
-
}
\ No newline at end of file
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
index 082034fb..88b5cc1 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
@@ -17,7 +17,6 @@
package android.support.tools.jetifier.plugin.gradle
import android.support.tools.jetifier.core.Processor
-import android.support.tools.jetifier.core.TransformationResult
import android.support.tools.jetifier.core.config.Config
import android.support.tools.jetifier.core.utils.Log
import org.gradle.api.logging.LogLevel
@@ -31,10 +30,12 @@
var configFilePath: Path? = null
- fun processFiles(config: Config,
- filesToProcess: Set<File>,
- logger: Logger,
- outputDir: File): TransformationResult {
+ fun processFiles(
+ config: Config,
+ filesToProcess: Set<File>,
+ logger: Logger,
+ outputDir: File
+ ): Set<File> {
outputDir.mkdirs()
logger.log(LogLevel.DEBUG, "Jetifier will now process the following files:")
@@ -46,7 +47,11 @@
Log.logConsumer = JetifierLoggerAdapter(logger)
val processor = Processor.createProcessor(config)
- return processor.transform(filesToProcess, outputDir.toPath(), true)
+ return processor.transform(
+ filesToProcess,
+ outputDir.toPath(),
+ outputIsDir = true,
+ copyUnmodifiedLibsAlso = false)
}
fun shouldSkipArtifact(artifactId: String, groupId: String?, config: Config): Boolean {
diff --git a/leanback/build.gradle b/leanback/build.gradle
index d1d45e3..36ba9e2 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -37,6 +37,5 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2014"
description = "Android Support Leanback v17"
- legacySourceLocation = true
minSdkVersion = 17
}
diff --git a/leanback/tests/AndroidManifest.xml b/leanback/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from leanback/tests/AndroidManifest.xml
rename to leanback/src/androidTest/AndroidManifest.xml
diff --git a/leanback/tests/generatev4.py b/leanback/src/androidTest/generatev4.py
similarity index 100%
rename from leanback/tests/generatev4.py
rename to leanback/src/androidTest/generatev4.py
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BackgroundManagerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BackgroundManagerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BackgroundManagerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BackgroundManagerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PhotoItem.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PhotoItem.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PhotoItem.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PhotoItem.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/RowsFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/RowsFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/StringPresenter.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/StringPresenter.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/TestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/TestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/TestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/TestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VideoFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VideoFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/testutils/PollingCheck.java b/leanback/src/androidTest/java/android/support/v17/leanback/testutils/PollingCheck.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/testutils/PollingCheck.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/testutils/PollingCheck.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/AssertHelper.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/AssertHelper.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/BaseCardViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/BaseCardViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/BaseCardViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/BaseCardViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ControlBarTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ControlBarTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ControlBarTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ControlBarTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ImageCardViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ImageCardViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ImageCardViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ImageCardViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ListRowPresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ObjectAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/SingleRowTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/SingleRowTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ThumbsBarTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ThumbsBarTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ThumbsBarTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ThumbsBarTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
diff --git a/leanback/tests/res/drawable/ic_action_a.png b/leanback/src/androidTest/res/drawable/ic_action_a.png
similarity index 100%
rename from leanback/tests/res/drawable/ic_action_a.png
rename to leanback/src/androidTest/res/drawable/ic_action_a.png
Binary files differ
diff --git a/leanback/tests/res/drawable/spiderman.jpg b/leanback/src/androidTest/res/drawable/spiderman.jpg
similarity index 100%
rename from leanback/tests/res/drawable/spiderman.jpg
rename to leanback/src/androidTest/res/drawable/spiderman.jpg
Binary files differ
diff --git a/leanback/tests/res/layout/browse.xml b/leanback/src/androidTest/res/layout/browse.xml
similarity index 100%
rename from leanback/tests/res/layout/browse.xml
rename to leanback/src/androidTest/res/layout/browse.xml
diff --git a/leanback/tests/res/layout/datepicker_alone.xml b/leanback/src/androidTest/res/layout/datepicker_alone.xml
similarity index 100%
rename from leanback/tests/res/layout/datepicker_alone.xml
rename to leanback/src/androidTest/res/layout/datepicker_alone.xml
diff --git a/leanback/tests/res/layout/datepicker_with_other_widgets.xml b/leanback/src/androidTest/res/layout/datepicker_with_other_widgets.xml
similarity index 100%
rename from leanback/tests/res/layout/datepicker_with_other_widgets.xml
rename to leanback/src/androidTest/res/layout/datepicker_with_other_widgets.xml
diff --git a/leanback/tests/res/layout/details.xml b/leanback/src/androidTest/res/layout/details.xml
similarity index 100%
rename from leanback/tests/res/layout/details.xml
rename to leanback/src/androidTest/res/layout/details.xml
diff --git a/leanback/tests/res/layout/horizontal_grid.xml b/leanback/src/androidTest/res/layout/horizontal_grid.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid.xml
diff --git a/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml b/leanback/src/androidTest/res/layout/horizontal_grid_testredundantappendremove2.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid_testredundantappendremove2.xml
diff --git a/leanback/tests/res/layout/horizontal_grid_wrap.xml b/leanback/src/androidTest/res/layout/horizontal_grid_wrap.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid_wrap.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid_wrap.xml
diff --git a/leanback/tests/res/layout/horizontal_item.xml b/leanback/src/androidTest/res/layout/horizontal_item.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_item.xml
rename to leanback/src/androidTest/res/layout/horizontal_item.xml
diff --git a/leanback/tests/res/layout/horizontal_linear.xml b/leanback/src/androidTest/res/layout/horizontal_linear.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear.xml
diff --git a/leanback/tests/res/layout/horizontal_linear_rtl.xml b/leanback/src/androidTest/res/layout/horizontal_linear_rtl.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear_rtl.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear_rtl.xml
diff --git a/leanback/tests/res/layout/horizontal_linear_wrap_content.xml b/leanback/src/androidTest/res/layout/horizontal_linear_wrap_content.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear_wrap_content.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear_wrap_content.xml
diff --git a/leanback/tests/res/layout/item_button_at_bottom.xml b/leanback/src/androidTest/res/layout/item_button_at_bottom.xml
similarity index 100%
rename from leanback/tests/res/layout/item_button_at_bottom.xml
rename to leanback/src/androidTest/res/layout/item_button_at_bottom.xml
diff --git a/leanback/tests/res/layout/item_button_at_top.xml b/leanback/src/androidTest/res/layout/item_button_at_top.xml
similarity index 100%
rename from leanback/tests/res/layout/item_button_at_top.xml
rename to leanback/src/androidTest/res/layout/item_button_at_top.xml
diff --git a/leanback/tests/res/layout/page_fragment.xml b/leanback/src/androidTest/res/layout/page_fragment.xml
similarity index 100%
rename from leanback/tests/res/layout/page_fragment.xml
rename to leanback/src/androidTest/res/layout/page_fragment.xml
diff --git a/leanback/tests/res/layout/playback_controls_with_video.xml b/leanback/src/androidTest/res/layout/playback_controls_with_video.xml
similarity index 100%
rename from leanback/tests/res/layout/playback_controls_with_video.xml
rename to leanback/src/androidTest/res/layout/playback_controls_with_video.xml
diff --git a/leanback/tests/res/layout/relative_layout.xml b/leanback/src/androidTest/res/layout/relative_layout.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout.xml
rename to leanback/src/androidTest/res/layout/relative_layout.xml
diff --git a/leanback/tests/res/layout/relative_layout2.xml b/leanback/src/androidTest/res/layout/relative_layout2.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout2.xml
rename to leanback/src/androidTest/res/layout/relative_layout2.xml
diff --git a/leanback/tests/res/layout/relative_layout3.xml b/leanback/src/androidTest/res/layout/relative_layout3.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout3.xml
rename to leanback/src/androidTest/res/layout/relative_layout3.xml
diff --git a/leanback/tests/res/layout/selectable_text_view.xml b/leanback/src/androidTest/res/layout/selectable_text_view.xml
similarity index 100%
rename from leanback/tests/res/layout/selectable_text_view.xml
rename to leanback/src/androidTest/res/layout/selectable_text_view.xml
diff --git a/leanback/tests/res/layout/single_fragment.xml b/leanback/src/androidTest/res/layout/single_fragment.xml
similarity index 100%
rename from leanback/tests/res/layout/single_fragment.xml
rename to leanback/src/androidTest/res/layout/single_fragment.xml
diff --git a/leanback/tests/res/layout/timepicker_alone.xml b/leanback/src/androidTest/res/layout/timepicker_alone.xml
similarity index 100%
rename from leanback/tests/res/layout/timepicker_alone.xml
rename to leanback/src/androidTest/res/layout/timepicker_alone.xml
diff --git a/leanback/tests/res/layout/timepicker_with_other_widgets.xml b/leanback/src/androidTest/res/layout/timepicker_with_other_widgets.xml
similarity index 100%
rename from leanback/tests/res/layout/timepicker_with_other_widgets.xml
rename to leanback/src/androidTest/res/layout/timepicker_with_other_widgets.xml
diff --git a/leanback/tests/res/layout/vertical_grid.xml b/leanback/src/androidTest/res/layout/vertical_grid.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid.xml
rename to leanback/src/androidTest/res/layout/vertical_grid.xml
diff --git a/leanback/tests/res/layout/vertical_grid_ltr.xml b/leanback/src/androidTest/res/layout/vertical_grid_ltr.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_ltr.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_ltr.xml
diff --git a/leanback/tests/res/layout/vertical_grid_rtl.xml b/leanback/src/androidTest/res/layout/vertical_grid_rtl.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_rtl.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_rtl.xml
diff --git a/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml b/leanback/src/androidTest/res/layout/vertical_grid_testredundantappendremove.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_testredundantappendremove.xml
diff --git a/leanback/tests/res/layout/vertical_linear.xml b/leanback/src/androidTest/res/layout/vertical_linear.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear.xml
rename to leanback/src/androidTest/res/layout/vertical_linear.xml
diff --git a/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml b/leanback/src/androidTest/res/layout/vertical_linear_measured_with_zero.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_measured_with_zero.xml
diff --git a/leanback/tests/res/layout/vertical_linear_with_button.xml b/leanback/src/androidTest/res/layout/vertical_linear_with_button.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_with_button.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_with_button.xml
diff --git a/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml b/leanback/src/androidTest/res/layout/vertical_linear_with_button_onleft.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_with_button_onleft.xml
diff --git a/leanback/tests/res/layout/vertical_linear_wrap_content.xml b/leanback/src/androidTest/res/layout/vertical_linear_wrap_content.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_wrap_content.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_wrap_content.xml
diff --git a/leanback/tests/res/layout/video_fragment_with_controls.xml b/leanback/src/androidTest/res/layout/video_fragment_with_controls.xml
similarity index 100%
rename from leanback/tests/res/layout/video_fragment_with_controls.xml
rename to leanback/src/androidTest/res/layout/video_fragment_with_controls.xml
diff --git a/leanback/tests/res/raw/track_01.mp3 b/leanback/src/androidTest/res/raw/track_01.mp3
similarity index 100%
rename from leanback/tests/res/raw/track_01.mp3
rename to leanback/src/androidTest/res/raw/track_01.mp3
Binary files differ
diff --git a/leanback/tests/res/raw/video.mp4 b/leanback/src/androidTest/res/raw/video.mp4
similarity index 100%
rename from leanback/tests/res/raw/video.mp4
rename to leanback/src/androidTest/res/raw/video.mp4
Binary files differ
diff --git a/leanback/tests/res/values/strings.xml b/leanback/src/androidTest/res/values/strings.xml
similarity index 100%
rename from leanback/tests/res/values/strings.xml
rename to leanback/src/androidTest/res/values/strings.xml
diff --git a/leanback/tests/NO_DOCS b/leanback/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/leanback/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/localbroadcastmanager/api/current.txt b/localbroadcastmanager/api/current.txt
new file mode 100644
index 0000000..5c02abe
--- /dev/null
+++ b/localbroadcastmanager/api/current.txt
@@ -0,0 +1,12 @@
+package android.support.v4.content {
+
+ public final class LocalBroadcastManager {
+ method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
+ method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public boolean sendBroadcast(android.content.Intent);
+ method public void sendBroadcastSync(android.content.Intent);
+ method public void unregisterReceiver(android.content.BroadcastReceiver);
+ }
+
+}
+
diff --git a/localbroadcastmanager/build.gradle b/localbroadcastmanager/build.gradle
new file mode 100644
index 0000000..a3d35bf
--- /dev/null
+++ b/localbroadcastmanager/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+}
+
+supportLibrary {
+ name = "Android Support Library Local Broadcast Manager"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/localbroadcastmanager/src/main/AndroidManifest.xml b/localbroadcastmanager/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..611729b
--- /dev/null
+++ b/localbroadcastmanager/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.localbroadcastmanager"/>
diff --git a/core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java b/localbroadcastmanager/src/main/java/android/support/v4/content/LocalBroadcastManager.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java
rename to localbroadcastmanager/src/main/java/android/support/v4/content/LocalBroadcastManager.java
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index ad782e7..29c91b7 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -26,7 +26,6 @@
'api24',
'api26',
]
- main.aidl.srcDirs = ['src/main/java']
main.res.srcDirs += 'src/main/res-public'
}
@@ -42,5 +41,4 @@
mavenGroup = LibraryGroups.SUPPORT
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 14 or later."
- legacySourceLocation = true
}
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/RatingCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/RatingCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/IMediaControllerCallback.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/IMediaControllerCallback.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/IMediaSession.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/IMediaSession.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
diff --git a/media-compat/tests/NO_DOCS b/media-compat/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/media-compat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/current/client/build.gradle b/media-compat/version-compat-tests/current/client/build.gradle
index 9c4f879..2a247df 100644
--- a/media-compat/version-compat-tests/current/client/build.gradle
+++ b/media-compat/version-compat-tests/current/client/build.gradle
@@ -26,7 +26,3 @@
androidTestImplementation(TEST_RUNNER)
}
-
-supportLibrary {
- legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/media-compat/version-compat-tests/current/client/tests/AndroidManifest.xml b/media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaItemTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaItemTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/NO_DOCS b/media-compat/version-compat-tests/current/client/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/media-compat/version-compat-tests/current/client/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/current/service/build.gradle b/media-compat/version-compat-tests/current/service/build.gradle
index 3cb3a49..2a247df 100644
--- a/media-compat/version-compat-tests/current/service/build.gradle
+++ b/media-compat/version-compat-tests/current/service/build.gradle
@@ -26,7 +26,3 @@
androidTestImplementation(TEST_RUNNER)
}
-
-supportLibrary {
- legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/current/service/tests/AndroidManifest.xml b/media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/service/tests/NO_DOCS b/media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/NO_DOCS
rename to media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/media-compat/version-compat-tests/lib/build.gradle b/media-compat/version-compat-tests/lib/build.gradle
index db9f2ae..caa6c7e 100644
--- a/media-compat/version-compat-tests/lib/build.gradle
+++ b/media-compat/version-compat-tests/lib/build.gradle
@@ -23,7 +23,3 @@
dependencies {
implementation(JUNIT)
}
-
-supportLibrary {
- legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/previous/client/build.gradle b/media-compat/version-compat-tests/previous/client/build.gradle
index 2788a1a..31f33fe 100644
--- a/media-compat/version-compat-tests/previous/client/build.gradle
+++ b/media-compat/version-compat-tests/previous/client/build.gradle
@@ -26,13 +26,3 @@
androidTestImplementation(TEST_RUNNER)
}
-
-android {
- defaultConfig {
- minSdkVersion 14
- }
-}
-
-supportLibrary {
- legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/media-compat/version-compat-tests/previous/client/tests/AndroidManifest.xml b/media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaItemTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaItemTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/NO_DOCS b/media-compat/version-compat-tests/previous/client/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/media-compat/version-compat-tests/previous/client/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/previous/service/build.gradle b/media-compat/version-compat-tests/previous/service/build.gradle
index 469f6e4..765e406 100644
--- a/media-compat/version-compat-tests/previous/service/build.gradle
+++ b/media-compat/version-compat-tests/previous/service/build.gradle
@@ -21,18 +21,8 @@
}
dependencies {
- androidTestImplementation project(':support-media-compat-test-lib')
+ androidTestImplementation(project(":support-media-compat-test-lib"))
androidTestImplementation "com.android.support:support-media-compat:27.0.1"
androidTestImplementation(TEST_RUNNER)
}
-
-android {
- defaultConfig {
- minSdkVersion 14
- }
-}
-
-supportLibrary {
- legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/previous/service/tests/AndroidManifest.xml b/media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/service/tests/NO_DOCS b/media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/NO_DOCS
rename to media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index b26ca78..d1b0aec 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -30,8 +30,8 @@
implementation(project(":lifecycle:common"))
implementation(project(":paging:runtime"))
implementation(MULTIDEX)
- implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
- implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+ implementation(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
+ implementation(SUPPORT_APPCOMPAT_27, libs.support_exclude_config)
}
tasks['check'].dependsOn(tasks['connectedCheck'])
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
index 70f2133..94d25a8 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
@@ -17,7 +17,7 @@
package android.arch.paging.integration.testapp;
import android.support.annotation.NonNull;
-import android.support.v7.recyclerview.extensions.DiffCallback;
+import android.support.v7.util.DiffUtil;
/**
* Sample item.
@@ -45,7 +45,7 @@
&& this.text.equals(item.text);
}
- static final DiffCallback<Item> DIFF_CALLBACK = new DiffCallback<Item>() {
+ static final DiffUtil.ItemCallback<Item> DIFF_CALLBACK = new DiffUtil.ItemCallback<Item>() {
@Override
public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
return oldItem.equals(newItem);
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
index d1ae5ab..9432124 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
@@ -23,7 +23,7 @@
import android.widget.TextView;
/**
- * Sample PagedList item Adapter, which uses a PagedListAdapterHelper.
+ * Sample PagedList item Adapter, which uses a AsyncPagedListDiffer.
*/
class PagedListItemAdapter extends PagedListAdapter<Item, RecyclerView.ViewHolder> {
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
index f1f233f..f031cdb 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
@@ -44,7 +44,7 @@
viewModel.getLivePagedList().observe(this, new Observer<PagedList<Item>>() {
@Override
public void onChanged(@Nullable PagedList<Item> items) {
- adapter.setList(items);
+ adapter.submitList(items);
}
});
final Button button = findViewById(R.id.button);
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 7e9d73c..4c42b30 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -30,7 +30,7 @@
api(project(":lifecycle:runtime"))
api(project(":lifecycle:livedata"))
- api(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
+ api(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
androidTestImplementation(JUNIT)
androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
@@ -48,4 +48,4 @@
inceptionYear = "2017"
description = "Android Paging-Runtime"
url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
similarity index 87%
rename from paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
rename to paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
index d50b8d9..4817c6c 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
@@ -17,8 +17,8 @@
package android.arch.paging
import android.support.test.filters.SmallTest
-import android.support.v7.recyclerview.extensions.DiffCallback
-import android.support.v7.recyclerview.extensions.ListAdapterConfig
+import android.support.v7.recyclerview.extensions.AsyncDifferConfig
+import android.support.v7.util.DiffUtil
import android.support.v7.util.ListUpdateCallback
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@@ -36,16 +36,15 @@
@SmallTest
@RunWith(JUnit4::class)
-class PagedListAdapterHelperTest {
+class AsyncPagedListDifferTest {
private val mMainThread = TestExecutor()
private val mDiffThread = TestExecutor()
private val mPageLoadingThread = TestExecutor()
private fun <T> createHelper(listUpdateCallback: ListUpdateCallback,
- diffCallback: DiffCallback<T>): PagedListAdapterHelper<T> {
- return PagedListAdapterHelper(listUpdateCallback,
- ListAdapterConfig.Builder<T>()
- .setDiffCallback(diffCallback)
+ diffCallback: DiffUtil.ItemCallback<T>): AsyncPagedListDiffer<T> {
+ return AsyncPagedListDiffer(listUpdateCallback,
+ AsyncDifferConfig.Builder<T>(diffCallback)
.setMainThreadExecutor(mMainThread)
.setBackgroundThreadExecutor(mDiffThread)
.build())
@@ -73,7 +72,7 @@
fun setFullList() {
val callback = mock(ListUpdateCallback::class.java)
val helper = createHelper(callback, STRING_DIFF_CALLBACK)
- helper.setList(StringPagedList(0, 0, "a", "b"))
+ helper.submitList(StringPagedList(0, 0, "a", "b"))
assertEquals(2, helper.itemCount)
assertEquals("a", helper.getItem(0))
@@ -94,14 +93,14 @@
@Test(expected = IndexOutOfBoundsException::class)
fun getNegative() {
val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
- helper.setList(StringPagedList(0, 0, "a", "b"))
+ helper.submitList(StringPagedList(0, 0, "a", "b"))
helper.getItem(-1)
}
@Test(expected = IndexOutOfBoundsException::class)
fun getPastEnd() {
val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
- helper.setList(StringPagedList(0, 0, "a", "b"))
+ helper.submitList(StringPagedList(0, 0, "a", "b"))
helper.getItem(2)
}
@@ -112,7 +111,7 @@
assertEquals(0, helper.itemCount)
- helper.setList(StringPagedList(2, 2, "a", "b"))
+ helper.submitList(StringPagedList(2, 2, "a", "b"))
verify(callback).onInserted(0, 6)
verifyNoMoreInteractions(callback)
@@ -137,7 +136,7 @@
val callback = mock(ListUpdateCallback::class.java)
val helper = createHelper(callback, STRING_DIFF_CALLBACK)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
verify(callback).onInserted(0, ALPHABET_LIST.size)
verifyNoMoreInteractions(callback)
drain()
@@ -166,7 +165,7 @@
verifyNoMoreInteractions(callback)
// finally, clear
- helper.setList(null)
+ helper.submitList(null)
verify(callback).onRemoved(0, 26)
drain()
verifyNoMoreInteractions(callback)
@@ -183,7 +182,7 @@
val helper = createHelper(callback, STRING_DIFF_CALLBACK)
// initial list missing one item (immediate)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0))
verify(callback).onInserted(0, 25)
verifyNoMoreInteractions(callback)
assertEquals(helper.itemCount, 25)
@@ -191,7 +190,7 @@
verifyNoMoreInteractions(callback)
// pass second list with full data
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0))
verifyNoMoreInteractions(callback)
drain()
verify(callback).onInserted(25, 1)
@@ -199,7 +198,7 @@
assertEquals(helper.itemCount, 26)
// finally, clear (immediate)
- helper.setList(null)
+ helper.submitList(null)
verify(callback).onRemoved(0, 26)
verifyNoMoreInteractions(callback)
drain()
@@ -217,7 +216,7 @@
val callback = mock(ListUpdateCallback::class.java)
val helper = createHelper(callback, STRING_DIFF_CALLBACK)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
verify(callback).onInserted(0, ALPHABET_LIST.size)
verifyNoMoreInteractions(callback)
drain()
@@ -227,7 +226,7 @@
// trigger page loading
helper.getItem(10)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
verifyNoMoreInteractions(callback)
// drain page fetching, but list became immutable, page will be ignored
@@ -249,7 +248,7 @@
val expectedCount = intArrayOf(0)
// provides access to helper, which must be constructed after callback
- val helperAccessor = arrayOf<PagedListAdapterHelper<*>?>(null)
+ val helperAccessor = arrayOf<AsyncPagedListDiffer<*>?>(null)
val callback = object : ListUpdateCallback {
override fun onInserted(position: Int, count: Int) {
@@ -279,20 +278,20 @@
// in the fast-add case...
expectedCount[0] = 5
assertEquals(0, helper.itemCount)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 5), 0))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 5), 0))
assertEquals(5, helper.itemCount)
// in the slow, diff on BG thread case...
expectedCount[0] = 10
assertEquals(5, helper.itemCount)
- helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 10), 0))
+ helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 10), 0))
drain()
assertEquals(10, helper.itemCount)
// and in the fast-remove case
expectedCount[0] = 0
assertEquals(10, helper.itemCount)
- helper.setList(null)
+ helper.submitList(null)
assertEquals(0, helper.itemCount)
}
@@ -316,7 +315,7 @@
companion object {
private val ALPHABET_LIST = List(26) { "" + 'a' + it }
- private val STRING_DIFF_CALLBACK = object : DiffCallback<String>() {
+ private val STRING_DIFF_CALLBACK = object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
return oldItem == newItem
}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
index 44a98e9..8b885f2 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
@@ -17,7 +17,7 @@
package android.arch.paging
import android.support.test.filters.SmallTest
-import android.support.v7.recyclerview.extensions.DiffCallback
+import android.support.v7.util.DiffUtil
import android.support.v7.util.ListUpdateCallback
import org.junit.Assert.assertEquals
import org.junit.Test
@@ -97,7 +97,7 @@
}
companion object {
- private val DIFF_CALLBACK = object : DiffCallback<String>() {
+ private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
// first char means same item
return oldItem[0] == newItem[0]
@@ -111,8 +111,7 @@
private fun validateTwoListDiff(oldList: PagedStorage<String>,
newList: PagedStorage<String>,
validator: (callback: ListUpdateCallback) -> Unit) {
- val diffResult = PagedStorageDiffHelper.computeDiff(
- oldList, newList, DIFF_CALLBACK)
+ val diffResult = PagedStorageDiffHelper.computeDiff(oldList, newList, DIFF_CALLBACK)
val listUpdateCallback = mock(ListUpdateCallback::class.java)
PagedStorageDiffHelper.dispatchDiff(listUpdateCallback, oldList, newList, diffResult)
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java b/paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
similarity index 86%
rename from paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
rename to paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
index ba8ffab..f01bc5c 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
@@ -17,10 +17,10 @@
package android.arch.paging;
import android.arch.lifecycle.LiveData;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.recyclerview.extensions.ListAdapterConfig;
-import android.support.v7.recyclerview.extensions.ListAdapterHelper;
+import android.support.v7.recyclerview.extensions.AsyncDifferConfig;
+import android.support.v7.util.AdapterListUpdateCallback;
import android.support.v7.util.DiffUtil;
import android.support.v7.util.ListUpdateCallback;
import android.support.v7.widget.RecyclerView;
@@ -36,7 +36,7 @@
* Both the internal paging of the list as more data is loaded, and updates in the form of new
* PagedLists.
* <p>
- * The PagedListAdapterHelper can be bound to a {@link LiveData} of PagedList and present the data
+ * The AsyncPagedListDiffer can be bound to a {@link LiveData} of PagedList and present the data
* simply for an adapter. It listens to PagedList loading callbacks, and uses DiffUtil on a
* background thread to compute updates as new PagedLists are received.
* <p>
@@ -66,28 +66,28 @@
* MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
* RecyclerView recyclerView = findViewById(R.id.user_list);
* final UserAdapter<User> adapter = new UserAdapter();
- * viewModel.usersList.observe(this, pagedList -> adapter.setList(pagedList));
+ * viewModel.usersList.observe(this, pagedList -> adapter.submitList(pagedList));
* recyclerView.setAdapter(adapter);
* }
* }
*
* class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {
- * private final PagedListAdapterHelper<User> mHelper
- * = new PagedListAdapterHelper(this, DIFF_CALLBACK);
+ * private final AsyncPagedListDiffer<User> mDiffer
+ * = new AsyncPagedListDiffer(this, DIFF_CALLBACK);
* {@literal @}Override
* public int getItemCount() {
- * return mHelper.getItemCount();
+ * return mDiffer.getItemCount();
* }
- * public void setList(PagedList<User> pagedList) {
- * mHelper.setList(pagedList);
+ * public void submitList(PagedList<User> pagedList) {
+ * mDiffer.submitList(pagedList);
* }
* {@literal @}Override
* public void onBindViewHolder(UserViewHolder holder, int position) {
- * User user = mHelper.getItem(position);
+ * User user = mDiffer.getItem(position);
* if (user != null) {
* holder.bindTo(user);
* } else {
- * // Null defines a placeholder item - PagedListAdapterHelper will automatically
+ * // Null defines a placeholder item - AsyncPagedListDiffer will automatically
* // invalidate this row when the actual object is loaded from the database
* holder.clear();
* }
@@ -111,11 +111,11 @@
*
* @param <T> Type of the PagedLists this helper will receive.
*/
-public class PagedListAdapterHelper<T> {
+public class AsyncPagedListDiffer<T> {
// updateCallback notifications must only be notified *after* new data and item count are stored
// this ensures Adapter#notifyItemRangeInserted etc are accessing the new data
private final ListUpdateCallback mUpdateCallback;
- private final ListAdapterConfig<T> mConfig;
+ private final AsyncDifferConfig<T> mConfig;
// TODO: REAL API
interface PagedListListener<T> {
@@ -134,21 +134,23 @@
private int mMaxScheduledGeneration;
/**
- * Convenience for {@code PagedListAdapterHelper(new ListAdapterHelper.AdapterCallback(adapter),
- * new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build());
+ * Convenience for {@code AsyncPagedListDiffer(new AdapterListUpdateCallback(adapter),
+ * new AsyncDifferConfig.Builder<T>(diffCallback).build();}
*
* @param adapter Adapter that will receive update signals.
- * @param diffCallback The {@link DiffCallback } instance to compare items in the list.
+ * @param diffCallback The {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} instance to
+ * compare items in the list.
*/
@SuppressWarnings("WeakerAccess")
- public PagedListAdapterHelper(RecyclerView.Adapter adapter, DiffCallback<T> diffCallback) {
- mUpdateCallback = new ListAdapterHelper.AdapterCallback(adapter);
- mConfig = new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build();
+ public AsyncPagedListDiffer(@NonNull RecyclerView.Adapter adapter,
+ @NonNull DiffUtil.ItemCallback<T> diffCallback) {
+ mUpdateCallback = new AdapterListUpdateCallback(adapter);
+ mConfig = new AsyncDifferConfig.Builder<T>(diffCallback).build();
}
@SuppressWarnings("WeakerAccess")
- public PagedListAdapterHelper(ListUpdateCallback listUpdateCallback,
- ListAdapterConfig<T> config) {
+ public AsyncPagedListDiffer(@NonNull ListUpdateCallback listUpdateCallback,
+ @NonNull AsyncDifferConfig<T> config) {
mUpdateCallback = listUpdateCallback;
mConfig = config;
}
@@ -219,7 +221,7 @@
*
* @param pagedList The new PagedList.
*/
- public void setList(final PagedList<T> pagedList) {
+ public void submitList(final PagedList<T> pagedList) {
if (pagedList != null) {
if (mPagedList == null && mSnapshot == null) {
mIsContiguous = pagedList.isContiguous();
@@ -285,6 +287,7 @@
final PagedList<T> newSnapshot = (PagedList<T>) pagedList.snapshot();
mConfig.getBackgroundThreadExecutor().execute(new Runnable() {
@Override
+ @SuppressWarnings("RestrictedApi")
public void run() {
final DiffUtil.DiffResult result;
result = PagedStorageDiffHelper.computeDiff(
@@ -328,9 +331,9 @@
/**
* Returns the list currently being displayed by the AdapterHelper.
* <p>
- * This is not necessarily the most recent list passed to {@link #setList(PagedList)}, because a
- * diff is computed asynchronously between the new list and the current list before updating the
- * currentList value.
+ * This is not necessarily the most recent list passed to {@link #submitList(PagedList)},
+ * because a diff is computed asynchronously between the new list and the current list before
+ * updating the currentList value.
*
* @return The list currently being displayed.
*/
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
index be23271..0470da1 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
@@ -18,20 +18,20 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.recyclerview.extensions.ListAdapterConfig;
-import android.support.v7.recyclerview.extensions.ListAdapterHelper;
+import android.support.v7.recyclerview.extensions.AsyncDifferConfig;
+import android.support.v7.util.AdapterListUpdateCallback;
+import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
/**
* {@link RecyclerView.Adapter RecyclerView.Adapter} base class for presenting paged data from
* {@link PagedList}s in a {@link RecyclerView}.
* <p>
- * This class is a convenience wrapper around PagedListAdapterHelper that implements common default
+ * This class is a convenience wrapper around AsyncPagedListDiffer that implements common default
* behavior for item counting, and listening to PagedList update callbacks.
* <p>
* While using a LiveData<PagedList> is an easy way to provide data to the adapter, it isn't
- * required - you can use {@link #setList(PagedList)} when new lists are available.
+ * required - you can use {@link #submitList(PagedList)} when new lists are available.
* <p>
* PagedListAdapter listens to PagedList loading callbacks as pages are loaded, and uses DiffUtil on
* a background thread to compute fine grained updates as new PagedLists are received.
@@ -62,7 +62,7 @@
* MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
* RecyclerView recyclerView = findViewById(R.id.user_list);
* UserAdapter<User> adapter = new UserAdapter();
- * viewModel.usersList.observe(this, pagedList -> adapter.setList(pagedList));
+ * viewModel.usersList.observe(this, pagedList -> adapter.submitList(pagedList));
* recyclerView.setAdapter(adapter);
* }
* }
@@ -100,7 +100,7 @@
* }</pre>
*
* Advanced users that wish for more control over adapter behavior, or to provide a specific base
- * class should refer to {@link PagedListAdapterHelper}, which provides the mapping from paging
+ * class should refer to {@link AsyncPagedListDiffer}, which provides the mapping from paging
* events to adapter-friendly callbacks.
*
* @param <T> Type of the PagedLists this helper will receive.
@@ -108,9 +108,9 @@
*/
public abstract class PagedListAdapter<T, VH extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<VH> {
- private final PagedListAdapterHelper<T> mHelper;
- private final PagedListAdapterHelper.PagedListListener<T> mListener =
- new PagedListAdapterHelper.PagedListListener<T>() {
+ private final AsyncPagedListDiffer<T> mHelper;
+ private final AsyncPagedListDiffer.PagedListListener<T> mListener =
+ new AsyncPagedListDiffer.PagedListListener<T>() {
@Override
public void onCurrentListChanged(@Nullable PagedList<T> currentList) {
PagedListAdapter.this.onCurrentListChanged(currentList);
@@ -121,19 +121,20 @@
* Creates a PagedListAdapter with default threading and
* {@link android.support.v7.util.ListUpdateCallback}.
*
- * Convenience for {@link #PagedListAdapter(ListAdapterConfig)}, which uses default threading
+ * Convenience for {@link #PagedListAdapter(AsyncDifferConfig)}, which uses default threading
* behavior.
*
- * @param diffCallback The {@link DiffCallback} instance to compare items in the list.
+ * @param diffCallback The {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} instance to
+ * compare items in the list.
*/
- protected PagedListAdapter(@NonNull DiffCallback<T> diffCallback) {
- mHelper = new PagedListAdapterHelper<>(this, diffCallback);
+ protected PagedListAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback) {
+ mHelper = new AsyncPagedListDiffer<>(this, diffCallback);
mHelper.mListener = mListener;
}
@SuppressWarnings("unused, WeakerAccess")
- protected PagedListAdapter(@NonNull ListAdapterConfig<T> config) {
- mHelper = new PagedListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this), config);
+ protected PagedListAdapter(@NonNull AsyncDifferConfig<T> config) {
+ mHelper = new AsyncPagedListDiffer<>(new AdapterListUpdateCallback(this), config);
mHelper.mListener = mListener;
}
@@ -145,8 +146,8 @@
*
* @param pagedList The new list to be displayed.
*/
- public void setList(PagedList<T> pagedList) {
- mHelper.setList(pagedList);
+ public void submitList(PagedList<T> pagedList) {
+ mHelper.submitList(pagedList);
}
@Nullable
@@ -162,9 +163,9 @@
/**
* Returns the list currently being displayed by the Adapter.
* <p>
- * This is not necessarily the most recent list passed to {@link #setList(PagedList)}, because a
- * diff is computed asynchronously between the new list and the current list before updating the
- * currentList value.
+ * This is not necessarily the most recent list passed to {@link #submitList(PagedList)},
+ * because a diff is computed asynchronously between the new list and the current list before
+ * updating the currentList value.
*
* @return The list currently being displayed.
*/
@@ -176,7 +177,7 @@
/**
* Called when the current PagedList is updated.
* <p>
- * This may be dispatched as part of {@link #setList(PagedList)} if a background diff isn't
+ * This may be dispatched as part of {@link #submitList(PagedList)} if a background diff isn't
* needed (such as when the first list is passed, or the list is cleared). In either case,
* PagedListAdapter will simply call
* {@link #notifyItemRangeInserted(int, int) notifyItemRangeInserted/Removed(0, mPreviousSize)}.
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
index d991b72..f495608 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
@@ -17,7 +17,6 @@
package android.arch.paging;
import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
import android.support.v7.util.DiffUtil;
import android.support.v7.util.ListUpdateCallback;
@@ -28,7 +27,7 @@
static <T> DiffUtil.DiffResult computeDiff(
final PagedStorage<T> oldList,
final PagedStorage<T> newList,
- final DiffCallback<T> diffCallback) {
+ final DiffUtil.ItemCallback<T> diffCallback) {
final int oldOffset = oldList.computeLeadingNulls();
final int newOffset = newList.computeLeadingNulls();
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
index 70fc049..2083a5f 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
@@ -16,50 +16,21 @@
package android.support.v7.recyclerview.extensions;
-import android.arch.paging.PagedListAdapterHelper;
-import android.support.annotation.NonNull;
+import android.arch.paging.AsyncPagedListDiffer;
+import android.support.v7.util.DiffUtil;
/**
- * Callback that informs {@link PagedListAdapterHelper} how to compute list updates when using
+ * Callback that informs {@link AsyncPagedListDiffer} how to compute list updates when using
* {@link android.support.v7.util.DiffUtil} on a background thread.
* <p>
* The AdapterHelper will pass items from different lists to this callback in order to implement
* the {@link android.support.v7.util.DiffUtil.Callback} it uses to compute differences between
* lists.
- * <p>
- * Note that this class is likely to move prior to the final release of the Paging library.
*
* @param <T> Type of items to compare.
+ *
+ * @deprecated use {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} directly starting in 27.1.0
*/
-public abstract class DiffCallback<T> {
- /**
- * Called to decide whether two objects represent the same item.
- *
- * @param oldItem The item in the old list.
- * @param newItem The item in the new list.
- * @return True if the two items represent the same object or false if they are different.
- * @see android.support.v7.util.DiffUtil.Callback#areItemsTheSame(int, int)
- */
- public abstract boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem);
-
- /**
- * Called to decide whether two items have the same data. This information is used to detect if
- * the contents of an item have changed.
- *
- * @param oldItem The item in the old list.
- * @param newItem The item in the new list.
- * @return True if the contents of the items are the same or false if they are different.
- * @see android.support.v7.util.DiffUtil.Callback#areContentsTheSame(int, int)
- */
- public abstract boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem);
-
- /**
- * Called to get a change payload between an old and new version of an item.
- *
- * @see android.support.v7.util.DiffUtil.Callback#getChangePayload(int, int)
- */
- @SuppressWarnings("WeakerAccess")
- public Object getChangePayload(@NonNull T oldItem, @NonNull T newItem) {
- return null;
- }
+@Deprecated
+public abstract class DiffCallback<T> extends DiffUtil.ItemCallback<T> {
}
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java
deleted file mode 100644
index 8b28072..0000000
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v7.recyclerview.extensions;
-
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
-
-import java.util.List;
-
-/**
- * {@link RecyclerView.Adapter RecyclerView.Adapter} base class for presenting List data in a
- * {@link RecyclerView}, including computing diffs between Lists on a background thread.
- * <p>
- * This class is a convenience wrapper around ListAdapterHelper that implements common default
- * behavior for item access and counting.
- * <p>
- * While using a LiveData<List> is an easy way to provide data to the adapter, it isn't required
- * - you can use {@link #setList(List)} when new lists are available.
- * <p>
- * A complete usage pattern with Room would look like this:
- * <pre>
- * {@literal @}Dao
- * interface UserDao {
- * {@literal @}Query("SELECT * FROM user ORDER BY lastName ASC")
- * public abstract LiveData<List<User>> usersByLastName();
- * }
- *
- * class MyViewModel extends ViewModel {
- * public final LiveData<List<User>> usersList;
- * public MyViewModel(UserDao userDao) {
- * usersList = userDao.usersByLastName();
- * }
- * }
- *
- * class MyActivity extends AppCompatActivity {
- * {@literal @}Override
- * public void onCreate(Bundle savedState) {
- * super.onCreate(savedState);
- * MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
- * RecyclerView recyclerView = findViewById(R.id.user_list);
- * UserAdapter<User> adapter = new UserAdapter();
- * viewModel.usersList.observe(this, list -> adapter.setList(list));
- * recyclerView.setAdapter(adapter);
- * }
- * }
- *
- * class UserAdapter extends ListAdapter<User, UserViewHolder> {
- * public UserAdapter() {
- * super(User.DIFF_CALLBACK);
- * }
- * {@literal @}Override
- * public void onBindViewHolder(UserViewHolder holder, int position) {
- * holder.bindTo(getItem(position));
- * }
- * public static final DiffCallback<User> DIFF_CALLBACK = new DiffCallback<User>() {
- * {@literal @}Override
- * public boolean areItemsTheSame(
- * {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- * // User properties may have changed if reloaded from the DB, but ID is fixed
- * return oldUser.getId() == newUser.getId();
- * }
- * {@literal @}Override
- * public boolean areContentsTheSame(
- * {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- * // NOTE: if you use equals, your object must properly override Object#equals()
- * // Incorrectly returning false here will result in too many animations.
- * return oldUser.equals(newUser);
- * }
- * }
- * }</pre>
- *
- * Advanced users that wish for more control over adapter behavior, or to provide a specific base
- * class should refer to {@link ListAdapterHelper}, which provides custom mapping from diff events
- * to adapter positions.
- *
- * @param <T> Type of the Lists this Adapter will receive.
- * @param <VH> A class that extends ViewHolder that will be used by the adapter.
- */
-public abstract class ListAdapter<T, VH extends RecyclerView.ViewHolder>
- extends RecyclerView.Adapter<VH> {
- private final ListAdapterHelper<T> mHelper;
-
- @SuppressWarnings("unused")
- protected ListAdapter(@NonNull DiffCallback<T> diffCallback) {
- mHelper = new ListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this),
- new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build());
- }
-
- @SuppressWarnings("unused")
- protected ListAdapter(@NonNull ListAdapterConfig<T> config) {
- mHelper = new ListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this), config);
- }
-
- /**
- * Set the new list to be displayed.
- * <p>
- * If a list is already being displayed, a diff will be computed on a background thread, which
- * will dispatch Adapter.notifyItem events on the main thread.
- *
- * @param list The new list to be displayed.
- */
- public void setList(List<T> list) {
- mHelper.setList(list);
- }
-
- @SuppressWarnings("unused")
- protected T getItem(int position) {
- return mHelper.getItem(position);
- }
-
- @Override
- public int getItemCount() {
- return mHelper.getItemCount();
- }
-}
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
index 25697a1..13036a7 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
@@ -17,25 +17,35 @@
package android.support.v7.recyclerview.extensions;
import android.arch.core.executor.ArchTaskExecutor;
+import android.support.v7.util.DiffUtil;
import java.util.concurrent.Executor;
/**
- * Configuration object for {@link ListAdapter}, {@link ListAdapterHelper}, and similar
+ * Configuration object for {@link ListAdapterHelper}, and similar
* background-thread list diffing adapter logic.
* <p>
- * At minimum, defines item diffing behavior with a {@link DiffCallback}, used to compute item
- * differences to pass to a RecyclerView adapter.
+ * At minimum, defines item diffing behavior with a {@link DiffUtil.ItemCallback}, used to compute
+ * item differences to pass to a RecyclerView adapter.
*
- * @param <T> Type of items in the lists, and being compared.
+ * @param <T> List item type being compared by the {@link DiffUtil.ItemCallback}.
+ *
+ * @deprecated use {@link android.support.v7.recyclerview.extensions.AsyncDifferConfig} in the
+ * RecyclerView module, starting in 27.1.0. It can be used with
+ * {@link android.support.v7.recyclerview.extensions.ListAdapter} and
+ * {@link android.support.v7.recyclerview.extensions.AsyncListDiffer} in the recyclerview module, as
+ * well as {@link android.arch.paging.PagedListAdapter} and
+ * {@link android.arch.paging.AsyncPagedListDiffer} in the paging library. It is being moved from
+ * the Paging Library to RecyclerView since it is useful independent of paging.
*/
+@Deprecated
public final class ListAdapterConfig<T> {
private final Executor mMainThreadExecutor;
private final Executor mBackgroundThreadExecutor;
- private final DiffCallback<T> mDiffCallback;
+ private final DiffUtil.ItemCallback<T> mDiffCallback;
private ListAdapterConfig(Executor mainThreadExecutor, Executor backgroundThreadExecutor,
- DiffCallback<T> diffCallback) {
+ DiffUtil.ItemCallback<T> diffCallback) {
mMainThreadExecutor = mainThreadExecutor;
mBackgroundThreadExecutor = backgroundThreadExecutor;
mDiffCallback = diffCallback;
@@ -49,31 +59,33 @@
return mBackgroundThreadExecutor;
}
- public DiffCallback<T> getDiffCallback() {
+ public DiffUtil.ItemCallback<T> getDiffCallback() {
return mDiffCallback;
}
/**
* Builder class for {@link ListAdapterConfig}.
* <p>
- * You must at minimum specify a DiffCallback with {@link #setDiffCallback(DiffCallback)}
+ * You must at minimum specify a DiffUtil.ItemCallback with
+ * {@link #setDiffCallback(DiffUtil.ItemCallback)}
*
* @param <T>
*/
public static class Builder<T> {
private Executor mMainThreadExecutor;
private Executor mBackgroundThreadExecutor;
- private DiffCallback<T> mDiffCallback;
+ private DiffUtil.ItemCallback<T> mDiffCallback;
/**
- * The {@link DiffCallback} to be used while diffing an old list with the updated one.
- * Must be provided.
+ * The {@link DiffUtil.ItemCallback} to be used while diffing an old list with the updated
+ * one. Must be provided.
*
- * @param diffCallback The {@link DiffCallback} instance to compare items in the list.
+ * @param diffCallback The {@link DiffUtil.ItemCallback} instance to compare items in the
+ * list.
* @return this
*/
@SuppressWarnings("WeakerAccess")
- public ListAdapterConfig.Builder<T> setDiffCallback(DiffCallback<T> diffCallback) {
+ public ListAdapterConfig.Builder<T> setDiffCallback(DiffUtil.ItemCallback<T> diffCallback) {
mDiffCallback = diffCallback;
return this;
}
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
index 0c7806f..81d8a20 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
@@ -17,21 +17,19 @@
package android.support.v7.recyclerview.extensions;
import android.arch.lifecycle.LiveData;
-import android.support.annotation.RestrictTo;
import android.support.v7.util.DiffUtil;
import android.support.v7.util.ListUpdateCallback;
-import android.support.v7.widget.RecyclerView;
import java.util.List;
/**
- * Helper object for displaying a List in {@link RecyclerView.Adapter RecyclerView.Adapter}, which
- * signals the adapter of changes when the List is changed by computing changes with DiffUtil in the
- * background.
+ * Helper object for displaying a List in {@link android.support.v7.widget.RecyclerView.Adapter
+ * RecyclerView.Adapter}, which signals the adapter of changes when the List is changed by computing
+ * changes with DiffUtil in the background.
* <p>
- * For simplicity, the {@link ListAdapter} wrapper class can often be used instead of the
- * helper directly. This helper class is exposed for complex cases, and where overriding an adapter
- * base class to support List diffing isn't convenient.
+ * For simplicity, the {@link android.support.v7.recyclerview.extensions.ListAdapter} wrapper class
+ * can often be used instead of the helper directly. This helper class is exposed for complex cases,
+ * and where overriding an adapter base class to support List diffing isn't convenient.
* <p>
* The ListAdapterHelper can take a {@link LiveData} of List and present the data simply for an
* adapter. It computes differences in List contents via DiffUtil on a background thread as new
@@ -39,68 +37,13 @@
* <p>
* It provides a simple list-like API with {@link #getItem(int)} and {@link #getItemCount()} for an
* adapter to acquire and present data objects.
- * <p>
- * A complete usage pattern with Room would look like this:
- * <pre>
- * {@literal @}Dao
- * interface UserDao {
- * {@literal @}Query("SELECT * FROM user ORDER BY lastName ASC")
- * public abstract LiveData<List<User>> usersByLastName();
- * }
- *
- * class MyViewModel extends ViewModel {
- * public final LiveData<List<User>> usersList;
- * public MyViewModel(UserDao userDao) {
- * usersList = userDao.usersByLastName();
- * }
- * }
- *
- * class MyActivity extends AppCompatActivity {
- * {@literal @}Override
- * public void onCreate(Bundle savedState) {
- * super.onCreate(savedState);
- * MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
- * RecyclerView recyclerView = findViewById(R.id.user_list);
- * UserAdapter<User> adapter = new UserAdapter();
- * viewModel.usersList.observe(this, list -> adapter.setList(list));
- * recyclerView.setAdapter(adapter);
- * }
- * }
- *
- * class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {
- * private final ListAdapterHelper<User> mHelper
- * = new ListAdapterHelper(this, User.DIFF_CALLBACK);
- * {@literal @}Override
- * public int getItemCount() {
- * return mHelper.getItemCount();
- * }
- * public void setList(List<User> list) {
- * mHelper.setList(list);
- * }
- * {@literal @}Override
- * public void onBindViewHolder(UserViewHolder holder, int position) {
- * User user = mHelper.getItem(position);
- * holder.bindTo(user);
- * }
- * public static final DiffCallback<User> DIFF_CALLBACK = new DiffCallback<User>() {
- * {@literal @}Override
- * public boolean areItemsTheSame(
- * {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- * // User properties may have changed if reloaded from the DB, but ID is fixed
- * return oldUser.getId() == newUser.getId();
- * }
- * {@literal @}Override
- * public boolean areContentsTheSame(
- * {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- * // NOTE: if you use equals, your object must properly override Object#equals()
- * // Incorrectly returning false here will result in too many animations.
- * return oldUser.equals(newUser);
- * }
- * }
- * }</pre>
*
* @param <T> Type of the lists this helper will receive.
+ * @deprecated use {@link android.support.v7.recyclerview.extensions.AsyncListDiffer} in the
+ * RecyclerView module, starting in 27.1.0. It is being moved from the Paging Library to
+ * RecyclerView since it is useful independent of paging.
*/
+@Deprecated
public class ListAdapterHelper<T> {
private final ListUpdateCallback mUpdateCallback;
private final ListAdapterConfig<T> mConfig;
@@ -112,42 +55,6 @@
mConfig = config;
}
- /**
- * Default ListUpdateCallback that dispatches directly to an adapter. Can be replaced by a
- * custom ListUpdateCallback if e.g. your adapter has a header in it, and so has an offset
- * between list positions and adapter positions.
- *
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- public static class AdapterCallback implements ListUpdateCallback {
- private final RecyclerView.Adapter mAdapter;
-
- public AdapterCallback(RecyclerView.Adapter adapter) {
- mAdapter = adapter;
- }
-
- @Override
- public void onInserted(int position, int count) {
- mAdapter.notifyItemRangeInserted(position, count);
- }
-
- @Override
- public void onRemoved(int position, int count) {
- mAdapter.notifyItemRangeRemoved(position, count);
- }
-
- @Override
- public void onMoved(int fromPosition, int toPosition) {
- mAdapter.notifyItemMoved(fromPosition, toPosition);
- }
-
- @Override
- public void onChanged(int position, int count, Object payload) {
- mAdapter.notifyItemRangeChanged(position, count, payload);
- }
- }
-
private List<T> mList;
// Max generation of currently scheduled runnable
@@ -171,7 +78,7 @@
/**
* Get the number of items currently presented by this AdapterHelper. This value can be directly
- * returned to {@link RecyclerView.Adapter#getItemCount()}.
+ * returned to {@link android.support.v7.widget.RecyclerView.Adapter#getItemCount()}.
*
* @return Number of items being presented.
*/
diff --git a/pathmap.mk b/pathmap.mk
index a71eb54..ebc023e 100644
--- a/pathmap.mk
+++ b/pathmap.mk
@@ -29,6 +29,7 @@
android-support-dynamic-animation \
android-support-exifinterface \
android-support-fragment \
+ android-support-heifwriter \
android-support-media-compat \
android-support-percent \
android-support-recommendation \
diff --git a/percent/build.gradle b/percent/build.gradle
index 951a0e0..9585323 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -26,5 +26,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Percent Support Library"
- legacySourceLocation = true
}
diff --git a/percent/tests/AndroidManifest.xml b/percent/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from percent/tests/AndroidManifest.xml
rename to percent/src/androidTest/AndroidManifest.xml
diff --git a/percent/tests/java/android/support/percent/BaseInstrumentationTestCase.java b/percent/src/androidTest/java/android/support/percent/BaseInstrumentationTestCase.java
similarity index 100%
rename from percent/tests/java/android/support/percent/BaseInstrumentationTestCase.java
rename to percent/src/androidTest/java/android/support/percent/BaseInstrumentationTestCase.java
diff --git a/percent/tests/java/android/support/percent/BaseTestActivity.java b/percent/src/androidTest/java/android/support/percent/BaseTestActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/BaseTestActivity.java
rename to percent/src/androidTest/java/android/support/percent/BaseTestActivity.java
diff --git a/percent/tests/java/android/support/percent/LayoutDirectionActions.java b/percent/src/androidTest/java/android/support/percent/LayoutDirectionActions.java
similarity index 100%
rename from percent/tests/java/android/support/percent/LayoutDirectionActions.java
rename to percent/src/androidTest/java/android/support/percent/LayoutDirectionActions.java
diff --git a/percent/tests/java/android/support/percent/PercentDynamicLayoutActivity.java b/percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentDynamicLayoutActivity.java
rename to percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutActivity.java
diff --git a/percent/tests/java/android/support/percent/PercentDynamicLayoutTest.java b/percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentDynamicLayoutTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutTest.java
diff --git a/percent/tests/java/android/support/percent/PercentFrameTest.java b/percent/src/androidTest/java/android/support/percent/PercentFrameTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentFrameTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentFrameTest.java
diff --git a/percent/tests/java/android/support/percent/PercentRelativeRtlTest.java b/percent/src/androidTest/java/android/support/percent/PercentRelativeRtlTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentRelativeRtlTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentRelativeRtlTest.java
diff --git a/percent/tests/java/android/support/percent/PercentRelativeTest.java b/percent/src/androidTest/java/android/support/percent/PercentRelativeTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentRelativeTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentRelativeTest.java
diff --git a/percent/tests/java/android/support/percent/TestFrameActivity.java b/percent/src/androidTest/java/android/support/percent/TestFrameActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestFrameActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestFrameActivity.java
diff --git a/percent/tests/java/android/support/percent/TestRelativeActivity.java b/percent/src/androidTest/java/android/support/percent/TestRelativeActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestRelativeActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestRelativeActivity.java
diff --git a/percent/tests/java/android/support/percent/TestRelativeRtlActivity.java b/percent/src/androidTest/java/android/support/percent/TestRelativeRtlActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestRelativeRtlActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestRelativeRtlActivity.java
diff --git a/percent/tests/res/layout/percent_dynamic_layout.xml b/percent/src/androidTest/res/layout/percent_dynamic_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_dynamic_layout.xml
rename to percent/src/androidTest/res/layout/percent_dynamic_layout.xml
diff --git a/percent/tests/res/layout/percent_frame_layout.xml b/percent/src/androidTest/res/layout/percent_frame_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout.xml
diff --git a/percent/tests/res/layout/percent_frame_layout_hpaddings.xml b/percent/src/androidTest/res/layout/percent_frame_layout_hpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout_hpaddings.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout_hpaddings.xml
diff --git a/percent/tests/res/layout/percent_frame_layout_vpaddings.xml b/percent/src/androidTest/res/layout/percent_frame_layout_vpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout_vpaddings.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout_vpaddings.xml
diff --git a/percent/tests/res/layout/percent_relative_layout.xml b/percent/src/androidTest/res/layout/percent_relative_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_hpaddings.xml b/percent/src/androidTest/res/layout/percent_relative_layout_hpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_hpaddings.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_hpaddings.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_rtl.xml b/percent/src/androidTest/res/layout/percent_relative_layout_rtl.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_rtl.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_rtl.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_vpaddings.xml b/percent/src/androidTest/res/layout/percent_relative_layout_vpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_vpaddings.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_vpaddings.xml
diff --git a/percent/tests/NO_DOCS b/percent/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/percent/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/preference-leanback/build.gradle b/preference-leanback/build.gradle
index 26b1bda..fc88f28 100644
--- a/preference-leanback/build.gradle
+++ b/preference-leanback/build.gradle
@@ -29,6 +29,5 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support Leanback Preference v17"
- legacySourceLocation = true
minSdkVersion = 17
}
\ No newline at end of file
diff --git a/core-utils/src/main/java/android/support/v4/print/OWNERS b/print/OWNERS
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/print/OWNERS
rename to print/OWNERS
diff --git a/print/api/current.txt b/print/api/current.txt
new file mode 100644
index 0000000..5277150
--- /dev/null
+++ b/print/api/current.txt
@@ -0,0 +1,29 @@
+package android.support.v4.print {
+
+ public final class PrintHelper {
+ ctor public PrintHelper(android.content.Context);
+ method public int getColorMode();
+ method public int getOrientation();
+ method public int getScaleMode();
+ method public void printBitmap(java.lang.String, android.graphics.Bitmap);
+ method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
+ method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
+ method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
+ method public void setColorMode(int);
+ method public void setOrientation(int);
+ method public void setScaleMode(int);
+ method public static boolean systemSupportsPrint();
+ field public static final int COLOR_MODE_COLOR = 2; // 0x2
+ field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
+ field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
+ field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
+ field public static final int SCALE_MODE_FILL = 2; // 0x2
+ field public static final int SCALE_MODE_FIT = 1; // 0x1
+ }
+
+ public static abstract interface PrintHelper.OnPrintFinishCallback {
+ method public abstract void onFinish();
+ }
+
+}
+
diff --git a/print/build.gradle b/print/build.gradle
new file mode 100644
index 0000000..78fc9db
--- /dev/null
+++ b/print/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+}
+
+supportLibrary {
+ name = "Android Support Library Print"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/print/src/main/AndroidManifest.xml b/print/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..bccf7e2
--- /dev/null
+++ b/print/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.print"/>
diff --git a/core-utils/src/main/java/android/support/v4/print/PrintHelper.java b/print/src/main/java/android/support/v4/print/PrintHelper.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/print/PrintHelper.java
rename to print/src/main/java/android/support/v4/print/PrintHelper.java
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index bf2265d..b401eb8 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -16,6 +16,5 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support Recommendation"
- legacySourceLocation = true
minSdkVersion = 21
}
diff --git a/recyclerview-selection/build.gradle b/recyclerview-selection/build.gradle
index d468582..c0915bc 100644
--- a/recyclerview-selection/build.gradle
+++ b/recyclerview-selection/build.gradle
@@ -23,9 +23,9 @@
}
dependencies {
- api project(':recyclerview-v7')
- api project(':support-annotations')
- api project(':support-compat')
+ api(project(":recyclerview-v7"))
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
androidTestImplementation(TEST_RUNNER)
androidTestImplementation(ESPRESSO_CORE)
@@ -34,21 +34,11 @@
androidTestImplementation(JUNIT)
}
-android {
- defaultConfig {
- minSdkVersion 14
- }
- sourceSets {
- main.res.srcDirs 'res', 'res-public'
- }
-}
-
supportLibrary {
- name 'Android RecyclerView Selection'
- publish false
+ name = "Android RecyclerView Selection"
+ publish = false
mavenVersion = LibraryVersions.SUPPORT_LIBRARY
mavenGroup = LibraryGroups.SUPPORT
- inceptionYear '2017'
- description 'Library providing item selection framework for RecyclerView. Support for touch based and band selection is provided.'
- legacySourceLocation true
+ inceptionYear = "2017"
+ description = "Library providing item selection framework for RecyclerView. Support for touch based and band selection is provided."
}
diff --git a/recyclerview-selection/tests/AndroidManifest.xml b/recyclerview-selection/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from recyclerview-selection/tests/AndroidManifest.xml
rename to recyclerview-selection/src/androidTest/AndroidManifest.xml
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureRouterTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GridModelTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GridModelTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GridModelTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GridModelTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/RangeTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/RangeTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/RangeTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/RangeTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/Bundles.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/Bundles.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/Bundles.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/Bundles.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestData.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestData.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestData.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestData.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestEvents.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestHolder.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
diff --git a/recyclerview-selection/res/drawable/selection_band_overlay.xml b/recyclerview-selection/src/main/res/drawable/selection_band_overlay.xml
similarity index 100%
rename from recyclerview-selection/res/drawable/selection_band_overlay.xml
rename to recyclerview-selection/src/main/res/drawable/selection_band_overlay.xml
diff --git a/recyclerview-selection/tests/NO_DOCS b/recyclerview-selection/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/recyclerview-selection/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
index fc0df44..313f968 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
@@ -49,7 +49,7 @@
class EntityProcessor(baseContext: Context,
val element: TypeElement,
- val referenceStack: LinkedHashSet<Name> = LinkedHashSet<Name>()) {
+ private val referenceStack: LinkedHashSet<Name> = LinkedHashSet()) {
val context = baseContext.fork(element)
fun process(): Entity {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt
new file mode 100644
index 0000000..e08b816
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.processor
+
+import android.arch.persistence.room.vo.PojoMethod
+import com.google.auto.common.MoreTypes
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.type.DeclaredType
+
+/**
+ * processes an executable element as member of the owning class
+ */
+class PojoMethodProcessor(
+ private val context: Context,
+ private val element: ExecutableElement,
+ private val owner: DeclaredType) {
+ fun process(): PojoMethod {
+ val asMember = context.processingEnv.typeUtils.asMemberOf(owner, element)
+ val name = element.simpleName.toString()
+ return PojoMethod(
+ element = element,
+ resolvedType = MoreTypes.asExecutable(asMember),
+ name = name
+ )
+ }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
index 46e9089..d5cd8d2 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
@@ -43,6 +43,7 @@
import android.arch.persistence.room.vo.FieldGetter
import android.arch.persistence.room.vo.FieldSetter
import android.arch.persistence.room.vo.Pojo
+import android.arch.persistence.room.vo.PojoMethod
import android.arch.persistence.room.vo.Warning
import com.google.auto.common.AnnotationMirrors
import com.google.auto.common.MoreElements
@@ -72,11 +73,12 @@
/**
* Processes any class as if it is a Pojo.
*/
-class PojoProcessor(baseContext: Context,
- val element: TypeElement,
- val bindingScope: FieldProcessor.BindingScope,
- val parent: EmbeddedField?,
- val referenceStack: LinkedHashSet<Name> = LinkedHashSet())
+class PojoProcessor(
+ baseContext: Context,
+ val element: TypeElement,
+ val bindingScope: FieldProcessor.BindingScope,
+ val parent: EmbeddedField?,
+ val referenceStack: LinkedHashSet<Name> = LinkedHashSet())
: KotlinMetadataUtils {
val context = baseContext.fork(element)
@@ -184,13 +186,20 @@
&& !it.hasAnnotation(Ignore::class)
}
.map { MoreElements.asExecutable(it) }
+ .map {
+ PojoMethodProcessor(
+ context = context,
+ element = it,
+ owner = declaredType
+ ).process()
+ }
val getterCandidates = methods.filter {
- it.parameters.size == 0 && it.returnType.kind != TypeKind.VOID
+ it.element.parameters.size == 0 && it.resolvedType.returnType.kind != TypeKind.VOID
}
val setterCandidates = methods.filter {
- it.parameters.size == 1 && it.returnType.kind == TypeKind.VOID
+ it.element.parameters.size == 1 && it.resolvedType.returnType.kind == TypeKind.VOID
}
// don't try to find a constructor for binding to statement.
@@ -585,18 +594,18 @@
return referenceRecursionList.joinToString(" -> ")
}
- private fun assignGetters(fields: List<Field>, getterCandidates: List<ExecutableElement>) {
+ private fun assignGetters(fields: List<Field>, getterCandidates: List<PojoMethod>) {
fields.forEach { field ->
assignGetter(field, getterCandidates)
}
}
- private fun assignGetter(field: Field, getterCandidates: List<ExecutableElement>) {
+ private fun assignGetter(field: Field, getterCandidates: List<PojoMethod>) {
val success = chooseAssignment(field = field,
candidates = getterCandidates,
nameVariations = field.getterNameWithVariations,
getType = { method ->
- method.returnType
+ method.resolvedType.returnType
},
assignFromField = {
field.getter = FieldGetter(
@@ -606,8 +615,8 @@
},
assignFromMethod = { match ->
field.getter = FieldGetter(
- name = match.simpleName.toString(),
- type = match.returnType,
+ name = match.name,
+ type = match.resolvedType.returnType,
callType = CallType.METHOD)
},
reportAmbiguity = { matching ->
@@ -617,15 +626,19 @@
context.checker.check(success, field.element, CANNOT_FIND_GETTER_FOR_FIELD)
}
- private fun assignSetters(fields: List<Field>, setterCandidates: List<ExecutableElement>,
- constructor: Constructor?) {
+ private fun assignSetters(
+ fields: List<Field>,
+ setterCandidates: List<PojoMethod>,
+ constructor: Constructor?) {
fields.forEach { field ->
assignSetter(field, setterCandidates, constructor)
}
}
- private fun assignSetter(field: Field, setterCandidates: List<ExecutableElement>,
- constructor: Constructor?) {
+ private fun assignSetter(
+ field: Field,
+ setterCandidates: List<PojoMethod>,
+ constructor: Constructor?) {
if (constructor != null && constructor.hasField(field)) {
field.setter = FieldSetter(field.name, field.type, CallType.CONSTRUCTOR)
return
@@ -634,7 +647,7 @@
candidates = setterCandidates,
nameVariations = field.setterNameWithVariations,
getType = { method ->
- method.parameters.first().asType()
+ method.resolvedType.parameterTypes.first()
},
assignFromField = {
field.setter = FieldSetter(
@@ -643,9 +656,9 @@
callType = CallType.FIELD)
},
assignFromMethod = { match ->
- val paramType = match.parameters.first().asType()
+ val paramType = match.resolvedType.parameterTypes.first()
field.setter = FieldSetter(
- name = match.simpleName.toString(),
+ name = match.name,
type = paramType,
callType = CallType.METHOD)
},
@@ -662,12 +675,15 @@
* At worst case, it sets to the field as if it is accessible so that the rest of the
* compilation can continue.
*/
- private fun chooseAssignment(field: Field, candidates: List<ExecutableElement>,
- nameVariations: List<String>,
- getType: (ExecutableElement) -> TypeMirror,
- assignFromField: () -> Unit,
- assignFromMethod: (ExecutableElement) -> Unit,
- reportAmbiguity: (List<String>) -> Unit): Boolean {
+ private fun chooseAssignment(
+ field: Field,
+ candidates: List<PojoMethod>,
+ nameVariations: List<String>,
+ getType: (PojoMethod) -> TypeMirror,
+ assignFromField: () -> Unit,
+ assignFromMethod: (PojoMethod) -> Unit,
+ reportAmbiguity: (List<String>) -> Unit
+ ): Boolean {
if (field.element.hasAnyOf(PUBLIC)) {
assignFromField()
return true
@@ -677,12 +693,12 @@
val matching = candidates
.filter {
// b/69164099
- types.isAssignableWithoutVariance(getType(it), field.element.asType())
- && (field.nameWithVariations.contains(it.simpleName.toString())
- || nameVariations.contains(it.simpleName.toString()))
+ types.isAssignableWithoutVariance(getType(it), field.type)
+ && (field.nameWithVariations.contains(it.name)
+ || nameVariations.contains(it.name))
}
.groupBy {
- if (it.hasAnyOf(PUBLIC)) PUBLIC else PROTECTED
+ if (it.element.hasAnyOf(PUBLIC)) PUBLIC else PROTECTED
}
if (matching.isEmpty()) {
// we always assign to avoid NPEs in the rest of the compilation.
@@ -691,8 +707,8 @@
// if not, compiler will tell, we didn't have any better alternative anyways.
return !field.element.hasAnyOf(PRIVATE)
}
- val match = verifyAndChooseOneFrom(matching[PUBLIC], reportAmbiguity) ?:
- verifyAndChooseOneFrom(matching[PROTECTED], reportAmbiguity)
+ val match = verifyAndChooseOneFrom(matching[PUBLIC], reportAmbiguity)
+ ?: verifyAndChooseOneFrom(matching[PROTECTED], reportAmbiguity)
if (match == null) {
assignFromField()
return false
@@ -703,14 +719,14 @@
}
private fun verifyAndChooseOneFrom(
- candidates: List<ExecutableElement>?,
+ candidates: List<PojoMethod>?,
reportAmbiguity: (List<String>) -> Unit
- ): ExecutableElement? {
+ ): PojoMethod? {
if (candidates == null) {
return null
}
if (candidates.size > 1) {
- reportAmbiguity(candidates.map { it.simpleName.toString() })
+ reportAmbiguity(candidates.map { it.name })
}
return candidates.first()
}
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
similarity index 63%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
index ac61704..2a59ef8 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
@@ -14,16 +14,15 @@
* limitations under the License.
*/
-package android.support.design.widget;
+package android.arch.persistence.room.vo
-import android.support.coreui.test.R;
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.type.ExecutableType
/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
+ * An executable element processed as member of a class (pojo or entity)
*/
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
- @Override
- protected int getContentViewLayoutResId() {
- return R.layout.dynamic_coordinator_layout;
- }
-}
+class PojoMethod(
+ val element: ExecutableElement,
+ val resolvedType: ExecutableType,
+ val name: String)
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 8203416..1dc0a79 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -44,8 +44,7 @@
implementation(project(":persistence:db-framework"))
implementation(project(":room:runtime"))
implementation(project(":arch:runtime"))
-
- implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+ implementation(project(":lifecycle:extensions"))
kaptAndroidTest project(":room:compiler")
androidTestImplementation(TEST_RUNNER) {
@@ -76,4 +75,4 @@
supportTestApp {
// to assert that room generates somewhat OK code.
enableErrorProne = true
-}
\ No newline at end of file
+}
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 00712f8..45ec9c6 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -47,8 +47,8 @@
implementation(project(":room:rxjava2"))
implementation(project(":paging:runtime"))
- implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
- implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+ implementation(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
+ implementation(SUPPORT_APPCOMPAT_27, libs.support_exclude_config)
annotationProcessor project(":room:compiler")
androidTestAnnotationProcessor project(":room:compiler")
@@ -75,4 +75,4 @@
supportTestApp {
// to assert that room generates somewhat OK code.
enableErrorProne = true
-}
\ No newline at end of file
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java
new file mode 100644
index 0000000..6db28d4
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.PrimaryKey;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Objects;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class GenericEntityTest {
+ private GenericDb mDb;
+ private GenericDao mDao;
+
+ @Before
+ public void init() {
+ mDb = Room.inMemoryDatabaseBuilder(
+ InstrumentationRegistry.getTargetContext(),
+ GenericDb.class
+ ).build();
+ mDao = mDb.getDao();
+ }
+
+ @After
+ public void close() {
+ mDb.close();
+ }
+
+ @Test
+ public void readWriteEntity() {
+ EntityItem item = new EntityItem("abc", "def");
+ mDao.insert(item);
+ EntityItem received = mDao.get("abc");
+ assertThat(received, is(item));
+ }
+
+ @Test
+ public void readPojo() {
+ EntityItem item = new EntityItem("abc", "def");
+ mDao.insert(item);
+ PojoItem received = mDao.getPojo("abc");
+ assertThat(received.id, is("abc"));
+ }
+
+ static class Item<P, F> {
+ @NonNull
+ @PrimaryKey
+ public final P id;
+ private F mField;
+
+ Item(@NonNull P id) {
+ this.id = id;
+ }
+
+ public F getField() {
+ return mField;
+ }
+
+ public void setField(F field) {
+ mField = field;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Item<?, ?> item = (Item<?, ?>) o;
+ return Objects.equals(id, item.id)
+ && Objects.equals(mField, item.mField);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(id, mField);
+ }
+ }
+
+ static class PojoItem extends Item<String, Integer> {
+ PojoItem(String id) {
+ super(id);
+ }
+ }
+
+ @Entity
+ static class EntityItem extends Item<String, Integer> {
+ public final String name;
+
+ EntityItem(String id, String name) {
+ super(id);
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EntityItem item = (EntityItem) o;
+ return Objects.equals(name, item.name);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(name);
+ }
+ }
+
+ @Dao
+ public interface GenericDao {
+ @Insert
+ void insert(EntityItem... items);
+
+ @Query("SELECT * FROM EntityItem WHERE id = :id")
+ EntityItem get(String id);
+
+ @Query("SELECT * FROM EntityItem WHERE id = :id")
+ PojoItem getPojo(String id);
+ }
+
+ @Database(version = 1, entities = {EntityItem.class}, exportSchema = false)
+ public abstract static class GenericDb extends RoomDatabase {
+ abstract GenericDao getDao();
+ }
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
index b5f635c..eacea99 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
@@ -27,7 +27,7 @@
import android.widget.TextView;
/**
- * Sample adapter which uses a PagedListAdapterHelper.
+ * Sample adapter which uses a AsyncPagedListDiffer.
*/
class PagedListCustomerAdapter extends PagedListAdapter<Customer, RecyclerView.ViewHolder> {
private RecyclerView mRecyclerView;
@@ -78,8 +78,8 @@
}
@Override
- public void setList(PagedList<Customer> pagedList) {
- super.setList(pagedList);
+ public void submitList(PagedList<Customer> pagedList) {
+ super.submitList(pagedList);
if (pagedList != null) {
final boolean firstSet = !mSetObserved;
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
index 0c79aee..66620ef 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
@@ -17,17 +17,14 @@
package android.arch.persistence.room.integration.testapp;
import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.arch.paging.PagedList;
import android.arch.persistence.room.integration.testapp.database.Customer;
import android.arch.persistence.room.integration.testapp.database.LastNameAscCustomerDataSource;
import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
-import android.view.View;
import android.widget.Button;
/**
@@ -68,19 +65,9 @@
}
livePagedList = viewModel.getLivePagedList(position);
}
- livePagedList.observe(this, new Observer<PagedList<Customer>>() {
- @Override
- public void onChanged(@Nullable PagedList<Customer> items) {
- mAdapter.setList(items);
- }
- });
+ livePagedList.observe(this, items -> mAdapter.submitList(items));
final Button button = findViewById(R.id.addButton);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- viewModel.insertCustomer();
- }
- });
+ button.setOnClickListener(v -> viewModel.insertCustomer());
}
@Override
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
index 65e9828..54fa531 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
@@ -19,7 +19,7 @@
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;
-import android.support.v7.recyclerview.extensions.DiffCallback;
+import android.support.v7.util.DiffUtil;
/**
* Sample entity
@@ -96,7 +96,8 @@
+ '}';
}
- public static final DiffCallback<Customer> DIFF_CALLBACK = new DiffCallback<Customer>() {
+ public static final DiffUtil.ItemCallback<Customer> DIFF_CALLBACK =
+ new DiffUtil.ItemCallback<Customer>() {
@Override
public boolean areContentsTheSame(@NonNull Customer oldItem, @NonNull Customer newItem) {
return oldItem.equals(newItem);
diff --git a/samples/SupportDesignDemos/proguard.flags b/samples/SupportDesignDemos/proguard.flags
deleted file mode 100644
index 9ebd737..0000000
--- a/samples/SupportDesignDemos/proguard.flags
+++ /dev/null
@@ -1,7 +0,0 @@
--keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keep public class * extends android.support.v7.widget.LinearLayoutManager {
- public <init>(android.content.Context, android.util.AttributeSet, int, int);
-}
diff --git a/samples/SupportPreferenceDemos/proguard.flags b/samples/SupportPreferenceDemos/proguard.flags
deleted file mode 100644
index 9ebd737..0000000
--- a/samples/SupportPreferenceDemos/proguard.flags
+++ /dev/null
@@ -1,7 +0,0 @@
--keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keep public class * extends android.support.v7.widget.LinearLayoutManager {
- public <init>(android.content.Context, android.util.AttributeSet, int, int);
-}
diff --git a/samples/SupportTransitionDemos/proguard.flags b/samples/SupportTransitionDemos/proguard.flags
deleted file mode 100644
index e69de29..0000000
--- a/samples/SupportTransitionDemos/proguard.flags
+++ /dev/null
diff --git a/settings.gradle b/settings.gradle
index 03eba38..a87dcfe 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -35,28 +35,39 @@
includeProject(":animated-vector-drawable", "graphics/drawable/animated")
includeProject(":appcompat-v7", "v7/appcompat")
+includeProject(":asynclayoutinflater", "asynclayoutinflater")
includeProject(":car", "car")
includeProject(":cardview-v7", "v7/cardview")
+includeProject(":collections", "collections")
+includeProject(":coordinatorlayout", "coordinatorlayout")
includeProject(":customtabs", "customtabs")
+includeProject(":customview", "customview")
+includeProject(":documentfile", "documentfile")
+includeProject(":drawerlayout", "drawerlayout")
includeProject(":exifinterface", "exifinterface")
includeProject(":gridlayout-v7", "v7/gridlayout")
+includeProject(":heifwriter", "heifwriter")
+includeProject(":interpolator", "interpolator")
includeProject(":jetifier-core", "jetifier/jetifier/core")
includeProject(":jetifier-gradle-plugin", "jetifier/jetifier/gradle-plugin")
includeProject(":jetifier-standalone", "jetifier/jetifier/standalone")
includeProject(":jetifier-preprocessor", "jetifier/jetifier/preprocessor")
includeProject(":leanback-v17", "leanback")
+includeProject(":localbroadcastmanager", "localbroadcastmanager")
includeProject(":mediarouter-v7", "v7/mediarouter")
includeProject(":palette-v7", "v7/palette")
includeProject(":percent", "percent")
includeProject(":preference-v7", "v7/preference")
includeProject(":preference-v14", "v14/preference")
includeProject(":preference-leanback-v17", "preference-leanback")
+includeProject(":print", "print")
includeProject(":recommendation", "recommendation")
includeProject(":recyclerview-v7", "v7/recyclerview")
includeProject(":recyclerview-selection", "recyclerview-selection")
includeProject(":slices-core", "slices/core")
includeProject(":slices-view", "slices/view")
includeProject(":slices-builders", "slices/builders")
+includeProject(":slidingpanelayout", "slidingpanelayout")
includeProject(":support-annotations", "annotations")
includeProject(":support-compat", "compat")
includeProject(":support-content", "content")
@@ -72,8 +83,10 @@
includeProject(":support-vector-drawable", "graphics/drawable/static")
includeProject(":support-v4", "v4")
includeProject(":support-v13", "v13")
+includeProject(":swiperefreshlayout", "swiperefreshlayout")
includeProject(":textclassifier", "textclassifier")
includeProject(":transition", "transition")
+includeProject(":viewpager", "viewpager")
includeProject(":viewpager2", "viewpager2")
includeProject(":wear", "wear")
includeProject(":webkit", "webkit")
@@ -136,6 +149,7 @@
File externalRoot = new File(rootDir, "../../external")
includeProject(":noto-emoji-compat", new File(externalRoot, "noto-fonts/emoji-compat"))
+includeProject(":webview-support-interfaces", new File(externalRoot, "webview_support_interfaces"))
///// FLATFOOT START
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
index b7ba1b8..fd7ac96 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
@@ -24,6 +24,7 @@
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
+import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
@@ -160,7 +161,7 @@
*/
@RestrictTo(LIBRARY_GROUP)
@NonNull
- public ListBuilder setColor(int color) {
+ public ListBuilder setColor(@ColorInt int color) {
mImpl.setColor(color);
return this;
}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
index 7291143..c16da2b 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
@@ -21,6 +21,7 @@
import android.app.PendingIntent;
import android.graphics.drawable.Icon;
import android.net.Uri;
+import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.RestrictTo;
@@ -89,7 +90,7 @@
/**
* Sets the color to tint items displayed by this template (e.g. icons).
*/
- void setColor(int color);
+ void setColor(@ColorInt int color);
/**
* Create a builder that implements {@link RowBuilder}.
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
index 175bc33..b47e7f2 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
@@ -21,6 +21,7 @@
import android.app.PendingIntent;
import android.graphics.drawable.Icon;
import android.net.Uri;
+import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.RestrictTo;
@@ -93,7 +94,7 @@
/**
*/
@Override
- public void setColor(int color) {
+ public void setColor(@ColorInt int color) {
}
/**
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
index c659bc6..0a73f34 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
@@ -36,6 +36,7 @@
import android.app.PendingIntent;
import android.graphics.drawable.Icon;
import android.net.Uri;
+import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
@@ -222,7 +223,7 @@
*/
@NonNull
@Override
- public void setColor(int color) {
+ public void setColor(@ColorInt int color) {
getBuilder().addInt(color, SUBTYPE_COLOR);
}
diff --git a/slices/core/src/androidTest/NO_DOCS b/slices/core/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/slices/core/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/slices/view/src/androidTest/NO_DOCS b/slices/view/src/androidTest/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/slices/view/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
index b6ba39a..f267bdb 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
@@ -162,7 +162,7 @@
if (gc.getContentIntent() != null) {
EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_CONTENT,
EventInfo.ROW_TYPE_GRID, mRowIndex);
- Pair<SliceItem, EventInfo> tagItem = new Pair(gc.getContentIntent(), info);
+ Pair<SliceItem, EventInfo> tagItem = new Pair<>(gc.getContentIntent(), info);
mViewContainer.setTag(tagItem);
makeClickable(mViewContainer);
}
@@ -266,7 +266,7 @@
EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_BUTTON,
EventInfo.ROW_TYPE_GRID, mRowIndex);
info.setPosition(EventInfo.POSITION_CELL, index, total);
- Pair<SliceItem, EventInfo> tagItem = new Pair(contentIntentItem, info);
+ Pair<SliceItem, EventInfo> tagItem = new Pair<>(contentIntentItem, info);
cellContainer.setTag(tagItem);
makeClickable(cellContainer);
}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
index c84db5f..b64cd01 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
@@ -23,6 +23,8 @@
import static android.app.slice.SliceItem.FORMAT_INT;
import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static androidx.app.slice.widget.SliceView.MODE_LARGE;
+
import android.annotation.TargetApi;
import android.app.slice.Slice;
import android.content.Context;
@@ -149,16 +151,21 @@
}
private View inflateForType(int viewType) {
+ View v = new RowView(mContext);
switch (viewType) {
case TYPE_GRID:
- return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_grid, null);
+ v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_grid, null);
+ break;
case TYPE_MESSAGE:
- return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message, null);
+ v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message, null);
+ break;
case TYPE_MESSAGE_LOCAL:
- return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message_local,
+ v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message_local,
null);
+ break;
}
- return new RowView(mContext);
+ ((SliceChildView) v).setMode(MODE_LARGE);
+ return v;
}
protected static class SliceWrapper {
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
index 39da785..9a5279f 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
@@ -60,7 +60,7 @@
/**
- * @return the mode of the slice being presented.
+ * Set the mode of the slice being presented.
*/
public void setMode(int mode) {
mMode = mode;
@@ -69,6 +69,7 @@
/**
* @return the mode of the slice being presented.
*/
+ @SliceView.SliceMode
public int getMode() {
return mMode;
}
diff --git a/slidingpanelayout/api/current.txt b/slidingpanelayout/api/current.txt
new file mode 100644
index 0000000..07e71d9
--- /dev/null
+++ b/slidingpanelayout/api/current.txt
@@ -0,0 +1,54 @@
+package android.support.v4.widget {
+
+ public class SlidingPaneLayout extends android.view.ViewGroup {
+ ctor public SlidingPaneLayout(android.content.Context);
+ ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
+ ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
+ method protected boolean canScroll(android.view.View, boolean, int, int, int);
+ method public deprecated boolean canSlide();
+ method public boolean closePane();
+ method public int getCoveredFadeColor();
+ method public int getParallaxDistance();
+ method public int getSliderFadeColor();
+ method public boolean isOpen();
+ method public boolean isSlideable();
+ method public boolean openPane();
+ method public void setCoveredFadeColor(int);
+ method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
+ method public void setParallaxDistance(int);
+ method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
+ method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
+ method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
+ method public deprecated void setShadowResource(int);
+ method public void setShadowResourceLeft(int);
+ method public void setShadowResourceRight(int);
+ method public void setSliderFadeColor(int);
+ method public deprecated void smoothSlideClosed();
+ method public deprecated void smoothSlideOpen();
+ }
+
+ public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public SlidingPaneLayout.LayoutParams();
+ ctor public SlidingPaneLayout.LayoutParams(int, int);
+ ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+ ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
+ ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+ field public float weight;
+ }
+
+ public static abstract interface SlidingPaneLayout.PanelSlideListener {
+ method public abstract void onPanelClosed(android.view.View);
+ method public abstract void onPanelOpened(android.view.View);
+ method public abstract void onPanelSlide(android.view.View, float);
+ }
+
+ public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
+ ctor public SlidingPaneLayout.SimplePanelSlideListener();
+ method public void onPanelClosed(android.view.View);
+ method public void onPanelOpened(android.view.View);
+ method public void onPanelSlide(android.view.View, float);
+ }
+
+}
+
diff --git a/slidingpanelayout/build.gradle b/slidingpanelayout/build.gradle
new file mode 100644
index 0000000..d084e63
--- /dev/null
+++ b/slidingpanelayout/build.gradle
@@ -0,0 +1,21 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+ api(project(":customview"))
+}
+
+supportLibrary {
+ name = "Android Support Library Sliding Pane Layout"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/slidingpanelayout/src/main/AndroidManifest.xml b/slidingpanelayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0df47df
--- /dev/null
+++ b/slidingpanelayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.slidingpanelayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java b/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
rename to slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
diff --git a/swiperefreshlayout/api/current.txt b/swiperefreshlayout/api/current.txt
new file mode 100644
index 0000000..ce68f0b
--- /dev/null
+++ b/swiperefreshlayout/api/current.txt
@@ -0,0 +1,76 @@
+package android.support.v4.widget {
+
+ public class CircularProgressDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
+ ctor public CircularProgressDrawable(android.content.Context);
+ method public void draw(android.graphics.Canvas);
+ method public boolean getArrowEnabled();
+ method public float getArrowHeight();
+ method public float getArrowScale();
+ method public float getArrowWidth();
+ method public int getBackgroundColor();
+ method public float getCenterRadius();
+ method public int[] getColorSchemeColors();
+ method public float getEndTrim();
+ method public int getOpacity();
+ method public float getProgressRotation();
+ method public float getStartTrim();
+ method public android.graphics.Paint.Cap getStrokeCap();
+ method public float getStrokeWidth();
+ method public boolean isRunning();
+ method public void setAlpha(int);
+ method public void setArrowDimensions(float, float);
+ method public void setArrowEnabled(boolean);
+ method public void setArrowScale(float);
+ method public void setBackgroundColor(int);
+ method public void setCenterRadius(float);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setColorSchemeColors(int...);
+ method public void setProgressRotation(float);
+ method public void setStartEndTrim(float, float);
+ method public void setStrokeCap(android.graphics.Paint.Cap);
+ method public void setStrokeWidth(float);
+ method public void setStyle(int);
+ method public void start();
+ method public void stop();
+ field public static final int DEFAULT = 1; // 0x1
+ field public static final int LARGE = 0; // 0x0
+ }
+
+ public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
+ ctor public SwipeRefreshLayout(android.content.Context);
+ ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
+ method public boolean canChildScrollUp();
+ method public int getProgressCircleDiameter();
+ method public int getProgressViewEndOffset();
+ method public int getProgressViewStartOffset();
+ method public boolean isRefreshing();
+ method public void onMeasure(int, int);
+ method public deprecated void setColorScheme(int...);
+ method public void setColorSchemeColors(int...);
+ method public void setColorSchemeResources(int...);
+ method public void setDistanceToTriggerSync(int);
+ method public void setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
+ method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
+ method public deprecated void setProgressBackgroundColor(int);
+ method public void setProgressBackgroundColorSchemeColor(int);
+ method public void setProgressBackgroundColorSchemeResource(int);
+ method public void setProgressViewEndTarget(boolean, int);
+ method public void setProgressViewOffset(boolean, int, int);
+ method public void setRefreshing(boolean);
+ method public void setSize(int);
+ field public static final int DEFAULT = 1; // 0x1
+ field public static final int LARGE = 0; // 0x0
+ field protected int mFrom;
+ field protected int mOriginalOffsetTop;
+ }
+
+ public static abstract interface SwipeRefreshLayout.OnChildScrollUpCallback {
+ method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
+ }
+
+ public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+ method public abstract void onRefresh();
+ }
+
+}
+
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
new file mode 100644
index 0000000..0479bbe
--- /dev/null
+++ b/swiperefreshlayout/build.gradle
@@ -0,0 +1,33 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+ api(project(":interpolator"))
+
+ androidTestImplementation(JUNIT)
+ androidTestImplementation(TEST_RUNNER)
+ androidTestImplementation(TEST_RULES)
+ androidTestImplementation(ESPRESSO_CORE)
+ androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+ androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+ androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+ androidTestImplementation project(':support-testutils'), {
+ exclude group: 'com.android.support', module: 'swiperefreshlayout'
+ }
+}
+
+supportLibrary {
+ name = "Android Support Library Custom View"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/swiperefreshlayout/src/androidTest/AndroidManifest.xml b/swiperefreshlayout/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..1b84249
--- /dev/null
+++ b/swiperefreshlayout/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.support.swiperefreshlayout.test">
+ <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+ <application
+ android:supportsRtl="true"
+ android:theme="@style/TestActivityTheme">
+ <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
+ <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
+ </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
similarity index 66%
rename from core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
index 743cd7d..3353c9f 100644
--- a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
@@ -16,12 +16,14 @@
package android.support.v4.widget;
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.swiperefreshlayout.test.R;
-public class CircularProgressDrawableActivity extends BaseTestActivity {
+public class CircularProgressDrawableActivity extends Activity {
@Override
- protected int getContentViewLayoutResId() {
- return R.layout.circular_progress_drawable_activity;
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.circular_progress_drawable_activity);
}
}
diff --git a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
similarity index 88%
rename from core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
index cf31952..2a0870e 100644
--- a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
@@ -30,22 +30,24 @@
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.test.filters.SmallTest;
-import android.support.v4.BaseInstrumentationTestCase;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
/**
* Tests for CircularProgressDrawable
*/
-public class CircularProgressDrawableTest extends
- BaseInstrumentationTestCase<CircularProgressDrawableActivity> {
-
- public CircularProgressDrawableTest() {
- super(CircularProgressDrawableActivity.class);
- }
+@RunWith(AndroidJUnit4.class)
+public class CircularProgressDrawableTest {
+ @Rule
+ public final ActivityTestRule<CircularProgressDrawableActivity> mActivityTestRule =
+ new ActivityTestRule<>(CircularProgressDrawableActivity.class);
private CircularProgressDrawable mDrawableUnderTest;
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
similarity index 67%
copy from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
copy to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
index 19d1598..3d8493d 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
@@ -16,12 +16,14 @@
package android.support.v4.widget;
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.swiperefreshlayout.test.R;
-public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
+public class SwipeRefreshLayoutActivity extends Activity {
@Override
- protected int getContentViewLayoutResId() {
- return R.layout.explore_by_touch_helper_activity;
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.swipe_refresh_layout_activity);
}
}
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
similarity index 92%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
index 04a2835..fe53293 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
@@ -32,17 +32,20 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.coreui.test.R;
+import android.support.swiperefreshlayout.test.R;
import android.support.test.espresso.action.ViewActions;
import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import android.support.testutils.PollingCheck;
-import android.support.v4.BaseInstrumentationTestCase;
import android.view.View;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -50,21 +53,20 @@
/**
* Tests SwipeRefreshLayout widget.
*/
-public class SwipeRefreshLayoutTest
- extends BaseInstrumentationTestCase<SwipeRefreshLayoutActivity> {
+@RunWith(AndroidJUnit4.class)
+public class SwipeRefreshLayoutTest {
+ @Rule
+ public final ActivityTestRule<SwipeRefreshLayoutActivity> mActivityTestRule =
+ new ActivityTestRule<>(SwipeRefreshLayoutActivity.class);
+
private static final long TIMEOUT = 1000;
private static final int INVALID_SIZE = 1000;
private SwipeRefreshLayout mSwipeRefresh;
- public SwipeRefreshLayoutTest() {
- super(SwipeRefreshLayoutActivity.class);
- }
-
@Before
public void setUp() {
- mSwipeRefresh = (SwipeRefreshLayout) mActivityTestRule.getActivity().findViewById(
- R.id.swipe_refresh);
+ mSwipeRefresh = mActivityTestRule.getActivity().findViewById(R.id.swipe_refresh);
}
@Test
diff --git a/core-ui/tests/res/layout/circular_progress_drawable_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/circular_progress_drawable_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/circular_progress_drawable_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/circular_progress_drawable_activity.xml
diff --git a/core-ui/tests/res/layout/swipe_refresh_layout_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/swipe_refresh_layout_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_activity.xml
diff --git a/core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_disabled_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_disabled_activity.xml
diff --git a/core-ui/tests/res/values/styles.xml b/swiperefreshlayout/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to swiperefreshlayout/src/androidTest/res/values/styles.xml
diff --git a/swiperefreshlayout/src/main/AndroidManifest.xml b/swiperefreshlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..abc5680
--- /dev/null
+++ b/swiperefreshlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.swiperefreshlayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/CircleImageView.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/CircleImageView.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/CircleImageView.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/CircleImageView.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
diff --git a/testutils/build.gradle b/testutils/build.gradle
index 6a340b0..d75b6b7 100644
--- a/testutils/build.gradle
+++ b/testutils/build.gradle
@@ -36,7 +36,3 @@
disable 'InvalidPackage' // Lint is unhappy about junit package
}
}
-
-supportLibrary {
- legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/transition/src/androidTest/NO_DOCS b/transition/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/transition/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/tv-provider/src/androidTest/NO_DOCS b/tv-provider/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/tv-provider/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 106d0aa..799b7b3 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -45,5 +45,4 @@
mavenGroup = LibraryGroups.SUPPORT
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 14 or later."
- legacySourceLocation = true
}
diff --git a/v7/appcompat/res/values/colors_material.xml b/v7/appcompat/res/values/colors_material.xml
index cf21172..7d5ca2c 100644
--- a/v7/appcompat/res/values/colors_material.xml
+++ b/v7/appcompat/res/values/colors_material.xml
@@ -99,7 +99,8 @@
<color name="primary_text_disabled_material_dark">#4Dffffff</color>
<color name="secondary_text_disabled_material_dark">#36ffffff</color>
- <color name="error_color_material">#F4511E</color>
+ <color name="error_color_material_dark">#ff7043</color><!-- deep orange 400 -->
+ <color name="error_color_material_light">#ff5722</color><!-- deep orange 500 -->
<!-- Primary & accent colors -->
<eat-comment />
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index f628499..def6423 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -316,7 +316,7 @@
<item name="tooltipFrameBackground">@drawable/tooltip_frame_light</item>
<item name="tooltipForegroundColor">@color/foreground_material_light</item>
- <item name="colorError">@color/error_color_material</item>
+ <item name="colorError">@color/error_color_material_dark</item>
</style>
<!-- Base platform-dependent theme providing an action bar in a light-themed activity. -->
@@ -487,7 +487,7 @@
<item name="tooltipFrameBackground">@drawable/tooltip_frame_dark</item>
<item name="tooltipForegroundColor">@color/foreground_material_dark</item>
- <item name="colorError">@color/error_color_material</item>
+ <item name="colorError">@color/error_color_material_light</item>
</style>
<style name="Base.Theme.AppCompat" parent="Base.V7.Theme.AppCompat">
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/appcompat/tests/AndroidManifest.xml
rename to v7/appcompat/src/androidTest/AndroidManifest.xml
diff --git a/v7/appcompat/tests/fonts_readme.txt b/v7/appcompat/src/androidTest/fonts_readme.txt
similarity index 100%
rename from v7/appcompat/tests/fonts_readme.txt
rename to v7/appcompat/src/androidTest/fonts_readme.txt
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogCursorTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogCursorTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogCursorTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogCursorTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterPassTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterPassTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterPassTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterPassTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseBasicsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseBasicsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseBasicsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseBasicsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyEventsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyEventsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyboardShortcutsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/CustomCollapsibleView.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/CustomCollapsibleView.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/CustomCollapsibleView.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/CustomCollapsibleView.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DialogTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DialogTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/MenuBuilderTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/MenuBuilderTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/MenuBuilderTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/MenuBuilderTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/NightModeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/NightModeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/NightModeTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/NightModeTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/ToolbarAppCompatActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/ToolbarAppCompatActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/WindowDecorAppCompatActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/WindowDecorAppCompatActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/inflater/CustomViewInflater.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/CustomViewInflater.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/inflater/CustomViewInflater.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/CustomViewInflater.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/inflater/MisbehavingViewInflater.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/MisbehavingViewInflater.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/inflater/MisbehavingViewInflater.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/MisbehavingViewInflater.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/ContextWrapperFrameLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/ContextWrapperFrameLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/ContextWrapperFrameLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/ContextWrapperFrameLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/CustomDrawerLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/CustomDrawerLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/FitWindowsContentLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/FitWindowsContentLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/FitWindowsContentLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/FitWindowsContentLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/res/content/AppCompatResourcesTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/res/content/AppCompatResourcesTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/res/content/AppCompatResourcesTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/res/content/AppCompatResourcesTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/AppCompatTintableViewActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/AppCompatTintableViewActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/AppCompatTintableViewActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/AppCompatTintableViewActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/BaseTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/BaseTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/BaseTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/BaseTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/DrawerLayoutActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/DrawerLayoutActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/DrawerLayoutActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/DrawerLayoutActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/Shakespeare.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/Shakespeare.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtils.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtils.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsMatchers.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsMatchers.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/ContextThemeWrapperTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/ContextThemeWrapperTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/ContextThemeWrapperTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/ContextThemeWrapperTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseImageViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseImageViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseImageViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseImageViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatEditTextTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatEditTextTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/ListPopupWindowTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/ListPopupWindowTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/ListPopupWindowTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/ListPopupWindowTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupMenuTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupMenuTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/PopupTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/PopupTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchViewTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchViewTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchView_CursorTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchView_CursorTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/TintResourcesTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/TintResourcesTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/TintResourcesTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/TintResourcesTest.java
diff --git a/v7/appcompat/tests/res/color-v23/color_state_list_themed_attrs.xml b/v7/appcompat/src/androidTest/res/color-v23/color_state_list_themed_attrs.xml
similarity index 100%
rename from v7/appcompat/tests/res/color-v23/color_state_list_themed_attrs.xml
rename to v7/appcompat/src/androidTest/res/color-v23/color_state_list_themed_attrs.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_emerald_translucent.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_emerald_translucent.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_emerald_translucent.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_emerald_translucent.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_lilac.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_lilac.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_lilac.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_lilac.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_link.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_link.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_link.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_link.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_ocean.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_ocean.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_ocean.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_ocean.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_sand.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_sand.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_sand.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_sand.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_themed_attrs.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_themed_attrs.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_themed_attrs.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_themed_attrs.xml
diff --git a/v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-hdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-mdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-mdpi/test_drawable.png b/v7/appcompat/src/androidTest/res/drawable-mdpi/test_drawable.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-mdpi/test_drawable.png
rename to v7/appcompat/src/androidTest/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/black_rect.xml b/v7/appcompat/src/androidTest/res/drawable/black_rect.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/black_rect.xml
rename to v7/appcompat/src/androidTest/res/drawable/black_rect.xml
diff --git a/v7/appcompat/tests/res/drawable/icon_black.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_black.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_black.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_black.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_blue.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_blue.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_blue.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_green.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_green.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_green.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_green.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_red.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_red.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_red.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_red.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_yellow.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_yellow.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_yellow.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/test_background_blue.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_blue.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_blue.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_blue.xml
diff --git a/v7/appcompat/tests/res/drawable/test_background_green.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_green.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_green.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_green.xml
diff --git a/v7/appcompat/tests/res/drawable/test_background_red.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_red.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_red.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_red.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_blue.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_blue.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_blue.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_blue.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_green.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_green.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_green.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_green.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_red.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_red.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_red.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_red.xml
diff --git a/v7/appcompat/tests/res/drawable/test_night_color_conversion_background.xml b/v7/appcompat/src/androidTest/res/drawable/test_night_color_conversion_background.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_night_color_conversion_background.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_night_color_conversion_background.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_left_white_right_black.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_left_white_right_black.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_left_white_right_black.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_left_white_right_black.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_level.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_level.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_level.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_level.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_off.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_off.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_off.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_off.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_on.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_on.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_on.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_on.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_state.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_state.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_state.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_state.xml
diff --git a/v7/appcompat/tests/res/font/samplefont.ttf b/v7/appcompat/src/androidTest/res/font/samplefont.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont2.ttf b/v7/appcompat/src/androidTest/res/font/samplefont2.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont2.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont2.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont3.ttf b/v7/appcompat/src/androidTest/res/font/samplefont3.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont3.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont3.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont4.ttf b/v7/appcompat/src/androidTest/res/font/samplefont4.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont4.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont4.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplexmldownloadedfont.xml b/v7/appcompat/src/androidTest/res/font/samplexmldownloadedfont.xml
similarity index 100%
rename from v7/appcompat/tests/res/font/samplexmldownloadedfont.xml
rename to v7/appcompat/src/androidTest/res/font/samplexmldownloadedfont.xml
diff --git a/v7/appcompat/tests/res/font/samplexmlfont.xml b/v7/appcompat/src/androidTest/res/font/samplexmlfont.xml
similarity index 100%
rename from v7/appcompat/tests/res/font/samplexmlfont.xml
rename to v7/appcompat/src/androidTest/res/font/samplexmlfont.xml
diff --git a/v7/appcompat/tests/res/layout/activity_night_mode.xml b/v7/appcompat/src/androidTest/res/layout/activity_night_mode.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/activity_night_mode.xml
rename to v7/appcompat/src/androidTest/res/layout/activity_night_mode.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_activity.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_activity.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_custom_title.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_title.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_custom_title.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_title.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_custom_view.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_view.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_custom_view.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_view.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_button_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_button_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_button_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_button_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_button_autosize_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_button_autosize_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_button_autosize_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_button_autosize_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_imagebutton_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_imagebutton_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_imagebutton_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_imagebutton_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_imageview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_imageview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_imageview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_imageview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_inflater_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_inflater_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_inflater_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_inflater_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_radiobutton_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_radiobutton_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_radiobutton_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_radiobutton_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_searchview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_searchview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_searchview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_searchview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_spinner_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_spinner_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_spinner_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_spinner_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_textview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_textview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_textview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_textview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_textview_autosize_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_textview_autosize_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_textview_autosize_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_textview_autosize_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_vectordrawable_integration.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_vectordrawable_integration.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_vectordrawable_integration.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_vectordrawable_integration.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_double_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_double_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_double_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_double_layout.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end_single_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end_single_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end_single_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end_single_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start_single_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start_single_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start_single_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start_single_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_single_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_single_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_single_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_single_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_start_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_start_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_start_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_start_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_layout.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_layout.xml
diff --git a/v7/appcompat/tests/res/layout/layout_actv.xml b/v7/appcompat/src/androidTest/res/layout/layout_actv.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_actv.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_actv.xml
diff --git a/v7/appcompat/tests/res/layout/layout_android_theme.xml b/v7/appcompat/src/androidTest/res/layout/layout_android_theme.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_android_theme.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_android_theme.xml
diff --git a/v7/appcompat/tests/res/layout/layout_android_theme_children.xml b/v7/appcompat/src/androidTest/res/layout/layout_android_theme_children.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_android_theme_children.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_android_theme_children.xml
diff --git a/v7/appcompat/tests/res/layout/layout_app_theme.xml b/v7/appcompat/src/androidTest/res/layout/layout_app_theme.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_app_theme.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_app_theme.xml
diff --git a/v7/appcompat/tests/res/layout/layout_button.xml b/v7/appcompat/src/androidTest/res/layout/layout_button.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_button.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_button.xml
diff --git a/v7/appcompat/tests/res/layout/layout_button_themed_onclick.xml b/v7/appcompat/src/androidTest/res/layout/layout_button_themed_onclick.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_button_themed_onclick.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_button_themed_onclick.xml
diff --git a/v7/appcompat/tests/res/layout/layout_checkbox.xml b/v7/appcompat/src/androidTest/res/layout/layout_checkbox.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_checkbox.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_checkbox.xml
diff --git a/v7/appcompat/tests/res/layout/layout_children.xml b/v7/appcompat/src/androidTest/res/layout/layout_children.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_children.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_children.xml
diff --git a/v7/appcompat/tests/res/layout/layout_contextwrapperparent_imageview_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_contextwrapperparent_imageview_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_contextwrapperparent_imageview_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_contextwrapperparent_imageview_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_edittext.xml b/v7/appcompat/src/androidTest/res/layout/layout_edittext.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_edittext.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_edittext.xml
diff --git a/v7/appcompat/tests/res/layout/layout_imageview_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_imageview_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_imageview_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_imageview_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_mactv.xml b/v7/appcompat/src/androidTest/res/layout/layout_mactv.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_mactv.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_mactv.xml
diff --git a/v7/appcompat/tests/res/layout/layout_radiobutton.xml b/v7/appcompat/src/androidTest/res/layout/layout_radiobutton.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_radiobutton.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_radiobutton.xml
diff --git a/v7/appcompat/tests/res/layout/layout_radiobutton_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_radiobutton_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_radiobutton_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_radiobutton_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_ratingbar.xml b/v7/appcompat/src/androidTest/res/layout/layout_ratingbar.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_ratingbar.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_ratingbar.xml
diff --git a/v7/appcompat/tests/res/layout/layout_spinner.xml b/v7/appcompat/src/androidTest/res/layout/layout_spinner.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_spinner.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_spinner.xml
diff --git a/v7/appcompat/tests/res/layout/popup_test_activity.xml b/v7/appcompat/src/androidTest/res/layout/popup_test_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/popup_test_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/popup_test_activity.xml
diff --git a/v7/appcompat/tests/res/layout/popup_window_item.xml b/v7/appcompat/src/androidTest/res/layout/popup_window_item.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/popup_window_item.xml
rename to v7/appcompat/src/androidTest/res/layout/popup_window_item.xml
diff --git a/v7/appcompat/tests/res/layout/searchview_suggestion_item.xml b/v7/appcompat/src/androidTest/res/layout/searchview_suggestion_item.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/searchview_suggestion_item.xml
rename to v7/appcompat/src/androidTest/res/layout/searchview_suggestion_item.xml
diff --git a/v7/appcompat/tests/res/layout/textview_autosize_maxlines.xml b/v7/appcompat/src/androidTest/res/layout/textview_autosize_maxlines.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/textview_autosize_maxlines.xml
rename to v7/appcompat/src/androidTest/res/layout/textview_autosize_maxlines.xml
diff --git a/v7/appcompat/tests/res/layout/toolbar_decor_content.xml b/v7/appcompat/src/androidTest/res/layout/toolbar_decor_content.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/toolbar_decor_content.xml
rename to v7/appcompat/src/androidTest/res/layout/toolbar_decor_content.xml
diff --git a/v7/appcompat/tests/res/layout/window_decor_content.xml b/v7/appcompat/src/androidTest/res/layout/window_decor_content.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/window_decor_content.xml
rename to v7/appcompat/src/androidTest/res/layout/window_decor_content.xml
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml b/v7/appcompat/src/androidTest/res/menu/appcompat_menu_icon_tinting.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml
rename to v7/appcompat/src/androidTest/res/menu/appcompat_menu_icon_tinting.xml
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml b/v7/appcompat/src/androidTest/res/menu/appcompat_menu_shortcut.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml
rename to v7/appcompat/src/androidTest/res/menu/appcompat_menu_shortcut.xml
diff --git a/v7/appcompat/tests/res/menu/popup_menu.xml b/v7/appcompat/src/androidTest/res/menu/popup_menu.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/popup_menu.xml
rename to v7/appcompat/src/androidTest/res/menu/popup_menu.xml
diff --git a/v7/appcompat/tests/res/menu/sample_actions.xml b/v7/appcompat/src/androidTest/res/menu/sample_actions.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/sample_actions.xml
rename to v7/appcompat/src/androidTest/res/menu/sample_actions.xml
diff --git a/v7/appcompat/tests/res/menu/shortcut.xml b/v7/appcompat/src/androidTest/res/menu/shortcut.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/shortcut.xml
rename to v7/appcompat/src/androidTest/res/menu/shortcut.xml
diff --git a/v7/appcompat/tests/res/values-night/colors.xml b/v7/appcompat/src/androidTest/res/values-night/colors.xml
similarity index 100%
rename from v7/appcompat/tests/res/values-night/colors.xml
rename to v7/appcompat/src/androidTest/res/values-night/colors.xml
diff --git a/v7/appcompat/tests/res/values-night/strings.xml b/v7/appcompat/src/androidTest/res/values-night/strings.xml
similarity index 100%
rename from v7/appcompat/tests/res/values-night/strings.xml
rename to v7/appcompat/src/androidTest/res/values-night/strings.xml
diff --git a/v7/appcompat/tests/res/values/arrays.xml b/v7/appcompat/src/androidTest/res/values/arrays.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/arrays.xml
rename to v7/appcompat/src/androidTest/res/values/arrays.xml
diff --git a/v7/appcompat/tests/res/values/colors.xml b/v7/appcompat/src/androidTest/res/values/colors.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/colors.xml
rename to v7/appcompat/src/androidTest/res/values/colors.xml
diff --git a/v7/appcompat/tests/res/values/dimens.xml b/v7/appcompat/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/dimens.xml
rename to v7/appcompat/src/androidTest/res/values/dimens.xml
diff --git a/v7/appcompat/tests/res/values/ids.xml b/v7/appcompat/src/androidTest/res/values/ids.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/ids.xml
rename to v7/appcompat/src/androidTest/res/values/ids.xml
diff --git a/v7/appcompat/tests/res/values/strings.xml b/v7/appcompat/src/androidTest/res/values/strings.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/strings.xml
rename to v7/appcompat/src/androidTest/res/values/strings.xml
diff --git a/v7/appcompat/tests/res/values/styles.xml b/v7/appcompat/src/androidTest/res/values/styles.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/styles.xml
rename to v7/appcompat/src/androidTest/res/values/styles.xml
diff --git a/v7/appcompat/tests/NO_DOCS b/v7/appcompat/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/appcompat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index ae8bac0..329cb00 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -14,12 +14,6 @@
androidTestImplementation(ESPRESSO_CORE)
}
-android {
- sourceSets {
- main.res.srcDir 'res'
- }
-}
-
supportLibrary {
name = "Android Support Grid Layout"
publish = true
@@ -27,5 +21,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2013"
description = "Android Support Grid Layout"
- legacySourceLocation = true
}
diff --git a/v7/gridlayout/tests/AndroidManifest.xml b/v7/gridlayout/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/gridlayout/tests/AndroidManifest.xml
rename to v7/gridlayout/src/androidTest/AndroidManifest.xml
diff --git a/v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTest.java b/v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTest.java
similarity index 100%
rename from v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTest.java
rename to v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTest.java
diff --git a/v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTestActivity.java b/v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTestActivity.java
similarity index 100%
rename from v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTestActivity.java
rename to v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTestActivity.java
diff --git a/v7/gridlayout/tests/res/layout/fill_horizontal_test.xml b/v7/gridlayout/src/androidTest/res/layout/fill_horizontal_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/fill_horizontal_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/fill_horizontal_test.xml
diff --git a/v7/gridlayout/tests/res/layout/height_wrap_content_test.xml b/v7/gridlayout/src/androidTest/res/layout/height_wrap_content_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/height_wrap_content_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/height_wrap_content_test.xml
diff --git a/v7/gridlayout/tests/res/layout/make_view_gone_test.xml b/v7/gridlayout/src/androidTest/res/layout/make_view_gone_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/make_view_gone_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/make_view_gone_test.xml
diff --git a/v7/gridlayout/tests/res/layout/use_default_margin_test.xml b/v7/gridlayout/src/androidTest/res/layout/use_default_margin_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/use_default_margin_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/use_default_margin_test.xml
diff --git a/v7/gridlayout/tests/res/values/colors.xml b/v7/gridlayout/src/androidTest/res/values/colors.xml
similarity index 100%
rename from v7/gridlayout/tests/res/values/colors.xml
rename to v7/gridlayout/src/androidTest/res/values/colors.xml
diff --git a/v7/gridlayout/res/values/attrs.xml b/v7/gridlayout/src/main/res/values/attrs.xml
similarity index 100%
rename from v7/gridlayout/res/values/attrs.xml
rename to v7/gridlayout/src/main/res/values/attrs.xml
diff --git a/v7/gridlayout/res/values/dimens.xml b/v7/gridlayout/src/main/res/values/dimens.xml
similarity index 100%
rename from v7/gridlayout/res/values/dimens.xml
rename to v7/gridlayout/src/main/res/values/dimens.xml
diff --git a/v7/gridlayout/tests/NO_DOCS b/v7/gridlayout/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/v7/gridlayout/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index eb25488..f28938b 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -34,5 +34,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2013"
description = "Android MediaRouter Support Library"
- legacySourceLocation = true
}
diff --git a/v7/mediarouter/tests/AndroidManifest.xml b/v7/mediarouter/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/mediarouter/tests/AndroidManifest.xml
rename to v7/mediarouter/src/androidTest/AndroidManifest.xml
diff --git a/v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTestActivity.java b/v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/MediaRouteProviderTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouteProviderTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/MediaRouteProviderTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouteProviderTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/MediaRouterTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouterTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/MediaRouterTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouterTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/TestUtils.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/TestUtils.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/TestUtils.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/TestUtils.java
diff --git a/v7/mediarouter/tests/res/layout/mr_chooser_dialog_activity.xml b/v7/mediarouter/src/androidTest/res/layout/mr_chooser_dialog_activity.xml
similarity index 100%
rename from v7/mediarouter/tests/res/layout/mr_chooser_dialog_activity.xml
rename to v7/mediarouter/src/androidTest/res/layout/mr_chooser_dialog_activity.xml
diff --git a/v7/mediarouter/tests/res/values/themes.xml b/v7/mediarouter/src/androidTest/res/values/themes.xml
similarity index 100%
rename from v7/mediarouter/tests/res/values/themes.xml
rename to v7/mediarouter/src/androidTest/res/values/themes.xml
diff --git a/v7/mediarouter/tests/NO_DOCS b/v7/mediarouter/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/v7/mediarouter/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/palette/src/androidTest/NO_DOCS b/v7/palette/src/androidTest/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/palette/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index 860679c..7707883 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -53,5 +53,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2015"
description = "Android Support Preference v7"
- legacySourceLocation = true
}
diff --git a/v7/preference/tests/AndroidManifest.xml b/v7/preference/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/preference/tests/AndroidManifest.xml
rename to v7/preference/src/androidTest/AndroidManifest.xml
diff --git a/v7/preference/tests/src/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceDataStoreTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceDataStoreTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceDataStoreTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceDataStoreTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceIconSpaceTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceParentGroupTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceParentGroupTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceParentGroupTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceParentGroupTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferencePersistTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferencePersistTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferencePersistTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferencePersistTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/helpers/PreferenceWrapper.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
diff --git a/v7/preference/tests/NO_DOCS b/v7/preference/tests/NO_DOCS
deleted file mode 100644
index db956bc..0000000
--- a/v7/preference/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index b172a01..e58e5b1 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -42,5 +42,4 @@
mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2014"
description = "Android Support RecyclerView v7"
- legacySourceLocation = true
}
diff --git a/v7/recyclerview/tests/AndroidManifest.xml b/v7/recyclerview/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/recyclerview/tests/AndroidManifest.xml
rename to v7/recyclerview/src/androidTest/AndroidManifest.xml
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/test/CustomLayoutManager.java b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/CustomLayoutManager.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/test/CustomLayoutManager.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/CustomLayoutManager.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/test/PrivateLayoutManager.java b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/PrivateLayoutManager.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/test/PrivateLayoutManager.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/PrivateLayoutManager.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/AsyncListUtilTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/AsyncListUtilTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/MessageQueueTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/MessageQueueTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/MessageQueueTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/MessageQueueTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/ThreadUtilTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/ThreadUtilTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/TileListTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/TileListTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/TileListTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/TileListTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/TouchUtils.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/TouchUtils.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/AsyncListUtilLayoutTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/AsyncListUtilLayoutTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/AttachDetachCollector.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/AttachDetachCollector.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseLinearLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseLinearLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseLinearLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseLinearLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BucketTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BucketTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BucketTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BucketTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/CacheUtils.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/CacheUtils.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/CacheUtils.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/CacheUtils.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ChildHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ChildHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ChildHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ChildHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/CustomEdgeEffectTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/CustomEdgeEffectTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultItemAnimatorTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultItemAnimatorTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultMeasureSpecTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultMeasureSpecTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DefaultMeasureSpecTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultMeasureSpecTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DividerItemDecorationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DividerItemDecorationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DummyItemAnimator.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DummyItemAnimator.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DummyItemAnimator.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DummyItemAnimator.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/FocusSearchNavigationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/FocusSearchNavigationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GapWorkerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GapWorkerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GapWorkerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GapWorkerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerRtlTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerRtlTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/InfoStoreTrojan.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/InfoStoreTrojan.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/InfoStoreTrojan.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/InfoStoreTrojan.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ItemAnimatorV2ApiTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ItemAnimatorV2ApiTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerResizeTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerResizeTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerResizeTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerResizeTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LoggingItemAnimator.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LoggingItemAnimator.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LoggingItemAnimator.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LoggingItemAnimator.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/PagerSnapHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/PagerSnapHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/PagerSnapHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/PagerSnapHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecycledViewPoolTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecycledViewPoolTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecycledViewPoolTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecycledViewPoolTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAnimationsTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAnimationsTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewBasicTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewBasicTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFastScrollerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFastScrollerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewLayoutTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewLayoutTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewPrefetchTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewPrefetchTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewPrefetchTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewPrefetchTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestActivity.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestActivity.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestActivity.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestActivity.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestedFrameLayout.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestedFrameLayout.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestedFrameLayout.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestedFrameLayout.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ViewBoundsCheckTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ViewBoundsCheckTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ViewBoundsCheckTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ViewBoundsCheckTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrapContentBasicTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrapContentBasicTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/WrappedRecyclerView.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrappedRecyclerView.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/WrappedRecyclerView.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrappedRecyclerView.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/helper/ItemTouchHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/helper/ItemTouchHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/NestedScrollingParent2Adapter.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTestActivity.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTestActivity.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTestActivity.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTestActivity.java
diff --git a/v7/recyclerview/tests/res/drawable/fast_scroll_thumb_drawable.xml b/v7/recyclerview/src/androidTest/res/drawable/fast_scroll_thumb_drawable.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/fast_scroll_thumb_drawable.xml
rename to v7/recyclerview/src/androidTest/res/drawable/fast_scroll_thumb_drawable.xml
diff --git a/v7/recyclerview/tests/res/drawable/fast_scroll_track_drawable.xml b/v7/recyclerview/src/androidTest/res/drawable/fast_scroll_track_drawable.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/fast_scroll_track_drawable.xml
rename to v7/recyclerview/src/androidTest/res/drawable/fast_scroll_track_drawable.xml
diff --git a/v7/recyclerview/tests/res/drawable/item_bg.xml b/v7/recyclerview/src/androidTest/res/drawable/item_bg.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/item_bg.xml
rename to v7/recyclerview/src/androidTest/res/drawable/item_bg.xml
diff --git a/v7/recyclerview/tests/res/layout/fast_scrollbar_test_rv.xml b/v7/recyclerview/src/androidTest/res/layout/fast_scrollbar_test_rv.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/fast_scrollbar_test_rv.xml
rename to v7/recyclerview/src/androidTest/res/layout/fast_scrollbar_test_rv.xml
diff --git a/v7/recyclerview/tests/res/layout/focus_search_activity.xml b/v7/recyclerview/src/androidTest/res/layout/focus_search_activity.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/focus_search_activity.xml
rename to v7/recyclerview/src/androidTest/res/layout/focus_search_activity.xml
diff --git a/v7/recyclerview/tests/res/layout/focus_test_item_view.xml b/v7/recyclerview/src/androidTest/res/layout/focus_test_item_view.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/focus_test_item_view.xml
rename to v7/recyclerview/src/androidTest/res/layout/focus_test_item_view.xml
diff --git a/v7/recyclerview/tests/res/layout/inflation_test.xml b/v7/recyclerview/src/androidTest/res/layout/inflation_test.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/inflation_test.xml
rename to v7/recyclerview/src/androidTest/res/layout/inflation_test.xml
diff --git a/v7/recyclerview/tests/res/layout/item_view.xml b/v7/recyclerview/src/androidTest/res/layout/item_view.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/item_view.xml
rename to v7/recyclerview/src/androidTest/res/layout/item_view.xml
diff --git a/v7/recyclerview/tests/res/layout/wrapped_test_rv.xml b/v7/recyclerview/src/androidTest/res/layout/wrapped_test_rv.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/wrapped_test_rv.xml
rename to v7/recyclerview/src/androidTest/res/layout/wrapped_test_rv.xml
diff --git a/v7/recyclerview/tests/res/values/styles.xml b/v7/recyclerview/src/androidTest/res/values/styles.xml
similarity index 100%
rename from v7/recyclerview/tests/res/values/styles.xml
rename to v7/recyclerview/src/androidTest/res/values/styles.xml
diff --git a/v7/recyclerview/src/test/NO_DOCS b/v7/recyclerview/src/test/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/recyclerview/src/test/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/recyclerview/tests/NO_DOCS b/v7/recyclerview/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/recyclerview/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/viewpager/api/current.txt b/viewpager/api/current.txt
new file mode 100644
index 0000000..31baf49
--- /dev/null
+++ b/viewpager/api/current.txt
@@ -0,0 +1,125 @@
+package android.support.v4.view {
+
+ public abstract class PagerAdapter {
+ ctor public PagerAdapter();
+ method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+ method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
+ method public void finishUpdate(android.view.ViewGroup);
+ method public deprecated void finishUpdate(android.view.View);
+ method public abstract int getCount();
+ method public int getItemPosition(java.lang.Object);
+ method public java.lang.CharSequence getPageTitle(int);
+ method public float getPageWidth(int);
+ method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
+ method public deprecated java.lang.Object instantiateItem(android.view.View, int);
+ method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
+ method public void notifyDataSetChanged();
+ method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+ method public android.os.Parcelable saveState();
+ method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+ method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
+ method public void startUpdate(android.view.ViewGroup);
+ method public deprecated void startUpdate(android.view.View);
+ method public void unregisterDataSetObserver(android.database.DataSetObserver);
+ field public static final int POSITION_NONE = -2; // 0xfffffffe
+ field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
+ }
+
+ public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
+ ctor public PagerTabStrip(android.content.Context);
+ ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
+ method public boolean getDrawFullUnderline();
+ method public int getTabIndicatorColor();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setDrawFullUnderline(boolean);
+ method public void setTabIndicatorColor(int);
+ method public void setTabIndicatorColorResource(int);
+ }
+
+ public class PagerTitleStrip extends android.view.ViewGroup {
+ ctor public PagerTitleStrip(android.content.Context);
+ ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
+ method public int getTextSpacing();
+ method public void setGravity(int);
+ method public void setNonPrimaryAlpha(float);
+ method public void setTextColor(int);
+ method public void setTextSize(int, float);
+ method public void setTextSpacing(int);
+ }
+
+ public class ViewPager extends android.view.ViewGroup {
+ ctor public ViewPager(android.content.Context);
+ ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+ method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+ method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+ method public boolean arrowScroll(int);
+ method public boolean beginFakeDrag();
+ method protected boolean canScroll(android.view.View, boolean, int, int, int);
+ method public void clearOnPageChangeListeners();
+ method public void endFakeDrag();
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fakeDragBy(float);
+ method public android.support.v4.view.PagerAdapter getAdapter();
+ method public int getCurrentItem();
+ method public int getOffscreenPageLimit();
+ method public int getPageMargin();
+ method public boolean isFakeDragging();
+ method protected void onPageScrolled(int, float, int);
+ method public void onRestoreInstanceState(android.os.Parcelable);
+ method public android.os.Parcelable onSaveInstanceState();
+ method public void removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+ method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+ method public void setAdapter(android.support.v4.view.PagerAdapter);
+ method public void setCurrentItem(int);
+ method public void setCurrentItem(int, boolean);
+ method public void setOffscreenPageLimit(int);
+ method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+ method public void setPageMargin(int);
+ method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
+ method public void setPageMarginDrawable(int);
+ method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
+ method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
+ field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+ field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+ field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+ }
+
+ public static abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
+ }
+
+ public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
+ ctor public ViewPager.LayoutParams();
+ ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
+ field public int gravity;
+ field public boolean isDecor;
+ }
+
+ public static abstract interface ViewPager.OnAdapterChangeListener {
+ method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
+ }
+
+ public static abstract interface ViewPager.OnPageChangeListener {
+ method public abstract void onPageScrollStateChanged(int);
+ method public abstract void onPageScrolled(int, float, int);
+ method public abstract void onPageSelected(int);
+ }
+
+ public static abstract interface ViewPager.PageTransformer {
+ method public abstract void transformPage(android.view.View, float);
+ }
+
+ public static class ViewPager.SavedState extends android.support.v4.view.AbsSavedState {
+ ctor public ViewPager.SavedState(android.os.Parcelable);
+ field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
+ }
+
+ public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+ ctor public ViewPager.SimpleOnPageChangeListener();
+ method public void onPageScrollStateChanged(int);
+ method public void onPageScrolled(int, float, int);
+ method public void onPageSelected(int);
+ }
+
+}
+
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
new file mode 100644
index 0000000..fdf3b29
--- /dev/null
+++ b/viewpager/build.gradle
@@ -0,0 +1,27 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(":support-compat"))
+ api(project(":customview"))
+
+ androidTestImplementation(TEST_RUNNER)
+ androidTestImplementation(ESPRESSO_CORE)
+ androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+ androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+}
+
+supportLibrary {
+ name = "Android Support Library View Pager"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
+ inceptionYear = "2018"
+ 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 14 or later."
+}
diff --git a/core-ui/tests/AndroidManifest.xml b/viewpager/src/androidTest/AndroidManifest.xml
similarity index 70%
copy from core-ui/tests/AndroidManifest.xml
copy to viewpager/src/androidTest/AndroidManifest.xml
index 4ea7691..d7fd2e6 100644
--- a/core-ui/tests/AndroidManifest.xml
+++ b/viewpager/src/androidTest/AndroidManifest.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.support.coreui.test">
+ package="android.support.viewpager.test">
<uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
<uses-permission android:name="android.permission.VIBRATE"/>
@@ -26,13 +26,6 @@
<application
android:supportsRtl="true"
android:theme="@style/TestActivityTheme">
- <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
-
- <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
-
- <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
-
- <activity android:name="android.support.v4.widget.ContentLoadingProgressBarActivity"/>
<activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
@@ -40,10 +33,6 @@
<activity android:name="android.support.v4.view.ViewPagerTest$ViewPagerActivity"/>
- <activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
-
- <activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
-
</application>
</manifest>
diff --git a/compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
copy to viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseTestActivity.java
copy to viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/compat/tests/java/android/support/v4/testutils/TestUtils.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
copy from compat/tests/java/android/support/v4/testutils/TestUtils.java
copy to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsAssertions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
rename to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsAssertions.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
rename to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
diff --git a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
similarity index 99%
rename from core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
index f26942b..7803ea2 100644
--- a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
@@ -61,7 +61,7 @@
import android.app.Activity;
import android.graphics.Color;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.EspressoKey;
import android.support.test.filters.FlakyTest;
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerActions.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerActions.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerActions.java
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerTest.java
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
index 55fd51e..487a1af 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
@@ -18,7 +18,7 @@
import android.app.Activity;
import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
import android.view.WindowManager;
public class ViewPagerWithTabStripActivity extends Activity {
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
index cd26461..b7ca014 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
@@ -15,7 +15,7 @@
*/
package android.support.v4.view;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
index e5a62a1..8aa295f 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
@@ -18,7 +18,7 @@
import android.app.Activity;
import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
import android.view.WindowManager;
public class ViewPagerWithTitleStripActivity extends Activity {
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
index d54992c..044d9cd 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
@@ -15,7 +15,7 @@
*/
package android.support.v4.view;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
diff --git a/core-ui/tests/res/layout/view_pager_with_tab_strip.xml b/viewpager/src/androidTest/res/layout/view_pager_with_tab_strip.xml
similarity index 100%
rename from core-ui/tests/res/layout/view_pager_with_tab_strip.xml
rename to viewpager/src/androidTest/res/layout/view_pager_with_tab_strip.xml
diff --git a/core-ui/tests/res/layout/view_pager_with_title_strip.xml b/viewpager/src/androidTest/res/layout/view_pager_with_title_strip.xml
similarity index 100%
rename from core-ui/tests/res/layout/view_pager_with_title_strip.xml
rename to viewpager/src/androidTest/res/layout/view_pager_with_title_strip.xml
diff --git a/core-ui/tests/res/values/ids.xml b/viewpager/src/androidTest/res/values/ids.xml
similarity index 96%
rename from core-ui/tests/res/values/ids.xml
rename to viewpager/src/androidTest/res/values/ids.xml
index f3ac9b4..e5fcf63 100644
--- a/core-ui/tests/res/values/ids.xml
+++ b/viewpager/src/androidTest/res/values/ids.xml
@@ -24,5 +24,4 @@
<item name="page_7" type="id"/>
<item name="page_8" type="id"/>
<item name="page_9" type="id"/>
- <item name="anchor" type="id"/>
</resources>
\ No newline at end of file
diff --git a/core-ui/tests/res/values/styles.xml b/viewpager/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to viewpager/src/androidTest/res/values/styles.xml
diff --git a/viewpager/src/main/AndroidManifest.xml b/viewpager/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..feb8a03
--- /dev/null
+++ b/viewpager/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="android.support.viewpager" />
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerAdapter.java b/viewpager/src/main/java/android/support/v4/view/PagerAdapter.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerAdapter.java
rename to viewpager/src/main/java/android/support/v4/view/PagerAdapter.java
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java b/viewpager/src/main/java/android/support/v4/view/PagerTabStrip.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java
rename to viewpager/src/main/java/android/support/v4/view/PagerTabStrip.java
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java b/viewpager/src/main/java/android/support/v4/view/PagerTitleStrip.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java
rename to viewpager/src/main/java/android/support/v4/view/PagerTitleStrip.java
diff --git a/core-ui/src/main/java/android/support/v4/view/ViewPager.java b/viewpager/src/main/java/android/support/v4/view/ViewPager.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/ViewPager.java
rename to viewpager/src/main/java/android/support/v4/view/ViewPager.java
diff --git a/wear/src/androidTest/NO_DOCS b/wear/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/wear/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
new file mode 100644
index 0000000..b0d66d6
--- /dev/null
+++ b/webkit/api/current.txt
@@ -0,0 +1,12 @@
+package androidx.webkit {
+
+ public class WebViewCompat {
+ method public static void postVisualStateCallback(android.webkit.WebView, long, androidx.webkit.WebViewCompat.VisualStateCallback);
+ }
+
+ public static abstract interface WebViewCompat.VisualStateCallback {
+ method public abstract void onComplete(long);
+ }
+
+}
+
diff --git a/webkit/build.gradle b/webkit/build.gradle
index e4fff11..7975fc8 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -13,20 +13,39 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-apply plugin: android.support.SupportAndroidLibraryPlugin
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+ api(project(":support-annotations"))
+ api(project(':support-compat'))
+
+ androidTestImplementation(TEST_RUNNER)
+}
+
+ext {
+ webviewBoundaryInterfacesDir = project(':webview-support-interfaces').projectDir
+}
android {
- defaultConfig {
- minSdkVersion 21
- }
-
sourceSets {
- main.manifest.srcFile 'AndroidManifest.xml'
+ // Allow compiling the WebView support library boundary interfaces from this project.
+ main.java.srcDirs += new File(webviewBoundaryInterfacesDir, "src").getAbsolutePath()
}
}
supportLibrary {
name = "WebView Support Library"
+ publish = true
+ mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+ mavenGroup = LibraryGroups.SUPPORT
inceptionYear = "2017"
description = "The WebView Support Library is a static library you can add to your Android application in order to use android.webkit APIs that are not available for older platform versions."
+ minSdkVersion = 21
}
diff --git a/webkit/src/androidTest/AndroidManifest.xml b/webkit/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..6448148
--- /dev/null
+++ b/webkit/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.webkit">
+ <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+</manifest>
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
new file mode 100644
index 0000000..8b38d99
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.BuildCompat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+public class WebViewCompatTest {
+ WebViewOnUiThread mWebViewOnUiThread;
+
+ private static final long TEST_TIMEOUT = 20000L;
+
+ @Before
+ public void setUp() {
+ mWebViewOnUiThread = new androidx.webkit.WebViewOnUiThread();
+ }
+
+ @MediumTest
+ @Test
+ public void testVisualStateCallbackCalled() throws Exception {
+ // TODO(gsennton) activate this test for pre-P devices when we can pre-install a WebView APK
+ // containing support for the WebView Support Library, see b/73454652.
+ if (!BuildCompat.isAtLeastP()) return;
+
+ final CountDownLatch callbackLatch = new CountDownLatch(1);
+ final long kRequest = 100;
+
+ mWebViewOnUiThread.loadUrl("about:blank");
+
+ mWebViewOnUiThread.postVisualStateCallbackCompat(kRequest,
+ new WebViewCompat.VisualStateCallback() {
+ public void onComplete(long requestId) {
+ assertEquals(kRequest, requestId);
+ callbackLatch.countDown();
+ }
+ });
+
+ assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+ }
+
+ @MediumTest
+ @Test
+ public void testCheckThread() {
+ try {
+ WebViewCompat.postVisualStateCallback(mWebViewOnUiThread.getWebViewOnCurrentThread(), 5,
+ new WebViewCompat.VisualStateCallback() {
+ @Override
+ public void onComplete(long requestId) {
+ }
+ });
+ } catch (RuntimeException e) {
+ return;
+ }
+ fail("Calling a WebViewCompat method on the wrong thread must cause a run-time exception");
+ }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
new file mode 100644
index 0000000..6219bd3
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit;
+
+import android.support.test.InstrumentationRegistry;
+import android.webkit.WebView;
+
+public class WebViewOnUiThread {
+ private WebView mWebView;
+
+ public WebViewOnUiThread() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mWebView = new WebView(InstrumentationRegistry.getTargetContext());
+ }
+ });
+ }
+
+ public void loadUrl(final String url) {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url);
+ }
+ });
+ }
+
+ public void postVisualStateCallbackCompat(final long requestId,
+ final WebViewCompat.VisualStateCallback callback) {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ WebViewCompat.postVisualStateCallback(mWebView, requestId, callback);
+ }
+ });
+ }
+
+ public WebView getWebViewOnCurrentThread() {
+ return mWebView;
+ }
+}
diff --git a/webkit/AndroidManifest.xml b/webkit/src/main/AndroidManifest.xml
similarity index 100%
rename from webkit/AndroidManifest.xml
rename to webkit/src/main/AndroidManifest.xml
diff --git a/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
new file mode 100644
index 0000000..3141918
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit;
+
+import android.os.Build;
+import android.os.Looper;
+import android.support.annotation.NonNull;
+import android.support.v4.os.BuildCompat;
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import androidx.webkit.internal.WebViewGlueCommunicator;
+import androidx.webkit.internal.WebViewProviderAdapter;
+import androidx.webkit.internal.WebViewProviderFactoryAdapter;
+
+/**
+ * Compatibility version of {@link android.webkit.WebView}
+ */
+public class WebViewCompat {
+ private WebViewCompat() {} // Don't allow instances of this class to be constructed.
+
+ /**
+ * Callback interface supplied to {@link #postVisualStateCallback} for receiving
+ * notifications about the visual state.
+ */
+ public interface VisualStateCallback {
+ /**
+ * Invoked when the visual state is ready to be drawn in the next {@link WebView#onDraw}.
+ *
+ * @param requestId The identifier passed to {@link #postVisualStateCallback} when this
+ * callback was posted.
+ */
+ void onComplete(long requestId);
+ }
+
+ /**
+ * Posts a {@link VisualStateCallback}, which will be called when
+ * the current state of the WebView is ready to be drawn.
+ *
+ * <p>Because updates to the DOM are processed asynchronously, updates to the DOM may not
+ * immediately be reflected visually by subsequent {@link WebView#onDraw} invocations. The
+ * {@link VisualStateCallback} provides a mechanism to notify the caller when the contents
+ * of the DOM at the current time are ready to be drawn the next time the {@link WebView} draws.
+ *
+ * <p>The next draw after the callback completes is guaranteed to reflect all the updates to the
+ * DOM up to the point at which the {@link VisualStateCallback} was posted, but it may
+ * also contain updates applied after the callback was posted.
+ *
+ * <p>The state of the DOM covered by this API includes the following:
+ * <ul>
+ * <li>primitive HTML elements (div, img, span, etc..)</li>
+ * <li>images</li>
+ * <li>CSS animations</li>
+ * <li>WebGL</li>
+ * <li>canvas</li>
+ * </ul>
+ * It does not include the state of:
+ * <ul>
+ * <li>the video tag</li>
+ * </ul>
+ *
+ * <p>To guarantee that the {@link WebView} will successfully render the first frame
+ * after the {@link VisualStateCallback#onComplete} method has been called a set of
+ * conditions must be met:
+ * <ul>
+ * <li>If the {@link WebView}'s visibility is set to {@link android.view.View#VISIBLE VISIBLE}
+ * then * the {@link WebView} must be attached to the view hierarchy.</li>
+ * <li>If the {@link WebView}'s visibility is set to
+ * {@link android.view.View#INVISIBLE INVISIBLE} then the {@link WebView} must be attached to
+ * the view hierarchy and must be made {@link android.view.View#VISIBLE VISIBLE} from the
+ * {@link VisualStateCallback#onComplete} method.</li>
+ * <li>If the {@link WebView}'s visibility is set to {@link android.view.View#GONE GONE} then
+ * the {@link WebView} must be attached to the view hierarchy and its
+ * {@link android.widget.AbsoluteLayout.LayoutParams LayoutParams}'s width and height need to be
+ * set to fixed values and must be made {@link android.view.View#VISIBLE VISIBLE} from the
+ * {@link VisualStateCallback#onComplete} method.</li>
+ * </ul>
+ *
+ * <p>When using this API it is also recommended to enable pre-rasterization if the {@link
+ * WebView} is off screen to avoid flickering. See
+ * {@link android.webkit.WebSettings#setOffscreenPreRaster} for more details and do consider its
+ * caveats.
+ *
+ * @param requestId An id that will be returned in the callback to allow callers to match
+ * requests with callbacks.
+ * @param callback The callback to be invoked.
+ */
+ public static void postVisualStateCallback(@NonNull WebView webview, long requestId,
+ @NonNull final VisualStateCallback callback) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ webview.postVisualStateCallback(requestId,
+ new android.webkit.WebView.VisualStateCallback() {
+ @Override
+ public void onComplete(long l) {
+ callback.onComplete(l);
+ }
+ });
+ } else {
+ // TODO(gsennton): guard with if WebViewApk.hasFeature(POSTVISUALSTATECALLBACK)
+ checkThread(webview);
+ getProvider(webview).insertVisualStateCallback(requestId, callback);
+ }
+ }
+
+ private static WebViewProviderAdapter getProvider(WebView webview) {
+ return new WebViewProviderAdapter(createProvider(webview));
+ }
+
+ private static WebViewProviderFactoryAdapter getFactory() {
+ return WebViewGlueCommunicator.getFactory();
+ }
+
+ private static WebViewProviderBoundaryInterface createProvider(WebView webview) {
+ return getFactory().createWebView(webview);
+ }
+
+ @SuppressWarnings("NewApi")
+ private static void checkThread(WebView webview) {
+ if (BuildCompat.isAtLeastP()) {
+ if (webview.getLooper() != Looper.myLooper()) {
+ throw new RuntimeException("A WebView method was called on thread '"
+ + Thread.currentThread().getName() + "'. "
+ + "All WebView methods must be called on the same thread. "
+ + "(Expected Looper " + webview.getLooper() + " called on "
+ + Looper.myLooper() + ", FYI main Looper is " + Looper.getMainLooper()
+ + ")");
+ }
+ } else {
+ try {
+ Method checkThreadMethod = WebView.class.getDeclaredMethod("checkThread");
+ checkThreadMethod.setAccessible(true);
+ // WebView.checkThread() performs some logging and potentially throws an exception
+ // if WebView is used on the wrong thread.
+ checkThreadMethod.invoke(webview);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java b/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java
new file mode 100644
index 0000000..c6917d8
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit.internal;
+
+import org.chromium.support_lib_boundary.VisualStateCallbackBoundaryInterface;
+
+import androidx.webkit.WebViewCompat;
+
+/**
+ * Adapter between WebViewCompat.VisualStateCallback and VisualStateCallbackBoundaryInterface (the
+ * corresponding interface shared with the support library glue in the WebView APK).
+ */
+public class VisualStateCallbackAdapter implements VisualStateCallbackBoundaryInterface {
+ private WebViewCompat.VisualStateCallback mVisualStateCallback;
+
+ public VisualStateCallbackAdapter(WebViewCompat.VisualStateCallback visualStateCallback) {
+ mVisualStateCallback = visualStateCallback;
+ }
+
+ @Override
+ public void onComplete(long requestId) {
+ mVisualStateCallback.onComplete(requestId);
+ }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
new file mode 100644
index 0000000..f97b2d8
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit.internal;
+
+import android.support.v4.os.BuildCompat;
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Utility class for calling into the WebView APK.
+ */
+public class WebViewGlueCommunicator {
+ private static final String GLUE_FACTORY_PROVIDER_FETCHER_CLASS =
+ "org.chromium.support_lib_glue.SupportLibReflectionUtil";
+ private static final String GLUE_FACTORY_PROVIDER_FETCHER_METHOD =
+ "createWebViewProviderFactory";
+
+ /**
+ * Fetch the one global support library WebViewProviderFactory from the WebView glue layer.
+ */
+ public static WebViewProviderFactoryAdapter getFactory() {
+ return LAZY_FACTORY_HOLDER.INSTANCE;
+ }
+
+ private static class LAZY_FACTORY_HOLDER {
+ static final WebViewProviderFactoryAdapter INSTANCE =
+ new WebViewProviderFactoryAdapter(
+ WebViewGlueCommunicator.createGlueProviderFactory());
+ }
+
+ private static InvocationHandler fetchGlueProviderFactoryImpl() {
+ try {
+ Class<?> glueFactoryProviderFetcherClass = Class.forName(
+ GLUE_FACTORY_PROVIDER_FETCHER_CLASS, false, getWebViewClassLoader());
+ Method createProviderFactoryMethod = glueFactoryProviderFetcherClass.getDeclaredMethod(
+ GLUE_FACTORY_PROVIDER_FETCHER_METHOD);
+ return (InvocationHandler) createProviderFactoryMethod.invoke(null);
+ } catch (IllegalAccessException | InvocationTargetException | ClassNotFoundException
+ | NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static WebViewProviderFactoryBoundaryInterface createGlueProviderFactory() {
+ InvocationHandler invocationHandler = fetchGlueProviderFactoryImpl();
+ return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+ WebViewProviderFactoryBoundaryInterface.class, invocationHandler);
+ }
+
+ /**
+ * Load the WebView code from the WebView APK and return the classloader containing that code.
+ */
+ @SuppressWarnings("NewApi")
+ public static ClassLoader getWebViewClassLoader() {
+ if (BuildCompat.isAtLeastP()) {
+ return WebView.getWebViewClassLoader();
+ } else {
+ return getWebViewProviderFactory().getClass().getClassLoader();
+ }
+ }
+
+ private static Object getWebViewProviderFactory() {
+ try {
+ Method getFactoryMethod = WebView.class.getDeclaredMethod("getFactory");
+ getFactoryMethod.setAccessible(true);
+ return getFactoryMethod.invoke(null);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
new file mode 100644
index 0000000..249d367
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit.internal;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+
+import androidx.webkit.WebViewCompat;
+
+/**
+ * Adapter for WebViewProviderBoundaryInterface providing the functionality expected of
+ * WebViewCompat, this adapter is the support library version of
+ * {@link android.webkit.WebViewProvider}.
+ */
+public class WebViewProviderAdapter {
+ WebViewProviderBoundaryInterface mImpl;
+
+ public WebViewProviderAdapter(WebViewProviderBoundaryInterface impl) {
+ mImpl = impl;
+ }
+
+ /**
+ * Adapter method WebViewCompat.insertVisualStateCallback().
+ */
+ public void insertVisualStateCallback(long requestId,
+ WebViewCompat.VisualStateCallback callback) {
+ mImpl.insertVisualStateCallback(requestId,
+ BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+ new VisualStateCallbackAdapter(callback)));
+ }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
new file mode 100644
index 0000000..d961c09
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.webkit.internal;
+
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
+
+/**
+ * Adapter for WebViewProviderFactoryBoundaryInterface providing static WebView functionality
+ * similar to that provided by {@link android.webkit.WebViewFactoryProvider}.
+ */
+public class WebViewProviderFactoryAdapter {
+ WebViewProviderFactoryBoundaryInterface mImpl;
+
+ public WebViewProviderFactoryAdapter(WebViewProviderFactoryBoundaryInterface impl) {
+ mImpl = impl;
+ }
+
+ /**
+ * Adapter method for creating a new support library version of
+ * {@link android.webkit.WebViewProvider} - the class used to implement
+ * {@link androidx.webkit.WebViewCompat}.
+ */
+ public WebViewProviderBoundaryInterface createWebView(WebView webview) {
+ return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+ WebViewProviderBoundaryInterface.class, mImpl.createWebView(webview));
+ }
+}
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java b/webkit/src/main/java/androidx/webkit/internal/package-info.java
similarity index 60%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
rename to webkit/src/main/java/androidx/webkit/internal/package-info.java
index f9245bc..61a92c9 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
+++ b/webkit/src/main/java/androidx/webkit/internal/package-info.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,14 +14,12 @@
* limitations under the License.
*/
-package android.support.v4.widget;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+package androidx.webkit.internal;
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-public class SwipeRefreshLayoutActivity extends BaseTestActivity {
- @Override
- protected int getContentViewLayoutResId() {
- return R.layout.swipe_refresh_layout_activity;
- }
-}
+import android.support.annotation.RestrictTo;
diff --git a/webkit/tests/NO_DOCS b/webkit/tests/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/webkit/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.